U-Boot“錯誤的 Ramdisk 圖像格式”在 BeagleBone black 上帶有 initramfs
我正在關注“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 如下所示:
我的文件系統中是否缺少一些文件夾/文件?我的電腦有 ext4 但引導分區使用 fat32 是否有問題?我需要使用不同的 mkimage 工具集嗎?可能是什麼問題呢?
簡單的答案
您需要
CONFIG_LEGACY_IMAGE_FORMAT
在 U-Boot 中啟用:
- 轉到 u-boot 源目錄。
- 類型:
$ make menuconfig
- 在引導映像中 -> 啟用對舊映像格式的支持
- 退出並保存,然後再次建構 U-Boot
現在它將能夠載入您的 uRamdisk :-)
更長的答案
這本書是使用 U-Boot v2017.01 和配置 am335x_boneblack_defconfig 編寫的。U-Boot v2020.01 版沒有那個配置文件。相反,它具有 am335x_boneblack_vboot_defconfig,它工作正常,只是它不啟用對
mkimage
格式的支持。作為本書的作者,我只能說很難寫出適用於所有未來軟體版本的詳細說明。但我會嘗試。