núcleo - Initramfs integrado en el kernel de Linux personalizado no se está ejecutando
new linux kernel (1)
Me lo imaginé. Publicaré la respuesta en caso de que alguien más tenga este problema.
Me faltaba un dispositivo de consola, esta línea era la clave:
Warning: unable to open an initial console.
Después de agregar printk''s para que entendiera mejor la secuencia de inicio, me di cuenta de que el dispositivo de consola se abre antes de ejecutar el script de inicio. Por lo tanto, el dispositivo de consola debe estar directamente en el sistema de archivos initramfs, y no podemos confiar en el montaje devtmpfs para crearlo.
Creo que cuando se ejecutó el script de inicio, el shell estaba intentando abrir la consola y falló, por eso el kernel estaba generando:
Kernel panic - not syncing: Attempted to kill init!
La ejecución de los siguientes comandos desde el directorio / dev de initramfs en la máquina de compilación del kernel generará los nodos de dispositivo necesarios:
mknod -m 622 console c 5 1
mknod -m 622 tty0 c 4 0
Después de re-CPIO archivar el sistema de archivos y reconstruir el kernel, finalmente tengo un sistema de archivos en funcionamiento en initramfs que el kernel arrancará.
Estoy creando una imagen personalizada de initramfs que estoy construyendo como un archivo CPIO en el kernel de Linux (3.2).
El problema que tengo es que no importa lo que intente, el kernel no parece siquiera intentar ejecutarse 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 solo debe iniciar dispositivos 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 kernel .config 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
El núcleo se compila y el tamaño de uImage es mayor dependiendo del tamaño de initramfs, así que sé que la imagen se está empaquetando. Sin embargo obtengo 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 esa salida, no parece que esté intentando extraer el archivo CPIO como initramfs. Espero ver esta salida de printk, que está presente en el código de linux init / initramfs.c:
printk(KERN_INFO "Trying to unpack rootfs image as initramfs.../n");
Intenté el sistema de archivos una vez que se completó el arranque (usando chroot) y funciona bien ... así que creo que el sistema de archivos / bibliotecas están en su sano juicio.
¿Podría alguien darme algunos consejos sobre lo que puedo tener incorrecto? ¡Gracias de antemano por cualquier ayuda!