【KVM系列03】KVM的I/O 全虚拟化和准虚拟化

本文详细介绍了KVM的I/O虚拟化,包括全虚拟化和准虚拟化(Para-virtualization)方法。全虚拟化中,QEMU模拟I/O设备,如网卡、磁盘,但性能较低。准虚拟化通过virtio驱动提高性能,减少I/O路径,如virtio-net和virtio-block。vhost-net作为内核级的virtio后端驱动,进一步提升网络性能。此外,文章还讨论了virtio-balloon内存气球设备以及RedHat的多队列Virtio技术,用于优化多CPU环境下的性能。
摘要由CSDN通过智能技术生成

                                                                                第三章 I/O 全虚拟化和准虚拟化


       1. 全虚拟化 I/O 设备

1.1 原理

1.2 QEMU 模拟网卡的实现

 1.3 RedHat Linux 6 中提供的模拟设备

1.4 qemu-kvm 关于磁盘设备和网络的主要选项

2. 准虚拟化 (Para-virtualizaiton) I/O 驱动 virtio

2.1 virtio 的架构

2.2 Virtio 在 Linux 中的实现

2.3 使用 virtio 设备 (以 virtio-net 为例)

2.4 vhost-net (kernel-level virtio server)

2.6 virtio-balloon

 2.7 RedHat 的 多队列 Virtio (multi-queue)

2.8 Windows 客户机的 virtio 前端驱动


【KVM系列文章】https://blog.csdn.net/baidu_37107022/article/details/88812463

 

在 QEMU/KVM 中,客户机可以使用的设备大致可分为三类:

1. 模拟设备:完全由 QEMU 纯软件模拟的设备。

2. Virtio 设备:实现 VIRTIO API 的半虚拟化设备。

3. PCI 设备直接分配 (PCI device assignment) 。

1. 全虚拟化 I/O 设备

KVM 在 IO 虚拟化方面,传统或者默认的方式是使用 QEMU 纯软件的方式来模拟 I/O 设备,包括键盘、鼠标、显示器,硬盘 和 网卡 等。模拟设备可能会使用物理的设备,或者使用纯软件来模拟。模拟设备只存在于软件中。 

1.1 原理

过程:

  1. 客户机的设备驱动程序发起 I/O 请求操作请求
  2. KVM 模块中的 I/O 操作捕获代码拦截这次 I/O 请求
  3. 经过处理后将本次 I/O 请求的信息放到 I/O 共享页 (sharing page),并通知用户空间的 QEMU 程序。
  4. QEMU 程序获得 I/O 操作的具体信息之后,交由硬件模拟代码来模拟出本次 I/O 操作。
  5. 完成之后,QEMU 将结果放回 I/O 共享页,并通知 KMV 模块中的 I/O 操作捕获代码。
  6. KVM 模块的捕获代码读取 I/O 共享页中的操作结果,并把结果放回客户机。 

注意:当客户机通过DMA (Direct Memory Access)访问大块I/O时,QEMU 模拟程序将不会把结果放进共享页中,而是通过内存映射的方式将结果直接写到客户机的内存中共,然后通知KVM模块告诉客户机DMA操作已经完成。

这种方式的优点是可以模拟出各种各样的硬件设备;其缺点是每次 I/O 操作的路径比较长,需要多次上下文切换,也需要多次数据复制,所以性能较差。 

1.2 QEMU 模拟网卡的实现

Qemu 纯软件的方式来模拟I/O设备,其中包括经常使用的网卡设备。Guest OS启动命令中没有传入的网络配置时,QEMU默认分配 rtl8139 类型的虚拟网卡类型,使用的是默认用户配置模式,这时候由于没有具体的网络模式的配置,Guest的网络功能是有限的。 全虚拟化情况下,KVM虚机可以选择的网络模式包括:

  1. 默认用户模式(User);
  2. 基于网桥(Bridge)的模式;
  3. 基于NAT(Network Address Translation)的模式;

分别使用的 qemu-kvm 参数为:

  • -net user[,vlan=n]:使用用户模式网络堆栈,这样就不需要管理员权限来运行.如果没有指 定-net选项,这将是默认的情况.-net tap[,vlan=n][,fd=h]
  • -net nic[,vlan=n][,macaddr=addr]:创建一个新的网卡并与VLAN n(在默认的情况下n=0)进行连接。作为可选项的项目,MAC地址可以进行改变.如果 没有指定-net选项,则会创建一个单一的NIC.
  • -net tap[,vlan=n][,fd=h][,ifname=name][,script=file]:将TAP网络接口 name 与 VLAN n 进行连接,并使用网络配置脚本文件进行 配置。默认的网络配置脚本为/etc/qemu-ifup。如果没有指定name,OS 将会自动指定一个。fd=h可以用来指定一个已经打开的TAP主机接口的句柄。

网桥模式是目前比较简单,也是用的比较多的模式,下图是网桥模式下的 VM的收发包的流程。

如图中所示,红色箭头表示数据报文的入方向,步骤:

  1. 网络数据从 Host 上的物理网卡接收,到达网桥;
  2. 由于 eth0 与 tap1 均加入网桥中,根据二层转发原则,br0 将数据从 tap1 口转发出去,即数据由 Tap设备接收;
  3. Tap 设备通知对应的 fd 数据可读;
  4. fd 的读动作通过 tap 设备的字符设备驱动将数据拷贝到用户空间,完成数据报文的前端接收。

(引用自 http://luoye.me/2014/07/17/netdev-virtual-1/

 1.3 RedHat Linux 6 中提供的模拟设备

  • 模拟显卡:提供2块模拟显卡。
  • 系统组件:
    • ntel i440FX host PCI bridge
    • PIIX3 PCI to ISA bridge
    • PS/2 mouse and keyboard
    • EvTouch USB Graphics Tablet
    • PCI UHCI USB controller and a virtualized USB hub
    • Emulated serial ports
    • EHCI controller, virtualized USB storage and a USB mouse
  • 模拟的声卡:intel-hda
  • 模拟网卡:e1000,模拟 Intel E1000 网卡;rtl8139,模拟 RealTeck 8139 网卡。
  • 模拟存储卡:两块模拟 PCI IDE 接口卡。KVM  限制每个虚拟机最多只能有4块虚拟存储卡。还有模拟软驱。

注意:RedHat Linux KVM 不支持 SCSI 模拟。

在不显式指定使用其它类型设备的情况下,KVM 虚机将使用这些默认的虚拟设备。比如上面描述的默认情况下 KVM 虚机默认使用rtl8139网卡。比如,在 RedHat Linxu 6.5 主机上启动KVM RedHat Linux 6.4 虚机后,登录虚机,查看 pci 设备,可以看到这些模拟设备:

当使用 “-net nic,model=e1000” 指定网卡model 为 e1000 时,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值