2012-05-03 8 views
16

Sto costruendo un'immagine di initramfs personalizzata che sto creando come archivio CPIO nel kernel di Linux (3.2).Initramfs integrato nel kernel Linux personalizzato non è in esecuzione

Il problema che sto avendo è che non importa quello che provo, il kernel non sembra nemmeno tentare di eseguire da initramfs.

I file che ho nel mio archivio 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 è molto semplice, e deve solo dispositivi init e generare una shell (per ora):

#!/bin/sh 

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

nel kernel. config ho:

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 costruisce e la dimensione uImage è maggiore a seconda delle dimensioni initramfs, quindi k ora l'immagine viene imballata. Tuttavia ho questa uscita quando faccio il boot:

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) 

Da quel uscita, non sembra come sta ancora cercando di estrarre l'archivio CPIO come initramfs. Mi aspetto di vedere questa uscita printk, che è presente nel codice linux init/initramfs.c:

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

ho provato il filesystem una volta che avvio è completo (utilizzando chroot) e funziona bene ... quindi credo che il il filesystem/le librerie sono sane.

Qualcuno potrebbe darmi qualche suggerimento su cosa potrei aver sbagliato? Grazie in anticipo per qualsiasi assistenza!

+0

Mi sembra che il tuo kernel stia andando in crash per un motivo probabilmente non correlato, sia durante l'inizializzazione dei dispositivi mmcblk o tra quello e qualunque cosa generi successivamente un messaggio di output. Puoi avere qualche stampino aggiuntivo lì per segnalare i progressi? Sei sicuro che le sorgenti del tuo kernel siano appropriate per questa scheda: hai apportato delle modifiche per adattarle (come l'istanziazione codificata delle cose di mmcblk) in cui potrebbero esserci degli errori? –

+0

Si avvia bene con questo kernel, meno initramfs (usando il filesystem più grande che ho flashato in NAND). Quindi sono dubbioso che sia un problema di bordo. Sto lavorando per ottenere della stampa, ma speravo che qualcuno potesse indicare qualcosa di chiaramente sbagliato nel mio approccio prima che diventassi pazzo con quello. – dag

risposta

31

L'ho capito. Pubblicherò la risposta nel caso in cui qualcun altro abbia questo problema.

mi mancava un dispositivo di console, questa linea è stato l'indizio:

Warning: unable to open an initial console. 

Dopo aver aggiunto printk di modo che ho meglio compreso la sequenza di avvio, mi sono reso conto che il dispositivo di console si apre prima di eseguire lo script di init. Pertanto, il dispositivo della console deve essere direttamente nel filesystem initramfs e non possiamo fare affidamento sul supporto per devtmpfs per crearlo.

Credo che quando lo script di init ha il guscio stava cercando di aprire la console e non è riuscito, è per questo che il kernel è stato l'output:

Kernel panic - not syncing: Attempted to kill init! 

esecuzione i seguenti comandi all'interno della directory/dev del initramfs sulla sistema di compilazione del kernel genererà i nodi di dispositivo richiesti:

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

Dopo ri-CPIO archiviazione del file system e ricostruire il kernel, finalmente ho un filesystem lavorare in initramfs che il kernel si avvia.

+0

+1. questo mi ha risparmiato ore di lavoro! – thang

+0

devtmpfs.mount = 1 può essere utile per i nuovi kernel o abilitare CONFIG_DEVTMPFS_MOUNT – technosaurus

+0

Su Linux 3.17 Ho scoperto che solo '' 'console''' è l'unico dispositivo che dovevo avere su' ''/dev''' su l'initramfs, ma YMMV. – Piranna

Problemi correlati