initramfs를 사용하는 Raspberry Pi 2 사용자 정의 커널

initramfs를 사용하는 Raspberry Pi 2 사용자 정의 커널

initramfs로 실행하기 위해 자체 컴파일된 커널을 얻으려고 합니다. 오래된 Raspberry Pi에서 작동하지만 어떻게 든 작동하게 할 수 없습니다.

내가 하려는 일은 커널을 로드하고 initramfs를 "실행"한 다음 몇 가지 검사(시스템 업데이트 등)를 수행하고 마지막으로 squashfs 이미지를 설치하고 해당 시스템에서 switch_root를 호출하는 것입니다.

그러나 어떻게든 커널은 initramfs의 초기화 실행을 거부합니다. cmdline.txt/에서 다양한 설정을 시도했지만 config.txt아무것도 작동하지 않는 것 같습니다. 커널은 항상 일부 루트를 사용할 수 있을 때까지 기다립니다(또는 실패합니다 VFS: unable to mount root fs on unknown block). 나는 일부 명령줄 설정(정확할 수 있습니다 root=.... root=/dev/ram0작동하지 않음)이나 커널 플래그가 누락되었다고 가정합니다. 내 현재 명령줄: dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait, config.txt:initramfs initramfs.gz followkernel

전체 시스템을 부팅에 추가할 때 root=/dev/mmcblk0p6 roottype=ext4(커널 자체가 작동하는지 확인하기 위해 일부 test-linux를 추가합니다).

커널이 initramfs 지원( )으로 컴파일되었는지 확인했는데 BLK_DEV_INITRD=y, 불행하게도 initramfs를 커널 이미지로 컴파일하는 것은 옵션이 아닙니다. 커널(4.1 안정 버전)은 buildroot를 사용하여 컴파일됩니다. 커널 바이너리 형식은 zImage입니다(vmlinux에서는 작동하지 않는 것 같고 화면이 검은색으로 유지됩니다).

답변1

나는 처음부터 시작했고 몇 시간의 시행착오 후에 문제의 원인을 찾았습니다. 이는 기본적으로 어리석은 실수였습니다. 내 빌드 스크립트는 절대 경로(예를 들어 그렇지 않고 lib/libc.so다른 방법) 를 사용하여 initramfs를 생성했습니다. around ~/Work/project/target/lib/libc.so), 이로 인해 분명히 커널이 초기 초기화를 찾지 못하게 됩니다.

내가 배운 흥미로운 교훈은 내장된 initramfs가 외부 initramfs와 약간 다르게 동작한다는 것입니다. 즉, 내장된 initramfs가 있을 때 init 스크립트의 에코 명령 등이 인쇄되지 않습니다. 외부 initramfs를 수정하는 동안 내장된 initramfs를 제거하는 것을 잊어버렸고 이로 인해 외부 init가 실행되었지만(그리고 그것만) 아무것도 인쇄되지 않았습니다. 내장된 initramfs를 제거하면 작동했습니다.

관련 정보