Hypervisor, KVM, QEMU总结

 

Hypervisor

1.概念

Hypervisor——一种运行在基础物理服务器和操做系统之间的中间软件层,可容许多个操做系统和应用共享硬件。也可叫作VMM( virtual machine monitor ),即虚拟机监视器。linux

Hypervisors是一种在虚拟环境中的“元”操做系统。他们能够访问服务器上包括磁盘和内存在内的全部物理设备。Hypervisors不但协调着这些硬件资源的访问,并且在各个虚拟机之间施加防御。当服务器启动并执行Hypervisor时,它会加载全部虚拟机客户端的操做系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。git

2.做用

Hypervisor是全部虚拟化技术的核心。 非中断地支持多工做负载迁移的能力是Hypervisor的基本功能。vim

3.种类

目前市场上各类x86 管理程序(hypervisor)的架构存在差别,三个最主要的架构类别包括:服务器

I型:虚拟机直接运行在系统硬件上,建立硬件全仿真实例,被称为“裸机”型。
裸机型在虚拟化中Hypervisor直接管理调用硬件资源,不须要底层操做系统,也能够将Hypervisor看做一个很薄的操做系统。这种方案的性能处于主机虚拟化与操做系统虚拟化之间。网络

II型:虚拟机运行在传统操做系统上,一样建立的是硬件全仿真实例,被称为“托管(宿主)”型。托管型/主机型Hypervisor运行在基础操做系统上,构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter),使用者根据须要安装新的操做系统和应用软件,底层和上层的操做系统能够彻底无关化,如Windows运行Linux操做系统。主机虚拟化中VM的应用程序调用硬件资源时须要通过:VM内核->Hypervisor->主机内核,所以相对来讲,性能是三种虚拟化技术中最差的。架构

Ⅲ型:虚拟机运行在传统操做系统上,建立一个独立的虚拟化实例(容器),指向底层托管操做系统,被称为“操做系统虚拟化”。操做系统虚拟化是在操做系统中模拟出运行应用程序的容器,全部虚拟机共享内核空间,性能最好,耗费资源最
少。可是缺点是底层和上层必须使用同一种操做系统,如底层操做系统运行的是Windows系统,则VPS/VE就必须运行Windows。框架

Hypervisor示例图

厂商
目前市场主要厂商及产品:VMware vSphere、微软Hyper-V、Citrix XenServer 、IBM PowerVM、Red Hat Enterprise Virtulization、Huawei FusionSphere、开源的KVM、Xen、VirtualBSD等。编辑器

4.特色

软硬件架构和管理更高效、更灵活,硬件的效能可以更好地发挥出来。函数

5.多Hypervisor

服务器虚拟化须要评估、选择和部署hypervisor,组织一般会选择一种主流的hypervisor:VMware的ESXi、微软的Hyper-V或者思杰的XenServer。然而,对不少组织来讲,单独的hypervisor已经不能知足全部的虚拟化需求。这时候能够选择采用第二类hypervisor产品。随着服务器虚拟化技术的成熟,多hypervisor环境已经变得常见。可是,采用第二类虚拟化平台时,必需要仔细考虑其成本、部署范围和总开销。工具

QEMU和KVM

不一样的基于KVM的虚拟化平台,可能会采用不一样的虚拟化组件,目前主流的采用QEMU-KVM组件,但在不一样的产品里版本有所不一样,功能也有差别,下面就几个概念进行梳理下

KVM

Kernel-Based Virtual Machine 基于内核的虚拟机,是Linux内核的一个可加载模块,经过调用Linux自己内核功能,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,须要x86架构的,支持虚拟化功能的硬件支持(好比Intel-VT,AMD-V),是一种全虚拟化架构。KVM在2007年2月被导入Linux 2.6.20内核中。从存在形式来看,它包括两个内核模块:kvm.ko 和 kvm_intel.ko(或kvm_amd.ko),本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(由KVM自己建立)做为管理接口,主要负责vCPU的建立,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行。

KVM是linux内核的模块,它须要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再通过Qemu转译,直接运行,大大提升了速度,KVM经过/dev/kvm暴露接口,用户态程序能够经过ioctl函数来访问这个接口。见以下伪代码:

open("/dev/kvm")
ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)
for (;;) {
    ioctl(KVM_RUN)
        switch (exit_reason) {
        case KVM_EXIT_IO: 
        case KVM_EXIT_HLT:
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

QEMU

QEMU:是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的能够单独运行的软件,能够独立模拟出整台计算机,包括CPU,内存,IO设备,经过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具备了跨平台的通用性。QEMU有两种工做模式:系统模式,能够模拟出整个电脑系统,另外一种是用户模式,能够运行不一样与当前硬件平台的其余平台上的程序(好比在x86平台上运行跑在ARM平台上的程序);其代码地址 http://git.qemu.org/qemu.git ,有兴趣的同窗能够本身去看看,目前最新的版本是2.7.0,在0.9.1及以前版本还可使用kqemu加速器(能够理解为QEMU的一个插件,用来提升QEMU的翻译性能,支持Windows平台),但1.0之后版本就只能使用qemu-kvm(只支持Linux)进行加速了,1.3版本后QEMU和QEMU-KVM合二为一了。

QEMU示例图

QEMU-KVM

QEMU-KVM:从前面对KVM内核模块的介绍知道,它只负责CPU和内存的虚拟化,加载了它之后,用户就能够进一步经过工具建立虚拟机(KVM提供接口),但仅有KVM仍是不够的,用户没法直接控制内核去作事情(KVM只提供接口,怎么建立虚拟机,分配vCPU等并不在它上面进行),还必须有个运行在用户空间的工具才行,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来做为这个工具,并对其进行了修改,最后造成了QEMU-KVM。

在QEMU-KVM中,KVM运行在内核空间,QEMU运行在用户空间,实际模拟建立,管理各类虚拟硬件,QEMU将KVM整合了进来,经过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来作,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其余硬件设备,所以qemu还有模拟IO设备(磁盘,网卡,显卡等)的做用,KVM加上QEMU后就是完整意义上的服务器虚拟化。固然,因为qemu模拟io设备效率不高的缘由,如今经常采用半虚拟化的virtio方式来虚拟IO设备。

QEMU-KVM示例图

综上所述,QEMU-KVM具备两大做用:
1.提供对cpu,内存(KVM负责),IO设备(QEMU负责)的虚拟
2.对各类虚拟设备的建立,调用进行管理(QEMU负责)

libvirt

一个针对各类虚拟化平台的虚拟机管理的API库,一些经常使用的虚拟机管理工具如virsh(相似vim编辑器),virt-install,virt-manager等和云计算框架平台(如OpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt提供的应用程序接口。libvirt主要由三个部分组成:API库,一个守护进程 libvirtd 和一个默认命令行管理工具 virsh。

libvirt示例图

总结: 目前来讲,QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它自己本身能够作CPU和内存的模拟,只不过效率较低),而KVM是另外一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但自己不提供其余设备的虚拟化,借用了QEMU的代码进行了定制,因此KVM方案必定要依赖QEMU 即便后来RedHat后来开发了libvirt,也只能简单的认为是个虚拟机管理工具,仍然须要经过用户空间QEMU来与KVM进行交互。

相关文章
相关标签/搜索