5.1.5 使用virtio_blk
virtio_blk驱动使用Virtio API为客户机的提供了一个高效访问块设备I/O的方法。在QEMU/KVM对块设备使用virtio,需要两方面的配置:客户机中的前端驱动模块virtio_blk和宿主机中的QEMU提供后端处理程序。目前比较流行的Linux发行版一般都将virtio_blk编译为内核模块了,可以作为客户机直接使用virtio_blk,而windows中virtio驱动的安装方法已在5.1.2节中做了介绍。并且较新的qemu-kvm都是支持virtio block设备的后端处理程序的。
启动一个使用virtio_blk作为磁盘驱动的客户机,其qemu-kvm命令行如下。
[root@jay-linux kvm_demo]# qemu-system-x86_64 -smp 2 -m 1024 -net nic -net tap –drive file=rhel6u3.img,if=virtio
VNC server running on `::1:5900'
在客户机中,查看virtio_blk生效的情况如下所示。
[root@kvm-guest ~]# grep VIRTIO_BLK \ /boot/config-2.6.32-279.el6.x86_64
CONFIG_VIRTIO_BLK=m
[root@kvm-guest ~]# lsmod | grep virtio
virtio_blk 7292 3
virtio_pci 7113 0
virtio_ring 7729 2 virtio_blk,virtio_pci
virtio 4890 2 virtio_blk,virtio_pci
[root@kvm-guest ~]# lspci | grep -i block
00:04.0 SCSI storage controller: Red Hat, Inc Virtio block device
[root@kvm-guest ~]# lspci -vv -s 00:04.0
00:04.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 4
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 11
Region 0: I/O ports at c100 [size=64]
Region 1: Memory at febf2000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules: virtio_pci
[root@kvm-guest ~]# fdisk -l
Disk /dev/vda: 8589 MB, 8589934592 bytes
16 heads, 63 sectors/track, 16644 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000726b0
Device Boot Start End Blocks Id System
/dev/vda1 * 3 14826 7471104 83 Linux
/dev/vda2 14826 16645 916480 82 Linux swap / Solaris
可知客户机中已经加载virtio_blk等驱动,SCSI磁盘设备是使用virtio_blk驱动(上面查询结果中显示为virtio_pci,因为它是作为任意virtio的PCI设备的一个基础、必备的驱动)。使用virtio_blk驱动的磁盘显示为“/dev/vda”,这不同于IDE硬盘的“/dev/hda”或者SATA硬盘的“/dev/sda”这样的显示标识。
而“/dev/vd*”这样的磁盘设备名称可能会导致从前分配在磁盘上的swap分区失效,因为有些客户机系统中记录文件系统信息的“/etc/fstab”文件中有类似如下的对swap分区的写法。
/dev/sda2 swap swap defaults 0 0
或 /dev/hda2 swap swap defaults 0 0
原因就是换为“/dev/vda2”这样的磁盘分区名称未被正确识别,解决这个问题的方法就很简单了,只需要修改它为如下的形式并保存“/etc/fstab”文件,然后重启客户机系统即可。
/dev/vda2 swap swap defaults 0 0
如果启动的是已安装virtio驱动的Windows客户机,则在客户机的“设备管理器”中的“存储控制器”中看到的是正在使用“Red Hat VirtIO SCSI Controller”设备作为磁盘。