
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 none
sem 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:
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_FORMAT
no U-Boot:
- Vá para o diretório de origem do u-boot.
- Tipo:
$ make menuconfig
- EmImagens de inicialização -> Habilitar suporte para o formato de imagem legado
- 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 mkimage
formato.
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.img
fazer ramdisk.