发生的事情是您试图以“过时”的方式引导Linux。那是initrd
一个ramdisk,而不是内核在ramfs中解压缩的cpio压缩归档文件,并且使用了旧方法切换到终端设备。
在这种模式下,内核将disk.img作为ramdisk挂载为根文件系统,然后/linuxrc
在其中执行。根据您的情况,很可能没有此类文件。/linuxrc
退出时(应该做任何事情来调出真正的根文件系统的块设备),然后内核会挂载真正的根文件系统。
上面的消息表明它成功安装了ram磁盘(1,0:1是ram
,所以/dev/ram0
),但不是真正的根文件系统/ dev / sda1(8,1:8是sd
,1是a1
)。大概是因为您没有指定内核命令行(-append
),所以/dev/sda1
它来自在内核编译时或使用传递的CONFIG_CMDLINE rdev
。
如果您的disk.img打算包含一个带有/sbin/init
... 的小型Linux发行版的根文件系统,那么您可能想要编写它:
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"
或者,您可以使用初始化ramfs代替初始化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
是静态链接版本),您将在该内核中获得一个shell和其他busybox实用程序。
请注意,内核现在/init
相对于该模式/linuxrc
或/sbin/init
以该模式运行。