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。

相关内容