ビジボックスシェルを起動するようになっているカスタムinitramfsがあります。 cpio アーカイブにbin/
およびbusybox
。init
busybox
静的にリンクされたバイナリです。
bin/busybox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, stripped
init
次のコードを含むシェルスクリプト。
#!/bin/busybox sh
export PATH=/bin
/bin/busybox --install -s /bin
sh
次のコマンドを使用してイメージを作成します。
find | cpio -ovHnewc > ../initrd.img
実行するとカーネルパニックが発生します。
# qemu-system-x86_64 -m 512M -enable-kvm -kernel /boot/vmlinuz -initrd ../initrd.img -append 'debug console=ttyS0 init=/bin/init' -nographic
… (booting)
[ 2.175321] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
initramfs イメージにどのような問題がありますか?空のinitramfsでも同じエラーが発生します。私のディストリビューションのinitramfsが動作しています。
答え1
初期化スクリプトが起動するには小さすぎるようです。カーネルは /proc および /sys と連携して動作するため、以下を含める必要があります。
mount -t proc none /proc
mount -t sysfs none /sys
答え2
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
initスクリプトが見つからないため、このメッセージが表示されます。 (initがなければ、それを試してもrootfsが見つからないため失敗します。)
-append 'debug console=ttyS0 init=/bin/init'
/init
それで、いいえ/bin/init
。または、以下を指定できます。ファイルシステムの初期化rdinit=
パラメータに従って初期化管理ガイド/カーネルパラメータ.txt。
かどうかをテストする方法ファイルシステムの初期化完全に読み込まれて通過したら、rdinit=/bin/busybox
次のメッセージで終了する必要があります。
CPU: 0 PID: 1 Comm: busybox ...
[... lots of stuff ...]
Attempted to kill init!
Attempted to kill init!
最初にinitプロセスが存在する場合にのみこのメッセージを受け取るので、そのプロセスがある程度正常にロードされ実行されたことがわかります。それ以外の場合、initがまったく存在しない場合は、現在受信したメッセージを返します。
また、initrd自体内でモジュールのロードを処理したくない場合は、カーネル自体がinitramfs(CONFIG_BLK_DEV_INITRD=y
)だけでなく、実行可能なスクリプト()とモジュールの代わりに組み込みドライバをサポートする必要があります。CONFIG_BINFMT_SCRIPT=y
したがって、ここでもカーネルの設定が重要です。
すでにこのページを訪問しているかどうかはわかりませんが、Gentoo WikiにはInitramfsのカスタマイズに関するガイドがあります。。これはまた、基本的な環境を取得する方法を示しています/dev
/proc
/sys
。