帶有 initramfs 的 Raspberry Pi 2 自定義核心
我正在嘗試讓自編譯核心與 initramfs 一起執行。它適用於舊覆盆子,但不知何故我無法讓它執行。
我正在嘗試做的事情:載入核心,“執行”initramfs,然後執行一些檢查(系統更新等),最後安裝一個 squashfs 映像並在所述系統上呼叫 switch_root。
但是核心以某種方式拒絕執行 initramfs 的 init。
cmdline.txt
我在/中嘗試了各種設置,config.txt
但它們似乎都不起作用,核心總是等待某個根可用(或失敗VFS: unable to mount root fs on unknown block
)。我假設我缺少一些 cmdline 設置(可能是正確的root=...
.root=/dev/ram0
不起作用)或核心標誌。我目前的 cmdline:dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait
, config.txt:initramfs initramfs.gz followkernel
當我添加
root=/dev/mmcblk0p6 roottype=ext4
整個系統啟動時(我添加到一些 test-linux 以驗證核心本身是否正常工作)。我檢查了核心是用 initramfs 支持 (
BLK_DEV_INITRD=y
) 編譯的,遺憾的是,將 initramfs 編譯到核心映像中不是一個選項。核心(4.1 穩定版)是使用 buildroot 編譯的。核心二進制格式是 zImage (似乎不適用於 vmlinux,螢幕保持黑色)。
我從頭開始,經過數小時的反複試驗,我找到了問題的根源,這基本上只是一些愚蠢的錯誤:我的建構腳本使用絕對路徑生成了 initramfs(例如,不是,
lib/libc.so
但是相反~/Work/project/target/lib/libc.so
),這顯然會導致核心找不到初始init。我學到的一個有趣的教訓是:嵌入式 initramfs 與外部的相比,顯然行為略有不同,即當存在嵌入式 initramfs 時,init 腳本中的 echo 命令等不會被列印。在修補外部 initramfs 時,我忘記刪除嵌入的 init,導致外部 init 被執行(並且只有那個),但沒有列印任何東西。在我刪除了嵌入的 initramfs 之後,它就起作用了。