文章目录
1、开源虚拟化
1.1、 XEN
Dom0接管所有DomU,因此Dom0的资源要预留充足,类似VMM
使用XEN还需要编译更新所有驱动
1.2、 KVM (Kernel-based Virtual Machine)
KVM可以直接在内核进行管理
无需XEN的domain0
-
开源全虚拟化方案
- 支持体系结构
x86(32位,64位)、IA64、PowerPC、S390 - 依赖x86硬件支持:Intel VT-x / AMD-V
- 内核模块,是的linux内核成为Hypervisor
- 支持体系结构
-
云平台对KVM支持
- OpenStack,Eucalyptus,AbiCloud等
同时支持KVM和Xen
- OpenStack,Eucalyptus,AbiCloud等
-
KVM历史
- 2006年10月 以色列公司Qumranet发布KVM
- 2006年12月 KVM合入内核(linux 2.6.20rc)
- 2007年2月Linux2.6.20正式版发布
- 2008年9月 Redhat以1.07亿美元收购Qumranet
- 2009年9月 RHEL5.4开始支持KVM (同时支持Xen)
- 2010年11月 RHEL6.0之后仅支持KVM
KVM全称是Kernel-Based Virtual Machine。也就是说KVM是嵌入Linux操作系统标准内核中的一个虚拟化模块,是基于Linux内核实现的。KVM有一个内核模块叫做kvm.ko,只用于管理虚拟CPU和内存。
1.2.1、 KVM体系结构
virsh命令行管理工具 virsh list
virt-manager图形化界面管理工具
virt-viewer 屏幕管理工具
virt-install 虚拟机安装工具
1.2.2、KVM与Libvirt
- libvirt是目前使用最为广泛的多平台虚拟机管理工具和API(提供多种语言的API)
- KVM场景下,Libvirtd调用qemu-kvm管理虚拟机
- qemu和libvirtd均通过伪字符设备/dev/kvm来触发内核模块。
- virsh等虚拟机管理进程通过libvirt来对虚拟机进行查询等操作。
1.2.3 KVM IO虚拟化
KVM I/O虚拟化 - 全模拟
- 用软件完全模拟一个特定的设备
- 保持一样的软件蛋壳,如:PIO、MMIO、DMA、中断等
- 可以模拟出跟系统中的物理设备不一样的虚拟设备
- 每次I/O操作需要多次上下文切换
- VM <–> Hypervisor
- Qemu <–> Hypervisor
- 软件模拟的设备不影响虚拟机中的软件栈
- 原生驱动
- 原生驱动
这种全模拟存在大量数据拷贝,针对磁盘,网络这种大量IO操作的设备,模拟的设备性能较差。
KVM I/O操作流程 - 默认
KVM I/O虚拟化改进 - virtio
|
|
- 虚拟出特殊的设备
- 特殊的设备驱动,包括VM中的Front-end驱动和主机上的Back-end驱动
- Front-end和Back-end驱动之间的高效同行
- 减少VM和主机的数据参数开销
- 共享内存 – (Virt RING)
- Batched I/O
- 异步事件通知Eventfd轻量级进程间 “等待、通知” 机制
- 高效的标准化pv driver
- 兼容PCI:设备发现,配置,IRQ
- 支持多种虚拟化平台:KVM,Iguest
- 设备种类
- Virtio-blk,virtio-net,virtio-balloon,virtio-console,virtio-scsi,virtio-9p
KVM IO虚拟化对比
|
|
如图1,Guest OS需要把数据拷贝到kvm module的I/O共享页,kvm在通知qemu来读取数据,qemu在把数据交给硬件处理,kvm参与了数据和指令的过程。
而图2中Guest OS直接把数据放到队列vring中,然后通知kvm有数据生成了,kvm通知qemu去读取数据,kvm参与了指令过程。两者的区别在于图1反复拷贝数据,而图二省略掉kvm拷贝数据这一步骤,直接让Guest OS和QEMU通讯,减少了kvm参与的粒度,提高了I/O性能。
KVM I/O虚拟化再次改进 - vhost
- vhost-block、vhost-net、vhost-scsi
- 从VM来的IO请求会被直接map成host上的bio,可以有效减少虚拟机中的I/O的执行,性能更好,全端完全兼容vhost。
Linux操作系统默认携带VirtIO驱动
Windows操作系统默认不携带VirtIO驱动
现在虚拟化敏感指令不在由VMM调度,而是硬件直接支持。
Intel:VT-X
AMD:AMD-V
VT-d
SR-IOV
1.4、QEMU (Quick Emulator)
- Qemu(quickemulator)是一件模拟器,它可以模拟出VM所需要的任何资源,甚至是不同CPU类型。这些模拟出来硬件指令转译给真正的硬件。由于所有的指令- 都要从Qemu里面过一手,因而性能较差。
- KVM负责cpu虚拟化,内存虚拟化管理。
- QEMU和KVM整合,涌过IOCTL调用/dev/kvm接口,qemu模拟IO设备(网卡,磁盘等),实IO虚拟化
- 所以现在的虚拟化是qemu-kvm,虚机是qemu-kvm虚机
xen转为半虚拟化而生,而kvm为硬件辅助虚拟化而生。由于现在硬件都逐渐支持硬件辅助虚拟化,故kvm性能占据优势