Linux虚拟化技术KVM、QEMU与libvirt的关系(转)

时间:2024-03-06 18:02:21

说明:个人理解,KVM是内核虚拟化技术,而内核是不能使用在界面上使用的,那么此时QEMU提供了用户级别的使用界面,相互辅助。当然,单独使用QEMU也是可以实现一整套虚拟机,不过QEMU+KVM基本是标配Linux虚拟机管理工具。

一、介绍:

主要分为三个部分。第一部分是虚拟化技术介绍;第二部分是KVM、QEMU与libvirt介绍,第三部分是对网卡的虚拟介绍。

第一部分:

这一部分是对当期存在的虚拟机技术进行简单的总结与讲解,很多是一句而过的。其实每一个技术都可以重新写出一篇内容丰富的博客,但是每个技术不是本篇文章的重点,所以不对每一个技术进行详细论述。欢迎对每个技术进行评论与纠错。

虚拟化定义:

虚拟化主要指的是特殊的技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)(IBM定义)。虚拟化为有效利用大型机的资源提供了技术支持。虚拟机技术也是多种多样,而可以虚拟的层次或者可虚拟的方面也是遍布从硬件到应用层整个计算机系统。如图片所示:

虚拟机分类:

虚拟机的分类也是多种多样。可以通过是否在裸机上部署来分为面向主机的的虚拟机和面向裸机的虚拟机。面向主机的虚拟机是指的在一台已经安装操作系统的主机上安装虚拟机管理(VMM)程序,而面向裸机的是指在裸机上直接安装虚拟机管理程序,所有的虚拟机调用都是直接由虚拟机管理程序来负责,没有了操作系统这一步,所以这种方式在效率上要高于面向主机的。不过,比较流行的技术比如vmware,Xen都是面向主机的。

然后根据上面的图去分类的话,可以分为对硬件的虚拟和对操作系统或者对软件的虚拟。在硬件虚拟化这个层面,又有三种不同的技术:

1、Full Virtualization(全虚拟化),几乎是完整地模拟一套真实的硬件设备。大部分操作系统无须进行任何修改即可直接运行在全虚拟化环境中。像KVM等技术是全虚拟化。

2、Partial Virtualization(部分虚拟化),仅仅提供了对关键性计算组件或者指令集的模拟。操作系统可能需要做某些修改才能够运行在部分虚拟化环境中。

3、Paravirtualization(半虚拟化),不对硬件设备进行模拟,虚拟机拥有独立的运行环境,通过虚拟机管理程序共享底层的硬件资源。大部分操作系统需要进行修改才能够运行在半虚拟化环境中。它的性能要稍微高于全虚拟化。像Xen。因为需要改动托管系统的内核,所以Xen是不支持win虚拟机的。

另外还有像硬件辅助虚拟化,就是宿主机的硬件架构在一定程度上提供对虚拟化的支持。像Intel-VT与AMD-V都提供了这等架构支持,请参考给出的参考资料。

软件层面的虚拟化,往往是指在同一个操作系统实例的基础上提供多个隔离的虚拟运行环境,也常常被称为容器技术。LXC(Linux Container)则是采用了这种技术,它主要是采用了Linux本身提供的技术,在一定程度上模拟虚拟化。软件虚拟化也可以理解成进程级虚拟机,其他虚拟化成为系统级虚拟机。在进程级虚拟机中负责虚拟化的软件成为运行时软件,而系统级虚拟机中负责虚拟化的软件成为VMM(Virtual Machine Monitor)

对于硬件与软件虚拟化两种技术,都是存在优点和缺点。对于硬件虚拟化,我们讨论全虚拟化和部分虚拟化。因为现在大部分的虚拟化技术Xen、KVM都支持这两种。硬件虚拟化基本上就是在一台宿主机上虚拟了整个系统,各台虚拟机之间相互不可见。这会很明显导致很多重复的线程和重复的内存页出现,性能上肯定会有影响。所以采用这种技术,一台宿主机上虚拟机的个数肯定会有一定限制。

对于软件虚拟化,我们讨论LXC,因为只有这一种我用过。LXC是通过cgroup对线程进行隔离,对资源进行限制;通过Namespace对调用系统提供的系统调用来进行资源隔离。LXC介绍。通过此也可以看出,它所有虚拟化出来的虚拟机都是运行在宿主机本身上的,它的线程和资源对宿主机都是可见的。这就不存在很多重复的线程和内存也的问题,所以一台宿主机上可以通过此技术虚拟出更多的虚拟机。

最近非常流行的Docker也是软件虚拟化的一种,它的原理也是使用了Linux提供的namespace对资源进行隔离,不过它提供了比LXC更强大的功能实现。

第二部分: 

这一部分就是主要介绍三个组件的不同功能,更多的细节亟待补充,也欢迎评论进行补充,纠错。

KVM介绍:

对于KVM来说,其是一款支持虚拟机技术,而且是Linux内核中的一个功能模块。它在Linux2.6.20之后的任何Linux分支中都被支持。它还有一个条件,对硬件要求的条件,必须达到一定标准的硬件架构。对于Intel-VT与AMD-V都是支持的。对于是否支持也可以通过命令行查看:egrep \'(vmx|svm)\' --color=always /proc/cpuinfo。如果有任何内容则说明当期硬件架构是支持KVM的,否则就不支持。另外,就算支持,但是在bios中是默认设置不打开该功能的,所以你还要去bios设置其为enable。当设置成功之后,还需要关机一次,注意是关机而不是重启。否则该设置的更改就不起效。

