
initramfs와 함께 실행되는 자체 컴파일된 커널을 얻으려고 합니다. 그것은 오래된 라즈베리에서 작동했지만 어떻게 든 실행할 수 없습니다.
내가 정확히 하려는 일은 커널을 로드하고 initramfs를 "실행"한 다음 몇 가지 검사(시스템 업데이트 등)를 수행하고 마지막으로 squashfs 이미지를 마운트하고 해당 시스템에서 switch_root를 호출하는 것입니다.
그러나 커널은 initramfs의 init 실행을 거부합니다. cmdline.txt
/ 에서 다양한 설정을 시도했지만 config.txt
그 중 아무 것도 작동하지 않는 것 같습니다. 커널은 항상 일부 루트를 사용할 수 있을 때까지 기다립니다(또는 에서는 실패합니다 VFS: unable to mount root fs on unknown block
). 나는 일부 cmdline 설정(아마도 올바른 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
나는 처음부터 시작했고 몇 시간의 시행착오 끝에 내 문제의 원인에 도달했습니다. 그것은 기본적으로 어리석은 실수였습니다. 내 빌드 스크립트는 절대 경로를 사용하여 initramfs를 생성했습니다(예를 들어 그렇지 않지만 lib/libc.so
, 오히려 ~/Work/project/target/lib/libc.so
), 이는 분명히 커널이 초기 초기화를 찾지 못하게 만듭니다.
내가 배운 흥미로운 교훈은 내장된 initramfs가 외부 initramfs와 비교하여 약간 다르게 동작하는 것 같습니다. 즉, 내장된 initramfs가 존재할 때 init 스크립트의 echo 명령 등이 인쇄되지 않는다는 것입니다. 외부 initramfs를 만지작거리면서 포함된 것을 제거하는 것을 잊어버렸고, 그 결과 외부 init가 실행되었지만(그리고 그 하나만) 아무것도 인쇄되지 않았습니다. 내장된 initramfs를 제거한 후 작동했습니다.