U-Boot "Formato de imagen de disco RAM incorrecto" con initramfs en BeagleBone black

U-Boot "Formato de imagen de disco RAM incorrecto" con initramfs en BeagleBone black

Estoy siguiendo el libro "Dominar la programación integrada de Linux - Segunda edición" intentando iniciar el kernel de Linux montando un disco RAM.

Tengo U-boot 2020.01 funcionando y la imagen del kernel de Linux creada. Creé un sistema de archivos en mi computadora donde agregué togetherbox y las bibliotecas requeridas manualmente como archivos. Aquí hay una copia resumida del árbol en mi sistema de archivos.

├── bin
│   ├── arch -> busybox
...
│   ├── busybox
│   ├── cat -> busybox
...
├── dev
├── etc
├── home
├── lib
│   ├── ld-2.30.so
│   ├── ld-linux-armhf.so.3 -> ld-2.30.so
│   ├── libc-2.30.so
│   ├── libc.so.6 -> libc-2.30.so
│   ├── libm-2.30.so
│   ├── libm.so.6 -> libm-2.30.so
│   ├── libresolv-2.30.so
│   └── libresolv.so.2 -> libresolv-2.30.so
├── linuxrc -> bin/busybox
├── proc
├── sbin
│   ├── acpid -> ../bin/busybox
...
├── sys
├── tmp
├── usr
│   ├── bin
│   │   ├── [ -> ../../bin/busybox
...
│   ├── lib
│   └── sbin
│       ├── addgroup -> ../../bin/busybox
...
└── var
    └── log

He creado mi imagen de disco ram siguiendo el fragmento:

cd ~/rootfs
find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio
cd ..
gzip initramfs.cpio
mkimage -A arm -O linux -T ramdisk -d initramfs.cpio.gz uRamdisk

Coloqué todos los archivos necesarios en la tarjeta SD y en u-boot en el Beaglebone black intenté arrancar como:

fatload mmc 0:1 0x80200000 zImage
fatload mmc 0:1 0x80f00000 am335x-boneblack.dtb
fatload mmc 0:1 0x81000000 uRamdisk
setenv bootargs console=ttyO0,115200 rdinit=/bin/sh
bootz 0x80200000 0x81000000 0x80f00000

El problema es que después del arranque se queja de que la imagen de mi disco RAM es incorrecta.

=> fatload mmc 0:1 0x80200000 zImage
7109016 bytes read in 464 ms (14.6 MiB/s)
=> fatload mmc 0:1 0x80f00000 am335x-boneblack.dtb
34220 bytes read in 5 ms (6.5 MiB/s)
=> fatload mmc 0:1 0x81000000 uRamdisk
2828897 bytes read in 185 ms (14.6 MiB/s)
=> setenv bootargs console=ttyO0,115200 rdinit=/bin/sh
=> bootz 0x80200000 0x81000000 0x80f00000
Wrong Ramdisk Image Format
Ramdisk image is corrupt or invalid

Como estoy empezando con Linux en dispositivos integrados, no tengo ninguna idea sobre cómo resolver el problema. Descubrí que la razón es que la imagen del sistema de archivos se creó incorrectamente. Intenté usar mkimage -c nonesin éxito. Intenté usar mkimage dentro de mi copia de u-boot en lugar de la que puedes instalar en Ubuntu (con sudo apt-get install u-boot-tools).

Antes de llamar a mkimage, initramfs.cpio.gz tiene el siguiente aspecto:

Archivo comprimido Ramdisk antes de usar mkimage

¿Me faltan algunas carpetas/archivos en mi sistema de archivos? ¿Es un problema que mi computadora tenga ext4 pero la partición de arranque usa fat32? ¿Necesito utilizar un conjunto de herramientas mkimage diferente? ¿Cual podría ser el problema?

Respuesta1

respuesta sencilla

Necesitas habilitar CONFIG_LEGACY_IMAGE_FORMATen U-Boot:

  1. Vaya al directorio fuente de u-boot.
  2. Tipo:$ make menuconfig
  3. EnImágenes de arranque -> Habilitar soporte para el formato de imagen heredado
  4. Salga y guarde, luego construya U-Boot nuevamente

Ahora podrá cargar su uRamdisk :-)

respuesta más larga

El libro fue escrito usando U-Boot v2017.01 y la configuración am335x_boneblack_defconfig. La versión de U-Boot v2020.01 no tiene ese archivo de configuración. En su lugar, tiene am335x_boneblack_vboot_defconfig, que funciona bien excepto que no habilita la compatibilidad con el mkimageformato.

Como autor del libro, sólo puedo decir que es difícil escribir instrucciones detalladas que funcionen para todas las versiones futuras de software. Pero lo intento.

Respuesta2

Solía mkimage -A arm64 -T ramdisk -d busybox-1.32.1/initramfs.cpio.gz initrd.img​​​​hacer ramdisk.

información relacionada