如何生成带有 busybox 链接的 initramfs 映像?

如何生成带有 busybox 链接的 initramfs 映像?

已被定向到 initramfs 的答案我之前的问题(谢谢!),我一直在努力让 initramfs 正常工作。我现在可以启动内核并进入 shell 提示符,在那里我可以执行 busybox 命令,这太棒了。

这就是我陷入困境的地方——(至少)有两种生成 initramfs 映像的方法:

  1. 通过向内核传递要压缩的预构建目录层次结构的路径
  2. 通过向内核传递列出要包含的文件的文件名。

第二种方法似乎更干净一些,所以我一直在使用它。

仅供参考,这是迄今为止我的文件列表:

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

相关内容