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

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

我正在閱讀《掌握嵌入式Linux編程-第二版》一書,嘗試啟動安裝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 中安裝的 mkimage(使用 sudo apt-get install u-boot-tools)。

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

使用mkimage之前的Ramdisk壓縮文件

我的檔案系統中是否缺少一些資料夾/檔案?我的電腦有ext4但啟動分割區使用fat32是不是有問題?我需要使用不同的 mkimage 工具集嗎?可能是什麼問題呢?

答案1

簡單回答

您需要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格式。

身為本書的作者,我只能說,撰寫適用於所有未來版本軟體的詳細說明是很困難的。但我確實嘗試過。

答案2

我以前mkimage -A arm64 -T ramdisk -d busybox-1.32.1/initramfs.cpio.gz initrd.img做過ramdisk。

相關內容