2012-05-03 14 views
16

Linuxカーネル(3.2)にCPIOアーカイブとしてビルドしているカスタムinitramfsイメージをビルドします。カスタムLinuxカーネルに組み込まれた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が非常に簡単で、かつ必要がありますだけの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_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 

カーネルを構築し、uImageサイズはI Kので、initramfsのサイズに応じて大きくなっています今はイメージが詰まっています。

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) 

をその出力から、それもinitramfsのようCPIOアーカイブを解凍しようとしているように、それは見ていません。しかし、私は私が起動するときに、この出力を取得します。ブートが完了すると、私は(chroot環境を使用して)ファイルシステムを試してみましたが、それが正常に動作します...ので、私は信じてい

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

:私は、Linuxのコードのinit/initramfs.c中に存在するこののprintkの出力を、見ることを期待しますファイルシステム/ライブラリは正常です。

誰でも私が間違っているかもしれないものについていくつかの指針を与えることができますか?ご協力いただきありがとうございます!

+0

mmcblkデバイスの初期化時や、次に出力メッセージを生成するときの間に、カーネルがクラッシュする可能性があります。進行状況を報告するためにそこにいくつかのprintkを追加できますか?あなたのカーネルソースがこのボードに適していることを確かめてください - エラーが発生する可能性のある(mmcblkのもののハードコードされたインスタンス化のような)変更を加えましたか? –

+0

このカーネルでinitramfsを引いたもの(NANDにフラッシュした大容量のファイルシステムを使用しています)がうまく起動します。だから私はそれがボードの問題であるかどうか疑問です。私はそこにいくつかのprintkを取得しようとしていますが、私はそれに夢中になる前に誰かが私のアプローチで間違ったことを明らかに指摘できると考えていました。 – dag

答えて

31

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

Warning: unable to open an initial console. 

私はより良い起動シーケンスを理解するようにprintk年代を追加した後、私はそのコンソールデバイスは、initスクリプトを実行する前に開かれて実現:私はコンソールデバイスがありませんでした

、この行が手掛かりでした。したがって、コンソールデバイスはinitramfsファイルシステムに直接存在する必要があり、devtmpfsマウントを使用してコンソールデバイスを作成することはできません。

initスクリプトは、カーネルが出力した理由です、シェルはコンソールを開こうとした走り、失敗したとき、私は思う

上のinitramfsの/ devディレクトリ内からfolowingのコマンドを実行
Kernel panic - not syncing: Attempted to kill init! 

をカーネルのビルドマシンは、必要なデバイスノードを生成します。

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

再CPIOは、ファイルシステムをアーカイブしてカーネルを再構築した後、私は最終的にカーネルがブートすることはinitramfsで作業ファイルシステムを持っています。

+0

+1。これは私に数時間の仕事を節約しました! – thang

+0

devtmpfs.mount = 1は、新しいカーネルやCONFIG_DEVTMPFS_MOUNTを有効にするために便利です。 – technosaurus

+0

Linux 3.17では、 '' '' '' '' '' '' '' '' '' ''に ' initramfs、しかしYMMV。 – Piranna

関連する問題