我正在阅读《掌握嵌入式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 如下所示:
我的文件系统中是否缺少一些文件夹/文件?我的电脑有ext4但启动分区使用fat32是不是有问题?我需要使用不同的 mkimage 工具集吗?可能是什么问题呢?
答案1
简单回答
您需要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
格式。
作为本书的作者,我只能说,编写适用于所有未来版本软件的详细说明是很困难的。但我确实尝试过。
答案2
我以前mkimage -A arm64 -T ramdisk -d busybox-1.32.1/initramfs.cpio.gz initrd.img
做过ramdisk。