U-Boot "Formato de imagem Ramdisk errado" com initramfs no BeagleBone preto

U-Boot "Formato de imagem Ramdisk errado" com initramfs no BeagleBone preto

Estou seguindo o livro "Mastering Embedded Linux Programming - Second Edition" tentando inicializar o kernel do Linux montando um ramdisk.

Tenho o U-boot 2020.01 funcionando e a imagem do kernel Linux feita. Eu criei um sistema de arquivos em meu computador onde adicionei o busybox e as bibliotecas exigidas por ele manualmente como arquivos. Aqui está uma cópia resumida da árvore no meu sistema de arquivos.

├── 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

Eu criei minha imagem ramdisk seguindo o trecho:

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

Coloquei todos os arquivos necessários no cartão SD e no u-boot no Beaglebone black tentei inicializar 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

O problema é que depois do bootz ele reclama que minha imagem do ramdisk está errada.

=> 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 estou começando com o Linux em dispositivos embarcados, estou completamente sem ideias sobre como resolver o problema. Descobri que o motivo é que a imagem do sistema de arquivos foi criada incorretamente. Eu tentei usar mkimage -c nonesem sucesso. Eu tentei usar o mkimage dentro da minha cópia do u-boot em vez daquele que você pode instalar no Ubuntu (com sudo apt-get install u-boot-tools).

Antes de mkimage ser chamado, initramfs.cpio.gz tem a seguinte aparência:

Arquivo compactado Ramdisk antes de mkimage ser usado

Estou faltando algumas pastas/arquivos no meu sistema de arquivos? É um problema que meu computador tenha ext4, mas a partição de inicialização usa fat32? Preciso usar um conjunto de ferramentas mkimage diferente? Qual poderia ser o problema?

Responder1

Resposta simples

Você precisa habilitar CONFIG_LEGACY_IMAGE_FORMATno U-Boot:

  1. Vá para o diretório de origem do u-boot.
  2. Tipo:$ make menuconfig
  3. EmImagens de inicialização -> Habilitar suporte para o formato de imagem legado
  4. Saia e salve, então construa o U-Boot novamente

Agora você poderá carregar seu uRamdisk :-)

Resposta mais longa

O livro foi escrito usando U-Boot v2017.01 e configuração am335x_boneblack_defconfig. A versão U-Boot v2020.01 não possui esse arquivo de configuração. Em vez disso, possui am335x_boneblack_vboot_defconfig, que funciona bem, exceto que não habilita o suporte para o mkimageformato.

Falando como autor do livro, só posso dizer que é difícil escrever instruções detalhadas que funcionem para todas as versões futuras de software. Mas eu tento.

Responder2

Eu costumava mkimage -A arm64 -T ramdisk -d busybox-1.32.1/initramfs.cpio.gz initrd.imgfazer ramdisk.

informação relacionada