已被定向到 initramfs 的答案我之前的问题(谢谢!),我一直在努力让 initramfs 正常工作。我现在可以启动内核并进入 shell 提示符,在那里我可以执行 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 存档的方法。
方法 2usr/gen_init_cpio
在内核构建过程中使用内核源代码树来构建 cpio 存档。这确实是构建 cpio 存档的好方法,而无需先填充本地文件系统(这需要 root 才能创建所有设备,或者使用 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,也许你的构建树没有符号链接,而是你想为你编译的每个实用程序创建一个符号链接。我能想到的最简单的方法是查看你的 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
如果您使用 busybox shell (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