标签:kvm virtio
1.virtio(virtual i/0) 本文的原理性图片来源于书本<kvm虚拟化技术 实战与原理解析>
virtio 是一个在hypervisor之上的api,它对客户机的i/o操作进行优化
使用virtio前,一次客户机的i/o请求过程如下:
(1)客户机的通过设备驱动程序(device driver)发起i/o请求
(2)i/o请求被kvm中的i/o操作捕获代码(i/o trap code)捕获
(3)捕获代码把这些请求缓存在i/o共享页(sharing page)并且通知qemu仿真程序。
(4)qemu程序得到这些信息后,利用硬件模拟代码(Emulation Code)模拟本次i/o请求交给宿主机内核
(5)宿主机操作系统内核利用物理机驱动程序完成真实的i/o操作,并把执行返回结果向上逐层传递,最后响应给客户机
需要说明的是,如果客户机采用的是DMA(direct Memory Access)方式访问i/o的话,那么qemu程序不会把i/o请求的操作结果向上传递给i/o共享页,而是通过内存映射的方式直接写入到客户机的内存中
使用virtio后,客户拥有virtio驱动就会知道自己工作在虚拟环境下,所以把i/o请求转交给virtio驱动:
(1)客户机把i/o请求提交给virtio前端驱动(frondend,如virtio-blk、virtio-net等)
(2)前端驱动通过virtio虚拟队列接口把请求缓冲到virtio-ring环形缓冲区(ring-buffer)
(3)virtio后端驱动(virtio backend)把环形缓冲区的请求提交给宿主机内核
(4)内核利用物理驱动完成本次i/o请求,并把结果向上传递
因为利用virtio不用再把i/o请求额外再转换一次所以它的性能非常好,但是缺点是必须要客户机的操作系统支持,所以需要对客户机加载驱动
linux安装virtio驱动:
linux一般内核都把virtio模块编译成内核,可以利用以下命令查看:
[root@localhost ~]# cat /boot/config-2.6.32-431.el6.x86_64 |grep -i virtio
CONFIG_NET_9P_VIRTIO=m
CONFIG_VIRTIO_BLK=m
CONFIG_SCSI_VIRTIO=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_VIRTIO=m
CONFIG_VIRTIO_RING=m
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_BALLOON=m
lsmod 可以查看是否加载virtio模块,没有的话可以利用modprobe命令加载
[root@localhost ~]# modprobe virtio
[root@localhost ~]# modprobe virtio_ring
[root@localhost ~]# modprobe virtio_pci
[root@localhost ~]# lsmod |grep virtio
virtio_pci 6985 0
virtio_ring 8917 1 virtio_pci
virtio 4977 1 virtio_pci
window安装virtio驱动:
linux中有个名为virtio-win的rpm包,这个包提供有windows的virtio驱动镜像,我们可以把这个镜像利用cdrom驱动加载给客户机,然后在客户机中安装
没有装的话,可以安装virtio-win镜像yum源:
wget https://fedorapeople.org/groups/virt/virtio-win/virtio-win.repo -O /etc/yum.repos.d/virtio-win.repo
yum install virtio-win -y
装完默认会在/usr/share/virtio-win/下有对应的virtio-win驱动文件镜像,把它以cdrom驱动的方式呈现给客户机即可,命令如下:
qemu-system-x86_64 xp.qcow2 -smp 8 -m 4096 -cdrom /usr/share/virtio-win/virtio-win.iso -usbdevice tablet -usb -net nic,model=virtio -balloon virtio -device virtio-serial-pci -daemonize
装完后,客户机会探测到相应驱动,并提醒我们安装
qemu-system-x86_64 3个virtio驱动命令参数:
-balloon virtio :提供了virtio_balloon相关的设备
-net nic,model=virtio:提供了virtio_net相关的设备
-device virtio-serial-pci:提供了virtio_serial相关的设备
安装磁盘virtio驱动程序:
之所以把磁盘virtio独立出来讲,是因为如果我们按照上面方式把virtio驱动利用cdrom呈现给客户机,那么就会出现这样的问题:
如果我要启动系统,那么就必须先有virtio驱动(因为系统在virtio磁盘上),而如果我要安装virtio驱动,那么我就必须要先启动系统(virtio以cdrom方式呈现给系统)
在qemu中,为客户机启动磁盘virtio命令如下(-drive参数):
qemu-system-x86_64 -drive file=xp.qcow2,if=virtio -smp 8 -m 4096 -usbdevice tablet -usb -net nic,model=virtio -balloon virtio -device virtio-serial-pci -daemonize
尝试此命令会发现无法正常加载系统,解决方法有下面两种:
(1)使用一个带有virtio磁盘驱动的第三方可引导介质,类似于linux下的initrd文件系统,在系统启动前先去这个引导介质加载virtio驱动,然后再把控制权转交给操作系统
(2)仍然使用类似安装virtio pci、balloon、net的方式,但是额外使用一个非启动盘,将其指定为使用virtio驱动,这样在windows客户机系统会发现该盘没有合适驱动,从而我们可以从cdrom中为其安装合适驱动,(由于window安装驱动是跟win内核在一起的,且下次启动时这个驱动也会被加载进内核,这个是我的猜测,不权威)所以我们只需要安装一次即可,且重启后系统可以识别virtio磁盘。
方式(2)的操作过程如下:
创建虚拟磁盘,大小格式任意
qemu-img create -f qcow2 virtio_disk_driver 10M
额外加载这个virtio磁盘
qemu-system-x86_64 xp.qcow2 -drive file=virtio_disk_driver,if=virtio -cdrom /usr/share/virtio-win/virtio-win.iso -usb -usbdevice tablet -daemonize
安装完后,重启系统,同时把系统盘设为virtio磁盘
qemu-system-x86_64 -driver file=xp.qcow2,if=virtio -smp 8 -m 4096 -usbdevice tablet -usb -net nic,model=virtio -balloon virtio -device virtio-serial-pci -daemonize
标签:kvm virtio
原文地址:http://linzb.blog.51cto.com/5192423/1878559