Linux

如何使用busybox連結生成initramfs圖像?

  • March 28, 2011

通過對我之前的問題的回答(謝謝!)被引導到 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 節點。

這兩條路似乎都很混亂。有一個優雅的解決方案嗎?

生成initramfs的不是核心,而是cpio。因此,您真正需要的是一種建構包含設備、符號連結等的 cpio 存檔的方法。

您的方法 2 使用usr/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
' _ {} +

我的 initramfs 中的 initscript 的前幾行很簡單:

busybox --install -s

為您創建符號連結.. 在我的 500Mhz 板上只需要非常少的時間,在非常低的硬體上可能更長,但可能是可管理的。保存一堆問題,記住在更新 BB 時創建所有正確的連結……

引用自:https://unix.stackexchange.com/questions/4698