- OpenStack、kvm、qemu-kvm、libvirt之间的关系
-
qemu
qemu是一个独立的虚拟化解决方案,通过intel-VT或AMD SVM实现全虚拟化,安装切睦的系统,可以直接模拟出另一个完全不同的系统环境,虚拟机的创建通过qemu-image即可完成。QEMU本身可以不依赖KVM,但如果有kvm的存在并且硬件(处理器)支持比如intel-VT功能,那么qemu在对处理器虚拟化这一块可以利用KVM提供的功能来提升性能。 -
KVM
kvm是集成到Linux内核的Hypervisor是X86架构,并且硬件支持虚拟化技术(intel-VT或AMD-SVM)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事情,如任务调度、内存管理与硬件设备交互等。准确来说,kvm是Linux kernel的一个模块。可以用命令modprobe去加载KVM模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但是仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去做事情,你还必须有一个运行在用户空间的工具才行。这个用户空间的工具,kvm开发者选择了已经成型的开源虚拟化软件QEMU。其实qemu也是一个虚拟化软件,它的特点是可虚拟不同的cpu,比如说X86的cpu可虚拟一个power的cpu,并可利用它编译出可运行在power上的程序。kvm使用了qemu的一部分,并稍加改造,就成了可控制kvm的用户空间工具了,所以你会看到官方提供的kvm下载有2大部分(qemu和kvm)、3个文件(kvm模块、qemu工具以及二者的合集)。也就是说,你可以只升级KVM模块,也可以只升级qemu工具。这就是KVM和QEMU的关系。
kvm内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚拟化技术,也就是下面要说的qemu-kvm -
QEMU-KVM
qemu将kvm整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。kvm负责cpu虚拟化+内存虚拟化,实现这2者的虚拟化,但是kvm不能模拟其他设备。qemu模拟IO设备(网卡、磁盘等),kvm加上qemu之后就能实现真正意义上的服务器虚拟化。因为用到了kvm和qemu,所以称之为qemu-kvm
qemu模拟其他的硬件(如Network、Disk),同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk和virtio_net来提高设备性能。
-
LIBVIRT
-
概念
虚拟云实现的三部曲:虚拟化技术实现—>虚拟机管理—>集群资源管理(云管理)。各种不同的虚拟化技术都提供了基本的管理工具。比如启动、停用、配置、连接控制台等。这样在构建云管理的时候就存在2个问题:
(1)如果采用混合虚拟技术,上层就需要对不同的虚拟化技术调用不同的管理工具,很是麻烦。
(2)虚拟化技术发展很迅速,系统虚拟化和容器虚拟化均在发展和演化中,可能有新的虚拟化技术更加符合现在的应用场景,需要迁移过去,这样管理平台就需要大幅改动。为了适应变化,我们惯用的手段是分层,使之相互透明,在虚拟机和云管理中设置一个抽象管理层,libvirt就是扮演的这个角色。libvirt提供各种API,供上层来管理不同的虚拟机。
libvirt是管理虚拟机和其他虚拟化功能,比如存储管理、网络管理的软件集合。它包括一个API库、一个守护程序(libvirtd)和一个命令行工具(virsh)。libvirt本身构建于一种抽象的概念之上,它为受支持的虚拟机监控程序实现的常用功能提供通用的API。
libvirt的主要目标是为各种虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式。
b)功能
虚拟机管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。远程机器支持:只要机器上运行了libvirt daemon,包括远程机器,所有的libvirt功能就都可以访问和使用。支持多种网络远程传输,使用最简单的SSH,不需要额外配置工作。
存储管理:任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享,等等等等。因为libvirt可以远程工作,所有这些都可以通过远程主机使用。
网络接口管理:任何运行了libvirt daemon的主机都可以用来管理物理和逻辑的网络接口。
虚拟NAT和基于路由的网络:任何运行了libvirt daemon的主机都可以用来管理和创建虚拟网络。
c)体系架构
没有使用libvirt的虚拟机管理方式
上图—没有使用libvirt的虚拟机管理方式
为支持各种虚拟机监控程序的可扩展性,libvirt实施一种基于驱动程序的架构,该架构允许一种通用的API以通过方式为大量潜在的虚拟机监控程序提供服务。下图展示了libvirtAPI与相关驱动程序的层次结构。这里也需要注意,libvirt提供从远程应用程序访问本地域的方式。
使用libvirt的虚拟机管理方式libvirt的控制方式有两种:
1)管理应用程序和域位于同一节点上。管理应用程序通过libvirt工作,以控制本地域。
libvirt的控制方式12)管理应用程序和域位于不同节点上。该模式使用一种运行于远程节点上、名为libvirtd的特殊守护进程。当在新节点上安装libvirt时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序。该管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd。
libvirt的控制方式2 -
-
openstack, kvm, qemu-kvm及libvirt之间的关系
KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直接用它的。QEMU-KVM就是一个完整的模拟器,它是构建基于KVM上面的,它提供了完整的网络和I/O支持。Openstack不会直接控制qemu-kvm,它会用一个叫libvirt的库去间接控制qemu-kvm。libvirt提供了跨VM平台的功能,它可以控制除了QEMU之外的模拟器,包括vmware, virtualbox, xen等等。所以为了openstack的跨VM性,所以openstack只会用libvirt而不直接用qemu-kvm。libvirt还提供了一些高级的功能,例如pool/vol管理。