23

Linuxカーネル(3.2)にCPIOアーカイブとして構築しているカスタムinitramfsイメージを構築しています。

私が抱えている問題は、何を試しても、カーネルがinitramfsから実行しようとさえしないように見えることです。

CPIOアーカイブにあるファイル:

cpio -it < initramfs.cpio
.
init
usr
usr/sbin
lib
lib/libcrypt.so.1
lib/libm.so
lib/libc.so.6
lib/libgcc_s.so
lib/libcrypt-2.12.2.so
lib/libgcc_s.so.1
lib/libm-2.12.2.so
lib/libc.so
lib/libc-2.12.2.so
lib/ld-linux.so.3
lib/ld-2.12.2.so
lib/libm.so.6
proc
sbin
mnt
mnt/root
root
etc
bin
bin/sh
bin/mknod
bin/mount
bin/busybox
sys
dev
4468 blocks

Initは非常に単純であり、デバイスを初期化してシェルを生成する必要があります(今のところ):

#!/bin/sh

mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
/bin/busybox --install -s
exec /bin/sh

カーネルの.configには次のものがあります。

CONFIG_INITRAMFS_SOURCE="../initramfs.cpio"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=32768

カーネルがビルドされ、initramfsのサイズに応じてuImageのサイズが大きくなるため、イメージがパックされていることがわかります。ただし、起動すると次の出力が得られます。

console [netcon0] enabled
netconsole: network logging started
omap_rtc omap_rtc: setting system clock to 2000-01-02 00:48:38 UTC (946774118)
Warning: unable to open an initial console.
Freeing init memory: 1252K
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new high speed SDHC card at address e624
mmcblk0: mmc0:e624 SU08G 7.40 GiB
 mmcblk0: p1
Kernel panic - not syncing: Attempted to kill init!
[<c000d518>] (unwind_backtrace+0x0/0xe0) from [<c0315cf8>] (panic+0x58/0x188)
[<c0315cf8>] (panic+0x58/0x188) from [<c0021520>] (do_exit+0x98/0x6c0)
[<c0021520>] (do_exit+0x98/0x6c0) from [<c0021e88>] (do_group_exit+0xb0/0xdc)
[<c0021e88>] (do_group_exit+0xb0/0xdc) from [<c0021ec4>] (sys_exit_group+0x10/0x18)
[<c0021ec4>] (sys_exit_group+0x10/0x18) from [<c00093a0>] (ret_fast_syscall+0x0/0x2c)

その出力から、CPIOアーカイブをinitramfsとして抽出しようとしているようには見えません。Linuxコードinit/initramfs.cに存在するこのprintk出力が表示されることを期待しています。

printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");

起動が完了したら(chrootを使用して)ファイルシステムを試しましたが、正常に動作します...したがって、ファイルシステム/ライブラリは正常であると思います。

誰かが私が間違っているかもしれないことについていくつかの指針を私に与えることができますか?よろしくお願いします!

4

1 に答える 1

36

私はそれを考え出した。他の誰かがこの問題を抱えている場合に備えて、回答を投稿します。

私はコンソールデバイスがありませんでした、この行が手がかりでした:

Warning: unable to open an initial console.

起動シーケンスをよりよく理解するためにprintkを追加した後、initスクリプトを実行する前にコンソールデバイスが開いていることに気付きました。したがって、コンソールデバイスはinitramfsファイルシステムに直接存在する必要があり、それを作成するためにdevtmpfsマウントに依存することはできません。

initスクリプトが実行されたとき、シェルがコンソールを開こうとして失敗したと思います。そのため、カーネルは次のように出力していました。

Kernel panic - not syncing: Attempted to kill init!

カーネルビルドマシンのinitramfsの/devディレクトリ内から次のコマンドを実行すると、必要なデバイスノードが生成されます。

mknod -m 622 console c 5 1
mknod -m 622 tty0 c 4 0

ファイルシステムをアーカイブしてカーネルを再構築した後、最終的にカーネルが起動するinitramfsに動作するファイルシステムができました。

于 2012-05-04T18:34:03.090 に答える