사용자 정의 initramf가 감지되지 않음

사용자 정의 initramf가 감지되지 않음

비지박스 셸을 시작하도록 되어 있는 사용자 정의 initramfs가 있습니다. cpio 아카이브 에는 bin/busybox.init

busybox정적으로 연결된 바이너리입니다.

bin/busybox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, stripped

init다음 코드가 포함된 쉘 스크립트입니다.

#!/bin/busybox sh
export PATH=/bin
/bin/busybox --install -s /bin
sh

다음 명령을 사용하여 이미지를 만듭니다.

find | cpio -ovHnewc > ../initrd.img

실행하면 커널 패닉이 발생합니다.

# qemu-system-x86_64 -m 512M -enable-kvm -kernel /boot/vmlinuz -initrd ../initrd.img -append 'debug console=ttyS0 init=/bin/init' -nographic
… (booting)
[    2.175321] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

initramfs 이미지에 어떤 문제가 있나요? 빈 initramfs에서도 동일한 오류가 발생합니다. 내 배포판의 initramfs가 작동 중입니다.

답변1

초기화 스크립트가 시작하기에 너무 작은 것 같습니다. 커널은 /proc 및 /sys와 함께 작동하므로 다음을 포함해야 합니다.

mount -t proc none /proc
mount -t sysfs none /sys

답변2

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

init 스크립트를 찾을 수 없기 때문에 이 메시지가 표시됩니다. (init가 없으면 계속 시도하다가 rootfs 누락으로 인해 실패합니다.)

-append 'debug console=ttyS0 init=/bin/init'

그래야지 /init, 아니 /bin/init. 또는 다음을 지정할 수 있습니다.파일 시스템 초기화rdinit=매개변수에 따라 초기화관리 안내서/커널 매개변수.txt.

여부를 테스트하는 방법파일 시스템 초기화완전히 로드되어 통과되면 rdinit=/bin/busybox다음 메시지와 함께 종료되어야 합니다.

CPU: 0 PID: 1 Comm: busybox ...
[... lots of stuff ...]
Attempted to kill init!

Attempted to kill init!처음에 init 프로세스가 존재하는 경우에만 이 메시지를 받게 되므로 해당 프로세스가 어느 정도 성공적으로 로드되고 실행되었음을 알 수 있습니다. 그렇지 않고 init가 전혀 존재하지 않으면 현재 받은 메시지를 반환합니다.

또한 initrd 자체 내에서 모듈 로딩을 처리하지 않으려면 커널 자체가 initramfs( CONFIG_BLK_DEV_INITRD=y)는 물론 실행 가능한 스크립트()와 모듈 대신 내장 드라이버를 지원해야 합니다. CONFIG_BINFMT_SCRIPT=y따라서 여기서도 커널 구성이 중요합니다.

이미 이 페이지를 방문하셨는지 모르겠지만,Gentoo Wiki에는 Initramfs 사용자 정의에 대한 가이드가 있습니다.. 이는 또한 기본 환경을 얻는 방법을 보여줍니다 /dev /proc /sys.

관련 정보