web-dev-qa-db-ja.com

initramfsを使用したRaspberryPi2カスタムカーネル

自己コンパイルされたカーネルを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では機能しないようです。画面は黒のままです)。

2
incaseoftrouble

私は最初から始めて、何時間もの試行錯誤の末、問題の原因にたどり着きました。これは基本的には愚かな間違いでした。ビルドスクリプトは、絶対パスを使用してinitramfsを生成しました(たとえば、_lib/libc.so_ではなく_~/Work/project/target/lib/libc.so_)、これは明らかにカーネルが最初のinitを見つけられない原因になります。

私が学んだ興味深い教訓:埋め込まれたinitramfsは、外部のものとは明らかに異なる動作をしています。つまり、埋め込まれたinitramfsが存在する場合、initスクリプトのエコーコマンドなどは出力されません。外部initramfsをいじくり回しているときに、埋め込まれたinitramfsを削除するのを忘れたため、外部initが実行されましたが(その1つだけ)、何も出力されませんでした。埋め込まれたinitramfsを削除した後、それは機能しました。

1
incaseoftrouble