kvm virtio功能配置

简介:

1.virtio(virtual i/0)  本文的原理性图片来源于书本<kvm虚拟化技术 实战与原理解析>

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

wKiom1g_493SeejsAAI4bhyfLrg983.png

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

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

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

                    wKiom1g_4TqxhIMXAABbJq29Ae4149.png-wh_50

 

    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

    wKioL1g_4U7im2EXAABIVfUKIxo781.png-wh_50





















本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1878559 ,如需转载请自行联系原作者



相关文章
|
存储 关系型数据库 MySQL
MySQL - 索引类型详解
MySQL - 索引类型详解
338 0
|
存储 缓存 安全
认识SMMU以及理理SMMU与TrustZone的联系?
认识SMMU以及理理SMMU与TrustZone的联系?
988 0
|
自然语言处理 Java Go
项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!
项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!
1023 0
|
安全 架构师 编译器
鲲鹏开发重点-–扭转x86乾坤的挑战,ARM64内存模型
因为X86及其CISC架构生态的封闭性,中国市场对未来处理器的选择,将是更开放、更模块化的RISC架构。 鲲鹏处理器就是符合这个潮流的创新产品和生态,将直面一系列挑战,和Apple一样赢得这场挑战,来扭转X86的封闭性的乾坤,创造出中国的处理器新生态。
1728 0
鲲鹏开发重点-–扭转x86乾坤的挑战,ARM64内存模型
|
9月前
|
消息中间件 存储 Kafka
分布式消息中间件设计与实现
本文深入探讨了消息中间件的核心功能实现与高并发、高可用设计。在生产者设计中,涵盖消息构造、序列化、路由策略及可靠性保障(如ACK机制)。消费者部分分析了拉取/推送模式、分区分配与消息确认机制。同时,Broker作为核心组件,负责消息路由、存储和投递,并通过索引技术实现快速检索。 高并发设计方面,重点讨论了文件存储(顺序写入、分段存储)、日志结构存储及负载均衡策略(如哈希分区、轮询分区)。为确保高可用性,文章详细解析了主从复制、故障转移机制以及同城/异地多活容灾方案。
|
10月前
|
缓存 前端开发 API
开发体育比分网站有哪些坑需要注意
开发体育比分网站需克服多方面挑战:数据来源上避免侵权,选用合法API;实时性上采用WebSocket等技术确保秒级更新;优化用户体验,极简设计配合实时动画;技术架构中使用缓存与微服务应对高并发;SEO方面通过SSR和服务端结构化数据提升搜索流量。示例代码展示了比赛数据的基本处理逻辑,包括设置比赛ID、状态、赢家信息及计划标记等功能。
330 62
开发体育比分网站有哪些坑需要注意
|
算法 API 开发工具
阿里云百炼平台综合评测
阿里云百炼作为一站式大模型开发平台,提供了从模型服务到应用开发的完整工具链。本文将基于实际搭建流程能力和模型训练的体验,对阿里云百炼平台进行详细评测。
951 3
|
安全 网络安全 数据安全/隐私保护
轻松部署SFTP并解决连接未设置密钥的报错
尊敬的读者们,大家好!SFTP是一种基于SSH的加密文件传输协议,可确保您的数据在传输过程中得到保护,是一种可信赖的文件传输解决方案。在实际生产环境中,连接第三方SFTP服务器是许多企业进行文件传输的常见需求。然而,有时候当第三方SFTP服务器切换节点后,我们的服务连接却会出现失败的情况。我们今天就遇到了这种情况,第三方服务因国产化需求切换到了新的节点,导致我们的服务连接sftp服务器失败。在本文中,我将与您分享这个问题的原因以及解决方法以及如何使用Docker Compose快速部署SFTP(Secure File Transfer Protocol)服务,帮助您轻松应对类似的挑战。
650 0
轻松部署SFTP并解决连接未设置密钥的报错
|
存储 数据库
飞腾uboot命令简单介绍
飞腾uboot命令简单介绍
1678 0
飞腾uboot命令简单介绍
|
存储 Java Linux
linux安装Zookeeper的详细步骤
linux安装Zookeeper的详细步骤
718 5