Kernel personalizado de Raspberry Pi 2 con initramfs

Kernel personalizado de Raspberry Pi 2 con initramfs

Estoy intentando ejecutar un kernel autocompilado junto con initramfs. Funcionó en la vieja frambuesa, pero de alguna manera no puedo hacer que funcione.

Lo que estoy tratando de hacer exactamente: cargar el kernel, "ejecutar" initramfs que luego realiza algunas comprobaciones (actualización del sistema, etc.), finalmente monta una imagen de squashfs e invoca switch_root en dicho sistema.

Pero el kernel de alguna manera se niega a ejecutar el init de initramfs. Probé varias configuraciones en cmdline.txt/ config.txtpero ninguna parece funcionar, el kernel siempre espera a que haya alguna raíz disponible (o falla con VFS: unable to mount root fs on unknown block). Supongo que me falta alguna configuración de cmdline (probablemente un root=.... correcto root=/dev/ram0no funcionó) o un indicador del kernel. Mi línea de cmd actual: dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait, config.txt:initramfs initramfs.gz followkernel

Cuando agrego root=/dev/mmcblk0p6 roottype=ext4todo el sistema arranca (en algún Linux de prueba que agregué para verificar que el kernel funciona).

Verifiqué que el kernel esté compilado con soporte para initramfs ( BLK_DEV_INITRD=y), lamentablemente compilar initramfs en la imagen del kernel no es una opción. El kernel (4.1 estable) se compila usando buildroot. El formato binario del kernel es zImage (parece no funcionar con vmlinux, la pantalla permanece en negro).

Respuesta1

Comencé desde cero y después de horas de prueba y error llegué a la(s) fuente(s) de mi problema, que básicamente eran solo algunos errores estúpidos: mi script de compilación generó initramfs con rutas absolutas (es decir, no, por ejemplo, lib/libc.sopero más bien ~/Work/project/target/lib/libc.so), lo que obviamente hace que el núcleo no encuentre el init inicial.

Aprendí una lección interesante: el initramfs incorporado aparentemente se comporta de manera ligeramente diferente en comparación con uno externo, es decir, que los comandos de eco y similares en el script de inicio no se imprimen cuando hay un initramfs incorporado. Mientras jugaba con un initramfs externo, olvidé eliminar el incrustado, lo que provocó que se ejecutara el init externo (y solo ese), pero no se imprimiera nada. Después de que eliminé el initramfs integrado, funcionó.

información relacionada