U-Boot „Falsches Ramdisk-Image-Format“ mit initramfs auf BeagleBone black

U-Boot „Falsches Ramdisk-Image-Format“ mit initramfs auf BeagleBone black

Ich folge dem Buch „Mastering Embedded Linux Programming – Second Edition“ und versuche, den Linux-Kernel zu booten, indem ich eine Ramdisk mounte.

Ich habe U-Boot 2020.01 am Laufen und das Linux-Kernel-Image erstellt. Ich habe auf meinem Computer ein Dateisystem erstellt, in das ich Busybox und die dafür benötigten Bibliotheken manuell als Dateien eingefügt habe. Hier ist eine zusammengefasste Kopie des Baums in meinem Dateisystem.

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

Ich habe mein Ramdisk-Image gemäß dem Snippet erstellt:

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

Ich habe alle benötigten Dateien auf der SD-Karte abgelegt und in U-Boot versucht, den Beaglebone Black wie folgt zu booten:

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

Das Problem ist, dass nach dem Booten eine Meldung angezeigt wird, dass mein Ramdisk-Image falsch ist.

=> 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

Da ich gerade mit Linux auf eingebetteten Geräten anfange, habe ich überhaupt keine Ideen mehr, wie ich das Problem lösen soll. Ich habe herausgefunden, dass der Grund darin liegt, dass das Dateisystem-Image falsch erstellt wurde. Ich habe vergeblich versucht, mkimage zu verwenden -c none. Ich habe versucht, das mkimage in meiner U-Boot-Kopie zu verwenden, anstatt das, das Sie in Ubuntu installieren können (mit sudo apt-get install u-boot-tools).

Vor dem Aufruf von mkimage sieht initramfs.cpio.gz wie folgt aus:

Ramdisk-komprimierte Datei vor der Verwendung von mkimage

Fehlen in meinem Dateisystem einige Ordner/Dateien? Ist es ein Problem, dass mein Computer ext4 hat, die Boot-Partition aber fat32 verwendet? Muss ich ein anderes mkimage-Toolset verwenden? Was könnte das Problem sein?

Antwort1

Einfache Antwort

CONFIG_LEGACY_IMAGE_FORMATSie müssen in U-Boot Folgendes aktivieren :

  1. Gehen Sie zum U-Boot-Quellverzeichnis.
  2. Typ:$ make menuconfig
  3. InBoot-Images -> Unterstützung für das Legacy-Image-Format aktivieren
  4. Beenden und speichern, dann U-Boot erneut erstellen

Jetzt kann es Ihre uRamdisk laden :-)

Längere Antwort

Das Buch wurde mit U-Boot v2017.01 und der Konfiguration am335x_boneblack_defconfig geschrieben. U-Boot Version v2020.01 hat diese Konfigurationsdatei nicht. Stattdessen hat es am335x_boneblack_vboot_defconfig, was gut funktioniert, außer dass es die Unterstützung für das mkimageFormat nicht aktiviert.

Als Autor des Buches kann ich nur sagen, dass es schwierig ist, detaillierte Anweisungen zu schreiben, die für alle zukünftigen Softwareversionen funktionieren. Aber ich versuche es.

Antwort2

Früher habe ich mkimage -A arm64 -T ramdisk -d busybox-1.32.1/initramfs.cpio.gz initrd.imgRamdisks erstellt.

verwandte Informationen