自己コンパイルされたカーネルをinitramfsと一緒に実行しようとしています。古いラズベリーで動作しましたが、どういうわけか実行できません。
私が正確にやろうとしていること:カーネルをロードし、initramfsを「実行」して、いくつかのチェック(システム更新など)を実行し、最後にsquashfsイメージをマウントして、そのシステムでswitch_rootを呼び出します。
しかし、カーネルはどういうわけかinitramfsのinitの実行を拒否します。 cmdline.txt
/config.txt
でさまざまな設定を試しましたが、どれも機能していないようです。カーネルは常にルートが使用可能になるのを待ちます(またはVFS: unable to mount root fs on unknown block
で失敗します)。いくつかのコマンドライン設定(おそらく正しいroot=...
。root=/dev/ram0
が機能しなかった)またはカーネルフラグが欠落していると思います。私の現在のコマンドライン: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スクリプトのエコーコマンドなどは出力されません。外部initramfsをいじくり回しているときに、埋め込まれたinitramfsを削除するのを忘れたため、外部initが実行されましたが(その1つだけ)、何も出力されませんでした。埋め込まれたinitramfsを削除した後、それは機能しました。