设为首页 收藏本站
查看: 2860|回复: 0

[经验分享] kvm virtio功能配置

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-2 08:40:53 | 显示全部楼层 |阅读模式
1.virtio(virtual i/0)  本文的原理性图片来源于书本<kvm虚拟化技术 实战与原理解析>
    virtio 是一个在hypervisor之上的api,它对客户机的i/o操作进行优化
wKiom1g_493SeejsAAI4bhyfLrg983.jpg
    使用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共享页,而是通过内存映射的方式直接写入到客户机的内存中
          wKiom1g_5CnA6pj7AAEHj6CMf8E458.jpg
    使用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模块编译成内核,可以利用以下命令查看:
        [iyunv@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命令加载
                 [iyunv@localhost ~]# modprobe  virtio
                 [iyunv@localhost ~]# modprobe  virtio_ring
                 [iyunv@localhost ~]# modprobe  virtio_pci  
                 [iyunv@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
    装完后,客户机会探测到相应驱动,并提醒我们安装
                     QQ截图20161202084103.jpg

    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
    QQ截图20161202084110.jpg


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308432-1-1.html 上篇帖子: KVM使用NAT模式启动,错误:qemu-ifup-nat failed with status 256 下篇帖子: KVM之实现批量创建KVM虚拟机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表