
Я следую книге «Освоение программирования для встраиваемых систем 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 выглядит следующим образом:
Я пропустил некоторые папки/файлы в своей файловой системе? Проблема в том, что на моем компьютере 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.