QEMU

QEMU是什么。其实它也是一款虚拟化技术,就算不使用KVM,单传的QEMU也可以完全实现一个虚拟机。那为何还会有QEMU-KVM这个名词那。是因为虽然KVM的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器。比如对网卡的虚拟,那这个时候就需要另外的技术来做补充,而QEMU-KVM则是这样一种技术。它补充了KVM技术的不足,而且在性能上对KVM进行了优化。

libvirt

libvirt又是个什么东东。它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术,KVM、Xen与lxc等,都可以调用libvirt提供的api对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且libvirt提供了多种语言的编程接口,可以直接通过编程,调用libvirt提供的对外接口实现对虚拟机的操作。如今流行的云计算中的IaaS是与该库联系相当密切的。通过下图可以看出它的架构设计思想。

 从该图可以看出,在libvirt api之上会有很多个driver,对于每一种虚拟机技术都会有一种driver,用来充当该虚拟机技术与libvirt之间的包装接口。如此设计就可以避免libvirt需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用libvirt提供的接口来完成自己所需要的功能。

第三部分:

这一部分主要讲解,在虚拟机中如何对网络进行虚拟,或者说如何连接网络的。

一般虚拟机虚拟网络的设置主要包括三种方式。主要如下:

NAT模式

也有人称此种模式为HOST(宿主)模式。在这种模式下虚拟机可以理解成没有自己的独立网卡。所有访问虚拟机的请求其实是直接发送给宿主机,然后通过访问宿主机转发到虚拟机上的。相应的虚拟机访问其他网络,也是先转发到宿主机然后在转发出去。对于宿主机之外的网络,是不知道该虚拟机存在的。

Bridge模式

桥接模式是使用比较多的模式,它是虚拟机拥有自己的独立网卡和IP,然后通过借用宿主机的网卡对外连接网络。它把宿主机的网卡当作了一种桥,通过这个桥连接外网的世界。在这种模式下,可以简单的理解成虚拟机和宿主机是两个不同的机器,有独立IP可以相互访问。对于虚拟机的IP获取,一般可以直接指定也可以通过DHCP获取得到。

Internal模式

这个是把虚拟机之间的网络和主机的网络隔离开来。虚拟机是一片网络,主机也是一片网络,彼此之间不能相互访问。

二、关系:

KVM虚拟机是基于Linux内核虚拟化,自Linux2.6.20之后就集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM的虚拟化需要硬件的支持(如intel VT技术或者AMD V技术),是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的para-virtualization,新版本是基于硬件支持的完全虚拟化。

QEMU是一种模拟处理器,现在运用最多的就是将KVM和QEMU结合起来。

准确来说,KVM是Linux Kernel的一个模块,可以用命令modprobe去加载KVM模块。加载了该模块后,才能进一步通过工具创建虚拟机。但是仅有KVM模块是不够的。因为用户无法直接控制内核去做事情,还必须有一个运行在用户空间的工具才行。这个用户空间的工具,KVM开发者选择了已经成型的开源虚拟化软件QEMU。说起来QEMU也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个power的CPU,并可利用它编译出可运行在power上的CPU,并可利用它编译出可运行在power上的程序。KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了。所以你会看到,官方提供的KVM下载有两大部分(QEMU和KVM)三个文件(KVM模块、QEMU工具以及二者的合集)。也就是说,你可以只升级KVM模块,也可以只升级QEMU工具。这就是KVM和QEMU 的关系。

如下图:

Linux Kernel-based Virtual Machine (KVM) 是一款 Linux 开放源码虚拟化软件,基于硬件虚拟化扩展(Intel VT-   X 和 AMD-V)和QEMU的修改版。KVM的实现模块又两个,分别是: kvm.ko是提供核心虚拟化的基础架构;特定于处理器的模块kvm-intel.ko和kvm-amd.ko 。其设计目标是在需要引导多个未改动的P 操作系统时支持完整的硬件模拟。

一个普通的Linux进程有两种运行模式:内核和用户。而KVM增加了第三种模式:客户模式(有自己的内核和用户模式)。在KVM模型中,每一个虚拟机都是由Linux调度程序管理的标准进程。

KVM由两个部分组成:一个是管理虚拟硬件的设备驱动,该驱动使用字符设备/dev/kvm作为管理接口;另一个是模拟PC硬件的用户空间组件,这是一个稍作修改的QEMU进程。 

 

参考:

VirtManager介绍 : http://virt-manager.org/

波佩克与戈德堡虚拟化需求:wiki波佩克与戈德堡虚拟化需求

Linux namespace介绍 :https://lwn.net/Articles/531114/

Intel-VT介绍:Intel-VT介绍

http://blog.csdn.net/zwan0518/article/details/10613481(以上内容部分转自此篇文章)

http://blog.chinaunix.net/uid-16361381-id-211999.html

http://blog.csdn.net/chdhust/article/details/7557791

https://www.cnblogs.com/bakari/p/7858029.html

http://blog.csdn.net/chdhust/article/details/7557791(以上内容部分转自此篇文章)