2012-05-03 5 views
16

Estoy construyendo una imagen de initramfs personalizada que estoy creando como un archivo de CPIO en el kernel de Linux (3.2).Initramfs integrado en kernel de Linux personalizado no se está ejecutando

El problema que estoy teniendo es que no importa lo que intento, el kernel no parece siquiera intentar ejecutar desde el initramfs.

Los archivos que tengo en mi archivo 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 es muy simple, y sólo debe dispositivos de inicialización y generar un shell (por ahora):

#!/bin/sh 

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

en el núcleo. config que tengo:

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 

núcleos que haya construido y el tamaño uImage es mayor dependiendo del tamaño initramfs, por lo que k ahora la imagen está siendo empacada. Sin embargo consigo esta salida cuando arranco:

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) 

Desde que la producción, que no se ve como que está incluso tratando de extraer el archivo cpio como initramfs. Espero ver esta salida printk, que está presente en el código de Linux init/initramfs.c:

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

probé el sistema de archivos, una vez se haya completado el arranque (usando chroot) y funciona bien ... así que creo que la sistema de archivos/bibliotecas son sanos.

¿Alguien podría darme algunos consejos sobre lo que puedo tener incorrecto? ¡Gracias de antemano por cualquier ayuda!

+0

Me parece que su kernel está fallando por un motivo posiblemente no relacionado, ya sea durante la inicialización de los dispositivos mmcblk o entre eso y lo que sea que luego genere un mensaje de salida. ¿Puedes obtener algunas impresiones adicionales para informar el progreso? ¿Cuán seguro está de que las fuentes de su kernel son apropiadas para esta placa? ¿Ha realizado cambios para adaptarlas (como la creación de instancias codificadas de las cosas de mmcblk) en las que podría haber errores? –

+0

Funciona bien con este núcleo, menos el initramfs (usando el sistema de archivos más grande que he flasheado en NAND). Entonces dudo que sea un problema de la junta. Estoy trabajando para conseguir algunas copias impresas allí, pero esperaba que alguien pudiera señalar algo obviamente erróneo en mi enfoque antes de volverme loco con eso. – dag

Respuesta

31

Me di cuenta. Publicaré la respuesta en caso de que alguien más tenga este problema.

me faltaba un dispositivo de consola, esta línea fue la pista:

Warning: unable to open an initial console. 

Después de la adición de printk para que yo entendí mejor la secuencia de arranque, me di cuenta de que el dispositivo de consola se abre antes de ejecutar el script de inicio. Por lo tanto, el dispositivo de la consola debe estar en el sistema de archivos initramfs directamente, y no podemos confiar en el soporte devtmpfs para crear eso.

Creo que cuando el guión de inicio corrió la cáscara estaba tratando de abrir la consola y no, es por eso que el kernel fue dando salida:

Kernel panic - not syncing: Attempted to kill init! 

La ejecución de los comandos folowing desde dentro del directorio/dev de initramfs en la kernel máquina de construcción generará los nodos de dispositivo necesarios:

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

Después de volver a CPIO archivar el sistema de archivos y reconstruir el kernel, por fin tengo un sistema de archivos que trabaja en initramfs que el kernel de arranque.

+0

+1. esto me ahorró horas de trabajo! – thang

+0

devtmpfs.mount = 1 puede ser útil para kernels más nuevos o habilitar CONFIG_DEVTMPFS_MOUNT – technosaurus

+0

en Linux 3.17 He encontrado que solo '' 'console''' es el único dispositivo que necesitaba tener en' ''/dev''' en el initramfs, pero YMMV. – Piranna

Cuestiones relacionadas