Qemu模拟IO和半虚拟化Virtio的区别以及I/O半虚拟化驱动介绍

QEMU的基本原理和优缺点

基本原理:

使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序。QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回到I/O共享页,并通知KVM模块中的I/O操作捕获代码。最后,由KVM模块中的捕获代码读取I/O共享页中的操作结果,并把结果返回到客户机中。当然,这个操作过程中客户机作为一个QEMU进程在等待I/O时也可能被阻塞。另外,当客户机通过DMA(Direct Memory Access)访问大块I/O之时,QEMU模拟程序将不会把操作结果放到I/O共享页中,而是通过内存映射的方式将结果直接写到客户机的内存中去,然后通过KVM模块告诉客户机DMA操作已经完成。

优缺点:

QEMU模拟I/O设备的方式,其优点是可以通过软件模拟出各种各样的硬件设备,包括一些不常用的或者很老很经典的设备(如4.5节中提到RTL8139的网卡),而且它不用修改客户机操作系统,就可以实现模拟设备在客户机中正常工作。在KVM客户机中使用这种方式,对于解决手上没有足够设备的软件开发及调试有非常大的好处。而它的缺点是,每次I/O操作的路径比较长,有较多的VMEntry、VMExit发生,需要多次上下文切换(context switch),也需要多次数据复制,所以它的性能较差。

半虚拟化virtio的基本原理和优缺点

基本原理:

其中前端驱动(frondend,如virtio-blk、virtio-net等)是在客户机中存在的驱动程序模块,而后端处理程序(backend)是在QEMU中实现的。在这前后端驱动之间,还定义了两层来支持客户机与QEMU之间的通信。其中,“virtio”这一层是虚拟队列接口,它在概念上将前端驱动程序附加到后端处理程序。一个前端驱动程序可以使用0个或多个队列,具体数量取决于需求。例如,virtio-net网络驱动程序使用两个虚拟队列(一个用于接收,另一个用于发送),而virtio-blk块驱动程序仅使用一个虚拟队列。虚拟队列实际上被实现为跨越客户机操作系统和hypervisor的衔接点,但它可以通过任意方式实现,前提是客户机操作系统和virtio后端程序都遵循一定的标准,以相互匹配的方式实现它。而virtio-ring实现了环形缓冲区(ring buffer),用于保存前端驱动和后端处理程序执行的信息,并且它可以一次性保存前端驱动的多次I/O请求,并且交由后端去动去批量处理,最后实际调用宿主机中设备驱动实现物理上的I/O操作,这样做就可以根据约定实现批量处理而不是客户机中每次I/O请求都需要处理一次,从而提高客户机与hypervisor信息交换的效率。

优缺点:

Virtio半虚拟化驱动的方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能。所以,在使用KVM之时,如果宿主机内核和客户机都支持virtio的情况下,一般推荐使用virtio达到更好的性能。当然,virtio的也是有缺点的,它必须要客户机安装特定的Virtio驱动使其知道是运行在虚拟化环境中,且按照Virtio的规定格式进行数据传输,不过客户机中可能有一些老的Linux系统不支持virtio和主流的Windows系统需要安装特定的驱动才支持Virtio。不过,较新的一些Linux发行版(如RHEL 6.3、Fedora 17等)默认都将virtio相关驱动编译为模块,可直接作为客户机使用virtio,而且对于主流Windows系统都有对应的virtio驱动程序可供下载使用。

I/O半虚拟化驱动

I/O半虚拟化分成两段:
前端驱动(virtio前半段):virtio-blk,virtio-net,virtio-pci,virtio-balloon,virtio-console
支持的系统有:
Linux:CentOS 4.8+,5.4+,6.0+,7.0+
Windows:
virtio:虚拟队列,virt-ring
transport:后端处理程序(virt backend drivers):在QEMU中实现

