2012-05-03 15 views
16

Buduję niestandardowy obraz initramfs, który buduję jako archiwum CPIO w jądrze systemu Linux (3.2).Initramfs wbudowany w niestandardowe jądro Linuxa nie działa

Problem, który mam, polega na tym, że niezależnie od tego, co próbuję, jądro nie wydaje się nawet próbować uruchomić z initramfs.

Pliki mam w moim archiwum 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 jest bardzo prosta i należy po prostu urządzenia startowe i ikra powłokę (na razie):

#!/bin/sh 

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

w jądrze. config mam:

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 

Kernel buduje i wielkość uImage jest większa w zależności od wielkości initramfs, więc k teraz obraz jest pakowany. Jednak mam to wyjście kiedy uruchomić:

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) 

Od tego wyjścia, to nie wygląda to nawet próbuje rozpakować archiwum cpio jako initramfs. Spodziewam się, aby zobaczyć ten printk wyjścia, który jest obecny w kodzie linux init/initramfs.c:

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

Próbowałem raz uruchamianie systemu plików jest pełna (przy użyciu chroot) i działa dobrze ... więc wierzę system plików/biblioteki są w normie.

Czy ktoś mógłby mi podać kilka wskazówek, które mogą być nieprawidłowe? Z góry dziękujemy za wszelką pomoc!

+0

Wygląda na to, że twoje jądro ulega awariom z prawdopodobnie niezwiązanego z nim powodu, albo podczas inicjowania urządzeń mmcblk, albo między tym, a tym, co następnie wygeneruje komunikat wyjściowy. Czy możesz tam dostać dodatkowe wydruki, aby zgłosić postęp? Na ile jesteś pewien, że twoje źródła jądra są odpowiednie dla tej płyty - czy wprowadziłeś zmiany, aby je zaadaptować (takie jak zakodowane na stałe tworzenie elementów mmcblk), w których mogą występować błędy? –

+0

To ładuje się z tym kernelem, minus initramfs (używając większego systemu plików, który błysnąłem na NAND). Mam więc wątpliwości, czy to kwestia płyty. Pracuję nad tym, żeby dostać tam kilka odbitek, ale miałem nadzieję, że ktoś wskaże coś, co jest oczywiście nie tak z moim podejściem, zanim zwariowałem. – dag

Odpowiedz

31

Wymyśliłem to. Opublikuję odpowiedź na wypadek, gdyby ktoś inny miał ten problem.

mi brakuje urządzenia konsoli, ta linia była wskazówka:

Warning: unable to open an initial console. 

Po dodaniu printk, tak aby lepiej rozumieć sekwencję startową, zdałem sobie sprawę, że urządzenie konsola jest otwierana przed uruchomieniem skryptu startowego. Dlatego urządzenie konsoli musi znajdować się bezpośrednio w systemie plików initramfs, a my nie możemy polegać na mountie devtmpfs, aby go utworzyć.

myślę kiedy Skrypt startowy prowadził powłoka próbuje otworzyć konsolę i nie udało, to dlaczego jądro było wyprowadzanie:

Kernel panic - not syncing: Attempted to kill init! 

Wykonywanie folowing poleceń od wewnątrz katalogu/dev z initramfs na kernel build maszyna wygeneruje wymagane węzły urządzeń:

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

Po ponownym CPIO archiwizowania plików i odbudowy jądra, ale w końcu mieć system plików pracujący w initramfs że jądro chce się uruchomić.

+0

+1. to zaoszczędziło mi godzin pracy! – thang

+0

devtmpfs.mount = 1 może być przydatne dla nowszych wersji jądra lub włączyć CONFIG_DEVTMPFS_MOUNT – technosaurus

+0

W Linuksie 3.17 Stwierdziłem, że tylko '' 'console''' to jedyne urządzenie, które musiałem mieć na' ''/dev''' initramfs, ale YMMV. – Piranna

Powiązane problemy