45321ttt 发表于 2016-12-2 08:40:53

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模块编译成内核,可以利用以下命令查看:
      # 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命令加载
               # modprobevirtio
               # modprobevirtio_ring
               # modprobevirtio_pci
               # lsmod |grep virtio                                    
               virtio_pci            69850                                                
               virtio_ring             89171 virtio_pci
               virtio                  49771 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
   

页: [1]
查看完整版本: kvm virtio功能配置