สิ่งที่เกิดขึ้นคือคุณกำลังพยายามบูท Linux ด้วยวิธี "เลิกใช้" นั่นคือที่ที่initrd
เป็น ramdisk ซึ่งตรงข้ามกับที่เก็บถาวร cpio ที่ถูกบีบอัดโดยคลายเคอร์เนลใน ramfs และด้วยวิธีเก่าในการสลับไปยังอุปกรณ์ปลายทาง
ในโหมดนั้นเคอร์เนลจะเมานต์ disk.img เป็น ramdisk เป็นระบบไฟล์รูทและดำเนินการ/linuxrc
ในนั้น ในกรณีของคุณไม่มีไฟล์ดังกล่าว เมื่อ/linuxrc
(ซึ่งควรจะทำสิ่งที่จำเป็นในการนำอุปกรณ์บล็อกสำหรับระบบไฟล์รูทจริง) ออกจากนั้นเคอร์เนลจะเมาท์ระบบไฟล์รูทจริง
ข้อความข้างต้นแสดงให้เห็นว่ามันติดตั้ง ram disk เรียบร้อยแล้ว (1,0: 1 มีไว้สำหรับram
ดังนั้น/dev/ram0
) แต่ไม่ใช่ระบบไฟล์รูทจริง / dev / sda1 (8,1: 8 คือsd
, 1 คือa1
) สันนิษฐานว่าเนื่องจากคุณไม่ได้ระบุบรรทัดคำสั่งเคอร์เนล ( -append
) ที่/dev/sda1
มาจาก CONFIG_CMDLINE rdev
ผ่านที่รวบรวมเวลาเคอร์เนลหรือใช้
หาก disk.img ของคุณมีความหมายว่ามีระบบไฟล์รูทซึ่งพูดถึงการกระจาย Linux ขนาดเล็กที่มี/sbin/init
... คุณอาจต้องการเขียนแทน:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
จากนั้นเคอร์เนลจะรักษา RAM ดิสก์เป็นระบบแฟ้มรากที่แท้จริง (แม้ว่าคุณจะยังคงสามารถpivot_root
ไปยังอีกที่หนึ่ง)
เพื่อให้สามารถดูข้อความเคอร์เนลได้ง่ายขึ้นฉันขอแนะนำให้ใช้เอาต์พุตอนุกรม:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
คุณสามารถใช้ init ramfs แทน init ramdisk:
mkdir -p RAMFS/{bin,dev}
cd RAMFS/bin
cp /bin/busybox .
"$PWD/busybox" --install .
cd ..
cp -a /dev/{null,tty,zero,console} dev
printf '%s\n' "#! /bin/sh" "exec /bin/sh" > init
chmod +x init
find . | cpio -oHnewc | gzip > ../initramfs.gz
cd ..
kvm -kernel kernel.img -initrd initramfs.gz
(มีให้busybox
เป็นรุ่นที่เชื่อมโยงแบบคงที่) และคุณจะได้รับเชลล์และโปรแกรมอรรถประโยชน์ busybox อื่น ๆ ในเคอร์เนลนั้น
โปรดทราบว่าขณะนี้เคอร์เนลทำงาน/init
เหมือน/linuxrc
หรือตรงข้ามกับ/sbin/init
โหมดนั้น