Linux

U-Boot“錯誤的 Ramdisk 圖像格式”在 BeagleBone black 上帶有 initramfs

  • July 20, 2020

我正在關注“Mastering Embedded Linux Programming - Second Edition”一書,試圖啟動安裝 ramdisk 的 Linux 核心。

我有 U-boot 2020.01 工作並製作了 Linux 核心映像。我在我的電腦上創建了一個文件系統,我在其中手動添加了busybox和它所需的庫作為so文件。這是我的文件系統中樹的摘要副本。

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

我按照片段創建了我的 ramdisk 映像:

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

我已將所有需要的文件放在 SD 卡中,並在 Beaglebone black 的 u-boot 中嘗試引導為:

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

問題是在 bootz 之後它抱怨我的 ramdisk 映像錯誤。

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

當我開始在嵌入式設備上使用 Linux 時,我完全不知道如何解決這個問題。我發現原因是文件系統映像創建錯誤。我嘗試使用 mkimage-c none無濟於事。我嘗試在我的 u-boot 副本中使用 mkimage,而不是您可以在 Ubuntu 中安裝的那個(使用 sudo apt-get install u-boot-tools)。

在呼叫 mkimage 之前,initramfs.cpio.gz 如下所示:

使用 mkimage 之前的 Ramdisk 壓縮文件

我的文件系統中是否缺少一些文件夾/文件?我的電腦有 ext4 但引導分區使用 fat32 是否有問題?我需要使用不同的 mkimage 工具集嗎?可能是什麼問題呢?

簡單的答案

您需要CONFIG_LEGACY_IMAGE_FORMAT在 U-Boot 中啟用:

  1. 轉到 u-boot 源目錄。
  2. 類型:$ make menuconfig
  3. 引導映像中 -> 啟用對舊映像格式的支持
  4. 退出並保存,然後再次建構 U-Boot

現在它將能夠載入您的 uRamdisk :-)

更長的答案

這本書是使用 U-Boot v2017.01 和配置 am335x_boneblack_defconfig 編寫的。U-Boot v2020.01 版沒有那個配置文件。相反,它具有 am335x_boneblack_vboot_defconfig,它工作正常,只是它不啟用對mkimage格式的支持。

作為本書的作者,我只能說很難寫出適用於所有未來軟體版本的詳細說明。但我會嘗試。

引用自:https://unix.stackexchange.com/questions/579640