如何使用busybox連結生成initramfs圖像?
通過對我之前的問題的回答(謝謝!)被引導到 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
作為建構步驟。例如在外殼中: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 時創建所有正確的連結……