
私は「Mastering Embedded Linux Programming - Second Edition」という本に従って、RAMディスクをマウントして Linux カーネルを起動しようとしています。
U-boot 2020.01 が動作しており、Linux カーネル イメージが作成されています。コンピューター上にファイル システムを作成し、busybox とそれに必要なライブラリをファイルとして手動で追加しました。以下は、ファイル システム内のツリーの要約コピーです。
├── 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
問題は、ブート後に、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
効果はありませんでした。Ubuntu にインストールできる mkimage (sudo apt-get install u-boot-tools を使用) ではなく、u-boot コピー内の mkimage を使用しようとしました。
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を作っていました。