常见的I/O设备半虚拟化:
(1)virtio-balloon:
ballooning:让VM中运行的GuestOS中运行调整其内存大小

     -balloon none   禁用balloon设备
     -balloon virtio[,addr=str]    启用半虚拟化balloon设备(默认项)
     手动查看GuestOS的内存用量:
          info balloon
          balloon N

     气球技术可以在客户机运行状态动态调整它所占的宿主内存资源,而不需要关闭客户机;
     故名思议,把内存当成气球一样来使用,气球中的内存可以被宿主机使用,但是不能被客户机直接使用和访问,所以当宿主机缺少内存是,balloon释放掉一部分内存,给宿主机使用;相反当客户机内存不够时,客户机吹从宿主机获取内存;

    优点:1)因为balloon可以被监控,和控制;2)而且balloon对内存的调度很灵活。
    缺点:1)客户机需要加载该驱动,而且不是每个系统都有该驱动,(virtio_balloon) ;2)如果有大量的内存从客户系统回收,会降低系统的运行; 3)目前没有比价方便,自动化管理balloon的机制,一般都采用qemu来管理。

(2)virtio-net:半虚拟化网卡
其依赖于GuestOS中的驱动,及Qemu中的后端驱动
GuestOS:virtio_net.ko
通过如下命令可以查看kvm宿主机支持的virtio模式:
Qemu:qemu-kvm -net nic,model=?

     [[email protected] ~]# qemu-kvm -net nic,model=?
     qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
     其返回值即为支持的virtio网卡模式,常见的有e1000, rtl8139, virtio等

     启动一个使用virtio_blk作为磁盘驱动的客户机,其qemu-kvm命令行如下。
     [[email protected] kvm_demo]# qemu-system-x86_64 -smp 2 -m 1024 -net nic -net tap –drive file=rhel6u3.img,if=virtio
     在客户机中,查看virtio_blk生效的情况如下所示。
     [[email protected] ~]# grep VIRTIO_BLK \ /boot/config-2.6.32-279.el6.x86_64
     CONFIG_VIRTIO_BLK=m
     [[email protected] ~]# lsmod | grep virtio
     virtio_blk              7292  3
     virtio_pci              7113  0
     virtio_ring             7729  2 virtio_blk,virtio_pci
     virtio                  4890  2 virtio_blk,virtio_pci
     性能优化:
     1)Host中的GSO,TSO:(详见:https://blog.csdn.net/quqi99/article/details/51066800)
         关掉可能会提升性能
              ethtool -K $IF gso off
              ethtool -K $IF tso off
              ethtool -K $IF

     2)vhost-net:用于取代工作于用户空间的qemu中为virtio-net实现的后端驱动以实现性能提升的驱动  (详见:https://blog.csdn.net/ponymwt/article/details/8895243)
        -net tap[,vnet_hdr=on|off][,vhost=on|off]
        qemu-kvm -net tap,vnet_hdr=on,vhost=on

(3)virtio-blk:半虚拟化磁盘
其依赖于GuestOS中的驱动,及Qemu中的后端驱动
-drive file=/path/to/some_image_file,if=virtio

    kvm_clock:半虚拟化的时钟
    #grep -i "paravirt" /boot/config-2.6.32-504.el6.x86_64
    CONFIG_PARAVIRT_GUEST=y
    CONFIG_PARAVIRT=y
    CONFIG_PARAVIRT_CLOCK=y

KVM虚拟机的实时迁移

支持的GuestOS: Linux, Windows, OpenBSD, FreeBSD, OpenSolaris;
在待迁入主机使用:
qemu-kvm -vnc :N -incoming tcp:0:7777
vncviewer :590N
在源主机使用:
monitor接口:
migrate tcp:DEST_IP:DEST:PORT
迁移需要考虑的影响:
整体迁移时间
服务器停机时间
对服务的性能的影响

原文地址:http://blog.51cto.com/jerry12356/2132284

时间: 2024-08-27 06:34:14

Qemu模拟IO和半虚拟化Virtio的区别以及I/O半虚拟化驱动介绍的相关文章

用QEMU模拟运行uboot从SD卡启动Linux

平台:Qemu + vexpress-a9 u-boot:u-boot-2019.10 Linux:linux-4.14.13 之前介绍过用Qemu模拟运行uboot,然后从网络启动linux(用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核),下面介绍用Qemu运行uboot,然后将存放在虚拟出来的SD卡里加载linux kernel.设备树,并运行. 一.编译uboot 下载最新的uboot,编译vexpress-a9: make ARCH=arm C

Virtio:针对 Linux 的 I/O 虚拟化框架

from:http://www.ibm.com/developerworks/cn/linux/l-virtio/ 概而言之,virtio 是半虚拟化 hypervisor 中位于设备之上的抽象层.virtio 由 Rusty Russell 开发,他当时的目的是支持自己的虚拟化解决方案 lguest.本文在开篇时介绍半虚拟化和模拟设备,然后探索 virtio 的细节.本文的重点是来自 2.6.30 内核发行版的 virtio框架. Linux 是 hypervisor 展台.如我的 剖析 Li

以Qemu模拟Linux,学习Linux内核

文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html维护日志:2013-02-21 建立文档(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明.文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖

利用qemu模拟嵌入式系统制作全过程

http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章,将介绍如何用qemu来搭建一个基于ARM的嵌入式linux系统.通过该文章,你可以学习到如何配置kernel,如何交叉编译 kernel,如何配置busybox并编译,如何制

利用 qemu 模拟嵌入式系统制作全过程

利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章将介绍如何用 Qemu 来搭建一个基于 ARM 的嵌入式 Linux 系统.通过该文章可以学习到如何配置和交叉编译 Kernel,如何配置 Busybox 并编译,如何制作 Initramfs,如何制作根文件系统,如何定制自己的 Uboot,如何通过 Uboot 向 Kernel 传递参数等.开始干活! 零.环境搭建 在实现我们的目标之前,我们需要搭建自己的工作环境.在这

RPi 2B QEMU 模拟树莓派

/******************************************************************************** * RPi 2B QEMU 模拟树莓派 * 说明: * 网络上有找到一些资料,不过在我的电脑上运行会出一些问题,经验证,需要提前 * 修改文件系统中的链接库和分区挂载表. * * 2017-5-21 台湾 中和区 曾剑锋 *********************************************************

Arduino101学习笔记(五)—— 模拟IO

1.配置IO管脚 //********************************************************************************************* //函数名称:void analogReference (uint8_t type); //输入参数:type: DEFAULT : 默认5V // INTERNAL: 低功耗模式 // EXTERNAL: 扩展模式. 通过AREF引脚获取参考电压 //函数返回:无 //函数功能:模拟IO

在qemu模拟的aarch32上使用kgtp

KGTP 介绍 KGTP 是一个能在产品系统上实时分析 Linux 内核和应用程序(包括 Android)问题的全面动态跟踪器. 使用 KGTP 不需要 在 Linux 内核上打 PATCH 或者重新编译,只要编译 KGTP 模块并insmod 就可以. 其让 Linux 内核提供一个远程 GDB 调试接口,于是在本地或者远程的主机上的 GDB 可以在不需要停止内核的情况下用 GDB tracepoint 和其他一些功能调试和跟踪Linux内核和应用程序. Github https://gith

【转帖】Linux系统上面qemu 模拟arm

零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢原作者. 由于最近的一个项目,需要用到qemu模拟arm系统跑程序,所以做了一次搭建,在网上找到了两篇文章,写得都很详细,其中一篇文章是对另外一篇文章进行的修改和添加,但是基于自己系统去做,还是发现了最新修改的文章过程中的一些错漏,加之想记录下此次自己的搭建,所以写下这篇博客. 参考博客文章(1):