我试图验证在 QEMU 中运行的 Win 8.1 VM 是否能够获得磁盘(原始映像格式)和网卡的全部 VirtIO 优势。我读这个相关帖子并访问QEMU人机界面,发现显示:
bus: virtio-bus
type virtio-pci-bus
dev: virtio-blk-device, id ""
drive = "virtio0"
....
bus: virtio-bus
type virtio-pci-bus
dev: virtio-net-device, id ""
这使得它看起来正在使用 VirtIO,Windows 设备管理器显示 Red Hat VirtIO SCSI 磁盘设备和 Red Hat VirtIO 以太网适配器的事实也是如此。但是,当我在 Linux 主机上运行 lsmod 时,它没有显示任何已加载的 virtio 模块,并且当我检查 virtio 内核配置时,它也没有显示内置的 virtio、virtio_net 或 virtio_blk:
zcat /proc/config.gz | grep -i virtio
CONFIG_NET_9P_VIRTIO=m
CONFIG_VIRTIO_BLK=m
CONFIG_SCSI_VIRTIO=m
CONFIG_VIRTIO_NET=m
CONFIG_CAIF_VIRTIO=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_VIRTIO=m
# Virtio drivers
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
CONFIG_VIRTIO_MMIO=m
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
我使用如下命令运行我的虚拟机:
qemu-system-x86_64 -enable-kvm -cpu host -smp cores=2,threads=1 -drive file=filename.raw,index=0,media=disk,if=virtio,cache=none,format=raw -net nic,model=virtio,macaddr=xx:xx:xx:xx:xx:xx -net bridge,br=br0 -m 4096 -localtime
我在这里缺少什么?难道它是通过内核内置的 pci_virtio_legacy 支持来工作的吗?如果是这样,使用其他变体会更快吗?如果是这样,我是否只需确保在启动虚拟机之前加载 virtio、virtio_net 和 virtio_blk 模块?
答案1
维蒂奥后端位于 qemu 本身中,而不是位于主机内核中。 qemu 正在从 guest virtio 获取数据包前端网络驱动程序并将它们发送到您请求的桥接设备。
在主机内核中你可以有虚拟主机驱动程序优化了部分后端功能,即传递数据包。
看这篇博文。