linux:在qemu中运行自编译内核:VFS:无法在未知的wn-block(0,0)上挂载root fs

时间:2013-06-21 18:53:25

标签: linux kernel qemu vfs panic

我试着让它运转起来,不知道我做错了什么。我已经创建了一个Debian.img(原始格式的磁盘,带有虚拟设备管理器 - 我认为是libvirt)并安装了debian而没有任何麻烦。现在我想用自编译的内核运行它。我从我的工作(虚拟)debian复制了.config文件,并且没有进行任何更改。这就是我的工作:

    qemu-system-x86_64 -m 1024M -kernel /path/to/bzImage -hda /var/lib/libvirt/images/Debian.img -append "root=/dev/sda1 console=ttyS0" -enable-kvm -nographic

但是在启动过程中我总是收到此错误消息。

    [    0.195285] Initializing network drop monitor service
    [    0.196177] List of all partitions:
    [    0.196641] No filesystem could mount root, tried: 
    [    0.197292] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
    [    0.198355] Pid: 1, comm: swapper/0 Not tainted 3.2.46 #7
    [    0.199055] Call Trace:
    [    0.199386]  [<ffffffff81318c30>] ? panic+0x95/0x19e
    [    0.200049]  [<ffffffff81680f7d>] ? mount_block_root+0x245/0x271
    [    0.200834]  [<ffffffff8168112f>] ? prepare_namespace+0x133/0x169
    [    0.201590]  [<ffffffff81680c94>] ? kernel_init+0x14c/0x151
    [    0.202273]  [<ffffffff81325a34>] ? kernel_thread_helper+0x4/0x10
    [    0.203022]  [<ffffffff81680b48>] ? start_kernel+0x3c1/0x3c1
    [    0.203716]  [<ffffffff81325a30>] ? gs_change+0x13/0x13

我做错了什么?请有人帮忙。我需要传递-initrd选项吗?我已经试过了,但还没有运气。

5 个答案:

答案 0 :(得分:3)

我自己想通了。一段时间过去了,但我记得解决方案是提供一个初始的ramdisk。这就是我使用硬件加速的方法。

编译

make defconfig

CONFIG_EXT4_FS=y
CONFIG_IA32_EMULATION=y
CONFIG_VIRTIO_PCI=y (Virtualization -> PCI driver for virtio devices)
CONFIG_VIRTIO_BALLOON=y (Virtualization -> Virtio balloon driver)
CONFIG_VIRTIO_BLK=y (Device Drivers -> Block -> Virtio block driver)
CONFIG_VIRTIO_NET=y (Device Drivers -> Network device support -> Virtio network driver)
CONFIG_VIRTIO=y (automatically selected)
CONFIG_VIRTIO_RING=y (automatically selected)

---&GT;见http://www.linux-kvm.org/page/Virtio

在config

中启用paravirt

在HOST上禁用NMI监视程序以在GUEST上使用性能计数器。你可以忽略这一点。

cat /proc/sys/kernel/nmi_watchdog

---&GT;见http://kvm.et.redhat.com/page/Guest_PMU

从Qemu开始

sudo qemu-system-x86_64 -m 1024M -hda /var/lib/libvirt/images/DEbian.img -enable-kvm -initrd /home/username/compiled_kernel/initrd.img-3.2.46 -kernel /home/username/compiled_kernel/bzImage -append "root=/dev/sda1 console=ttyS0" -nographic -redir tcp:2222::22 -cpu host -smp cores=2

从KVM开始

Kernal路径:/ home / username / compiled_kernel / bzImage
Initrd路径:/home/username/compiled_kernel/initrd.img-3.2.46
内核参数:root = / dev / sda1

希望如果有人遇到同样的问题,这会有所帮助。

答案 1 :(得分:1)

也许您的系统映像文件很糟糕,无法安装。 您可以尝试使用这些命令来挂载映像文件并检查它是否是适用于linux的有效根文件系统。

losetup /dev/loop0 /var/lib/libvirt/images/Debian.img
kpartx -av /dev/loop0
mount /dev/mapper/loop0p1 /mnt/tmp

答案 2 :(得分:1)

这是针对 QEMU 案例上的 AArch64 (arm64)。

我正在学习这个很好的教程:https://ibug.io/blog/2019/04/os-lab-1/

就我而言,我遇到了此错误消息:

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

我在 initrd 中做了 mknod dev/ram b 1 0

后来我注意到在该行上方有一条错误消息,暗示内核不支持 ram 磁盘。所以我编辑了 .config 并设置了这些项目:

CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=131072 (= 128MB, the number is in unit of 1014B)

然后问题就解决了! initrd 挂载在 /dev/ram 上,第一个 init 进程运行良好。

事实证明,运行 make defconfig 并没有为我设置默认值。

答案 3 :(得分:0)

最可能的事情是内核不知道要启动的正确设备 您可以从qemu命令行显式提供。因此,如果根位于分区2上,您可以说:

qemu -kernel /path/to/bzImage \
     -append root=/dev/sda2 \
     -hda /path/to/hda.img \
     .
     .
     .

注意我使用 / dev / sda2 ,即使磁盘是IDE。甚至虚拟机现在似乎也在使用SATA。

其他可能性是,如@Houcheng所说,你的根FS已损坏,或者内核没有内置的特定FS类型。但我认为如果是这种情况你会得到一个不同的错误。< / p>

答案 4 :(得分:0)

QEMU版

QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.11), Copyright (c) 2003-2008 Fabrice Bellard

运行build-root 4.9.6,并传递以下参数

qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.qcow2 -boot c -m 128 -append root=/dev/sda -localtime -no-reboot -name rtlinux -net nic -net user -redir tcp:2222::22 -redir tcp:3333::3333

只接受/ dev / sda作为root fs挂载的选项(一旦启动它会显示root fs选项的一些提示并挂起以下错误):

VFS: Cannot open root device "hda" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
0800 61440 sda driver: sd