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를 제거하면 작동했습니다.