initramfsを使用したRaspberry Pi 2カスタムカーネル

initramfsを使用したRaspberry Pi 2カスタムカーネル

initramfsで実行するために独自のコンパイルされたカーネルを取得しようとしています。古いRaspberry Piで動作しますが、何とか動作させることはできません。

私がやろうとしているのは、カーネルをロードし、initramfsを「実行」してから、いくつかのチェック(システムアップデートなど)を実行し、最後にsquashfsイメージをインストールし、そのシステムでswitch_rootを呼び出すことです。

しかし、どういうわけかカーネルはinitramfsの初期化実行を拒否します。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では機能しないようで、画面は黒くなります)。

ベストアンサー1

私は最初から始まり、数時間の試行錯誤後に問題の原因を見つけました。これは基本的に愚かな間違いでした。私のビルドスクリプトは絶対パス(たとえばそうではなくlib/libc.so他の方法)を使用してinitramfsを生成しました。 around ~/Work/project/target/lib/libc.so)、これは明らかにカーネルが初期初期化を見つけるのを防ぎます。

私が学んだ興味深いレッスンは、組み込みのinitramfsが外部initramfsとは少し異なる動作をするということです。つまり、組み込みの initramfs がある場合、init スクリプトのエコーコマンドなどは印刷されません。外部initramfsの変更中に組み込まれたinitramfsを削除するのを忘れてしまったため、外部initが実行されましたが(それだけ)、何も印刷されませんでした。組み込みのinitramfsを削除すると機能しました。

おすすめ記事