如何使用busybox链接生成initramfs图像?

pin*_*ept 7 linux kernel initramfs busybox cpio

通过回答我之前的问题(谢谢!)而将其定向到 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我了解到busybox 需要一长串链接作为其所有不同命令的别名。有没有办法生成所有这些命令的列表,以便我可以将其添加到我的文件列表中?

或者,我可以使用预构建的目录层次结构切换到方法 1,但我不确定在这种情况下如何创建 /dev 节点。

这两条路径看起来都很混乱。有没有优雅的解决方案?

小智 11

我的 initramfs 中 initscript 的前几行很简单:

busybox --install -s
Run Code Online (Sandbox Code Playgroud)

为您创建符号链接.. 在我的 500Mhz 板上只需要非常少的时间,在非常低的硬件上可能会更长,但可能是可控的。当您更新 BB 时,请记住创建所有正确的链接,从而节省大量问题...


Gil*_*il' 4

生成initramfs的不是内核,而是cpio。因此,您真正需要的是一种构建包含设备、符号链接等的 cpio 存档的方法。

\n\n

方法 2usr/gen_init_cpio在内核构建过程中使用内核源代码树来构建 cpio 存档。这确实是构建 cpio 存档的好方法,而无需先填充本地文件系统(这需要 root 才能创建所有设备,或者使用 fakeroot 或 FUSE 文件系统,我不确定是否已编写该文件系统)已经)。

\n\n

您所缺少的只是生成输入文件作为gen_init_cpio构建步骤。例如在外壳中:

\n\n
INITRAMFS_SOURCE_DIR=/home/brandon/rascal-initramfs\nexec >initramfs_source.txt\necho "dir /bin 755 0 0"\necho "file /bin/busybox $INITRAMFS_SOURCE_DIR/bin/busybox 755 0 0"\nfor x in sh ls cp \xe2\x80\xa6; do echo "slink /bin/$x busybox 777 0 0" done\n# etc \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想反映构建树中存在的 busybox 的符号链接,请使用以下方法(我假设您正在 Linux 上构建):

\n\n
( cd "$INITRAMFS_SOURCE_DIR/bin" &&\n  for x in *; do\n    if [ "$(readlink "$x")" = busybox ]; then\n      echo "slink /bin/$x busybox 777 0 0"\n    fi\n  done )\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是复制所有符号链接的方法:

\n\n
find "$INITRAMFS_SOURCE_DIR" -type l -printf \'slink %p %l 777 0 0\\n\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 busybox,也许你的构建树没有符号链接,而是你想为你编译的每个实用程序创建一个符号链接。我能想到的最简单的方法是查看你的 busybox 构建树中的.*.o.cmd文件:每个生成的命令都有一个。

\n\n
find /path/to/busybox/build/tree -name \'.*.cmd\' -exec sh -c \'\n    for x; do\n      x=${x##*/.}\n      echo "slink /bin/${x%%.*} busybox 777 0 0"\n    done\n\' _ {} +\n
Run Code Online (Sandbox Code Playgroud)\n