BeagleBone black의 initramfs를 사용한 U-Boot "잘못된 Ramdisk 이미지 형식"

BeagleBone black의 initramfs를 사용한 U-Boot "잘못된 Ramdisk 이미지 형식"

나는 램디스크를 탑재한 Linux 커널을 부팅하려고 하는 "Mastering Embedded Linux 프로그래밍 - Second Edition"이라는 책을 따르고 있습니다.

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

다음 코드 조각에 따라 램디스크 이미지를 만들었습니다.

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 이후에 내 램디스크 이미지가 잘못되었다고 불평한다는 것입니다.

=> 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를 시작하면서 문제를 해결하는 방법에 대한 아이디어가 전혀 없습니다. 그 이유는 파일 시스템 이미지가 잘못 생성되었기 때문이라는 것을 알았습니다. 나는 -c none아무 소용이 없이 mkimage를 사용하려고 했습니다 . Ubuntu에 설치할 수 있는 것(sudo apt-get install u-boot-tools 사용) 대신 u-boot 복사본 내에서 mkimage를 사용해 보았습니다.

mkimage가 호출되기 전 initramfs.cpio.gz는 다음과 같습니다.

mkimage를 사용하기 전의 Ramdisk 압축 파일

내 파일 시스템에 일부 폴더/파일이 누락되었나요? 내 컴퓨터에는 ext4가 있는데 부팅 파티션에는 fat32를 사용하는 것이 문제인가요? 다른 mkimage 도구 세트를 사용해야 합니까? 무엇이 문제일까요?

답변1

간단한 대답

CONFIG_LEGACY_IMAGE_FORMATU-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램디스크를 만들곤 했는데요 .

관련 정보