initramfs로 전달된 답변내 이전 질문(감사합니다!) 저는 initramfs가 제대로 작동하도록 노력해 왔습니다. 이제 커널을 부팅하고 busybox 명령을 실행할 수 있는 쉘 프롬프트로 들어갈 수 있습니다. 정말 멋진 일입니다.
여기서 막히는 부분이 있습니다. initramfs 이미지를 생성하는 방법에는 (적어도) 두 가지가 있습니다.
- 압축할 사전 구축된 디렉터리 계층 구조의 경로를 커널에 전달하여
- 포함할 파일을 커널에 전달하여 나열합니다.
두 번째 방법이 좀 더 깔끔해 보여서 계속 사용하고 있습니다.
참고로 지금까지의 파일 목록은 다음과 같습니다.
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox /home/brandon/rascal-initramfs/bin/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init /home/brandon/rascal-initramfs/init.sh 755 0 0
불행히도 나는 busybox에는 모든 다른 명령에 대한 별칭 역할을 하는 긴 링크 목록이 필요하다는 것을 알게 되었습니다. 파일 목록에 추가할 수 있도록 이러한 모든 명령의 목록을 생성하는 방법이 있습니까?
또는 방법 1로 전환하여 사전 구축된 디렉터리 계층 구조를 사용할 수 있지만 이 경우 /dev 노드를 만드는 방법을 잘 모르겠습니다.
두 길 모두 혼란스러워 보입니다. 우아한 해결책이 있습니까?
답변1
내 initramfs에 있는 initscript의 처음 몇 줄은 간단합니다.
busybox --install -s
당신을 위한 심볼릭 링크를 만들어보세요. 500Mhz 마더보드에서는 시간이 매우 짧고, 하드웨어가 매우 낮은 경우 시간이 더 오래 걸릴 수 있지만 관리가 가능할 수 있습니다. BB를 업데이트할 때 올바른 링크를 모두 생성해야 한다는 점을 기억하세요. 이렇게 하면 많은 문제를 피할 수 있습니다.
답변2
커널에 의해 생성되지 않음파일 시스템 초기화, 그것은CPIO. 따라서 실제로 필요한 것은 장치, 심볼릭 링크 등을 포함하는 cpio 아카이브를 구축하는 방법입니다.
방법 2는 usr/gen_init_cpio
커널 빌드 프로세스 중에 커널 소스 트리를 사용하여 cpio 아카이브를 빌드합니다. 이는 실제로 로컬 파일 시스템을 먼저 채우지 않고 cpio 아카이브를 구축하는 좋은 방법입니다(이 방법을 사용하려면 모든 장치를 생성하려면 루트가 필요하거나 아직 작성되었는지 확실하지 않은 fakeroot 또는 FUSE 파일 시스템을 사용해야 합니다).
누락된 것은 입력 파일을 gen_init_cpio
빌드 단계로 생성하는 것뿐입니다. 예를 들어 쉘에서:
INITRAMFS_SOURCE_DIR=/home/brandon/rascal-initramfs
exec >initramfs_source.txt
echo "dir /bin 755 0 0"
echo "file /bin/busybox $INITRAMFS_SOURCE_DIR/bin/busybox 755 0 0"
for x in sh ls cp …; do echo "slink /bin/$x busybox 777 0 0" done
# etc …
빌드 트리에 존재하는 busybox에 대한 심볼릭 링크를 반영하려면 다음 방법을 사용할 수 있습니다(Linux에서 빌드한다고 가정합니다).
( cd "$INITRAMFS_SOURCE_DIR/bin" &&
for x in *; do
if [ "$(readlink "$x")" = busybox ]; then
echo "slink /bin/$x busybox 777 0 0"
fi
done )
모든 심볼릭 링크를 복사하는 방법은 다음과 같습니다.
find "$INITRAMFS_SOURCE_DIR" -type l -printf 'slink %p %l 777 0 0\n'
busybox의 경우 빌드 트리에 심볼릭 링크가 없고 대신 컴파일하는 각 유틸리티에 대해 심볼릭 링크를 만들고 싶을 수도 있습니다. 제가 생각할 수 있는 가장 쉬운 방법은 .*.o.cmd
비지박스 빌드 트리에서 파일을 보는 것입니다. 생성된 각 명령마다 파일이 하나씩 있습니다.
find /path/to/busybox/build/tree -name '.*.cmd' -exec sh -c '
for x; do
x=${x##*/.}
echo "slink /bin/${x%%.*} busybox 777 0 0"
done
' _ {} +
답변3
비지박스 쉘(ash)을 사용하는 경우 기본 IIRC에 의해 별칭이 명령으로 실행되므로 별칭에 대해 걱정할 필요가 없습니다. 어쨌든 busybox --help
지원되는 명령 목록을 제공하십시오. 내 경우에는 다음과 같습니다.
% busybox --help
BusyBox v1.17.4 (2010-11-25 12:49:55 GMT) multi-call binary.
Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.
Usage: busybox [function] [arguments]...
or: function [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.
Currently defined functions:
[, [[, acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk,
basename, bb, bbconfig, bbsh, beep, blkid, bootchartd, brctl, bunzip2,
bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown,
chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, conspy,
cp, cpio, crond, cryptpw, cttyhack, cut, date, dd, deallocvt, delgroup,
deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg,
dnsdomainname, dos2unix, dpkg-deb, du, dumpkmap, dumpleases, echo, ed,
egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, false,
fbset, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs,
flash_eraseall, flash_lock, flash_unlock, flashcp, flock, free,
freeramdisk, fsck, fsck.minix, fsync, ftpd, fuser, getopt, getty, grep,
gunzip, gzip, halt, hd, hdparm, head, hexdump, hostname, httpd,
hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, init, insmod,
install, ionice, ip, ipaddr, ipcrm, ipcs, iplink, iproute, iprule,
iptunnel, kbd_mode, kill, killall, killall5, klogd, last, length, less,
linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login,
logread, losetup, lpq, lpr, ls, lsattr, lsmod, lspci, lsusb, lzcat,
lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg,
microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix,
mkfs.reiser, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo,
modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice,
nmeter, nohup, nslookup, ntpd, openvt, passwd, patch, pgrep, pidof,
ping, ping6, pipe_progress, pivot_root, pkill, popmaildir, poweroff,
printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead,
readlink, readprofile, realpath, reboot, reformime, renice, reset,
resize, rev, rm, rmdir, rmmod, route, rtcwake, run-parts, runlevel,
runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch,
setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh,
sha1sum, sha256sum, sha512sum, showkey, sleep, smemcap, softlimit,
sort, split, start-stop-daemon, stat, strings, stty, su, sum, sv,
svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail,
tar, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top,
touch, tr, traceroute, traceroute6, true, tty, ttysize, tunctl,
tune2fs, ubiattach, ubidetach, udhcpc, udhcpd, umount, uname,
uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip,
uptime, usleep, vconfig, vi, vlock, volname, wall, watch, watchdog, wc,
wget, which, who, whoami, xargs, xz, xzcat, yes, zcat, zcip
첫 번째 방법의 경우 mknod(1)
명령을 통해 생성합니다. 예를 들어:
# mknod /my/dir/with/initrd/dev/console -m 644 c 5 0
답변4
현재 busybox(예: 1.36.0)는 busybox.links
사용될 때 파일을 생성합니다 make install
. 옵션 2와 함께 사용하여 기호 링크를 생성할 수 있습니다. 당신이 해야 할 일은 반복하는 것뿐입니다:
...
make install
cat "busybox.links" | while read s; do
echo "slink $s /bin/busybox 777 0 0" >> initramfs.conf;
done
cat initramfs.conf