
自分でコンパイルしたカーネルを initramfs と一緒に実行しようとしています。古い Raspberry では動作していたのですが、なぜか実行できません。
私が正確にやろうとしていることは、カーネルをロードし、initramfs を「実行」していくつかのチェック (システム更新など) を実行し、最後に squashfs イメージをマウントして、そのシステムで switch_root を呼び出すことです。
しかし、カーネルはどういうわけか initramfs の init の実行を拒否します。/ でさまざまな設定を試しましたcmdline.txt
がconfig.txt
、どれも機能していないようで、カーネルは常に何らかのルートが利用可能になるまで待機します (または で失敗します)。コマンドライン設定 (おそらく正しい.が機能しなかった) またはカーネル フラグVFS: unable to mount root fs on unknown block
が不足していると思います。現在のコマンドライン: 、config.txt:root=...
root=/dev/ram0
dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait
initramfs initramfs.gz followkernel
システム全体を追加すると、root=/dev/mmcblk0p6 roottype=ext4
(カーネル自体が動作することを確認するために追加したいくつかのテスト Linux に)起動します。
カーネルが initramfs サポート ( BLK_DEV_INITRD=y
) 付きでコンパイルされていることを確認しましたが、残念ながら initramfs をカーネル イメージにコンパイルすることはできません。カーネル (4.1 安定版) は buildroot を使用してコンパイルされています。カーネルのバイナリ形式は zImage です (vmlinux では動作しないようで、画面は黒のままです)。
答え1
私はゼロから始めて、何時間も試行錯誤した後、問題の原因にたどり着きました。基本的には、いくつかの愚かなミスでした。ビルド スクリプトは、絶対パス (つまり、たとえばではなく、lib/libc.so
)を使用して initramfs を生成しました~/Work/project/target/lib/libc.so
。これにより、明らかにカーネルが初期 init を見つけられませんでした。
私が学んだ興味深い教訓: 埋め込み initramfs は、外部のものと比べて動作が若干異なるようです。つまり、埋め込み initramfs が存在する場合、init スクリプト内の echo コマンドなどは出力されません。外部 initramfs をいじっているときに、埋め込み initramfs を削除するのを忘れたため、外部 init は実行されましたが (その initramfs のみ)、何も出力されませんでした。埋め込み initramfs を削除した後、動作しました。