torvalds núcleo new linus actual linux linux-kernel

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!