系统相关
首页 > 系统相关> > linux – 如何使用busybox链接生成initramfs映像?

linux – 如何使用busybox链接生成initramfs映像?

作者:互联网

通过对my earlier question的回答被引导到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节点.

这两条路都显得凌乱.有一个优雅的解决方案吗?

解决方法:

它不是生成initramfs的内核,它是cpio.所以你真正想要的是一种构建包含设备,符号链接等的cpio存档的方法.

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

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

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
' _ {} +

标签:linux,kernel,busybox,initramfs,cpio
来源: https://codeday.me/bug/20190809/1633400.html