1.virtio(virtual i/0)  本文的原理性图片来源于书本

    virtio 是一个在hypervisor之上的api,它对客户机的i/o操作进行优化

kvm virtio功能配置_第1张图片

    使用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共享页,而是通过内存映射的方式直接写入到客户机的内存中

          kvm virtio功能配置_第2张图片

    使用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

    装完后,客户机会探测到相应驱动,并提醒我们安装

                    kvm virtio功能配置_第3张图片

 

    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功能配置_第4张图片