
我正在閱讀《掌握嵌入式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。