U-Boot «Неправильный формат образа Ramdisk» с initramfs на BeagleBone black

U-Boot «Неправильный формат образа Ramdisk» с initramfs на BeagleBone black

Я следую книге «Освоение программирования для встраиваемых систем Linux. Второе издание» и пытаюсь загрузить ядро ​​Linux, смонтировав ramdisk.

У меня работает 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-карту и в u-boot на Beaglebone black попытался загрузиться как:

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безуспешно. Я пытался использовать mkimage внутри моей копии u-boot вместо того, который вы можете установить в Ubuntu (с помощью sudo apt-get install u-boot-tools).

Перед вызовом mkimage initramfs.cpio.gz выглядит следующим образом:

Сжатый файл ramdisk перед использованием mkimage

Я пропустил некоторые папки/файлы в своей файловой системе? Проблема в том, что на моем компьютере 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.

Связанный контент