BeagleBone black의 initramfs가 있는 U-Boot "잘못된 Ramdisk 이미지 형식"

BeagleBone black의 initramfs가 있는 U-Boot "잘못된 Ramdisk 이미지 형식"

나는 "임베디드 리눅스 프로그래밍 마스터하기 - 제2판"이라는 책을 읽고 있으며 램디스크가 설치된 리눅스 커널을 부팅하려고 합니다.

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를 사용하기 시작했을 때 이 문제를 해결하는 방법을 전혀 몰랐습니다. 원인을 찾아보니 파일 시스템 이미지 생성 오류였습니다. 나는 성공하지 못한 채 mkimage를 사용해 보았습니다 -c none. Ubuntu에 설치할 수 있는 mkimage 대신 u-boot 복사본으로 mkimage를 사용해 보았습니다(sudo apt-get install u-boot-tools 사용).

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있습니다.

관련 정보