本章为读者提供了Linux虚拟化中流行技术的深入看法,以及相较于其余同类技术的优点特色。本书共有14章,囊括了KVM虚拟化中的各个方面,从KVM的内部构造开始,并包括了诸如软件定义网络(SDN),性能调节和优化以及P2V(physical to virtual migration)等高级内容。node
在本章中,咱们将学习如下内容:linux
TIP:在开始学习以前,你能够前往本书的主页,查看相关的更新,技巧和更新状况 http://bit.ly/mkvmvirtgit
在哲学概念中,虚拟意味着“某些并不是真实存在的东西(something that is not real)”。在计算机科学中,虚拟的意思“一个并不是物理存在的硬件环境(a hardware environment that is not real)”。在这里,咱们复用物理硬件的功能,并用来运行操做系统。用来建立此类环境的相关技术,咱们称之为“虚拟化技术”,简称“虚拟化”。运行虚拟化软件(Hypervisor或者叫VMM,虚拟机监视器)的物理设施咱们称之为Host,安装在Hypervisor之上的虚拟机称为Guest。安全
User-mode Linux (UML) 是首个出如今Linux上的虚拟化技术。如今Linux上已经有许多种虚拟化技术可供选择,能够将一台主机虚拟成多台使用。比较流行的虚拟化技术包括KVM,XEN,QEMU以及VirtualBox。本书主要聚焦的是KVM虚拟化。服务器
开放性,灵活性和性能是Linux虚拟化吸引用户的几个主要因素。和其余的开源同样,Linux虚拟化技术是在一种合做的模式下获得发展的,这间接地使用户享受了开源软件便利和优点。举例来讲,相较于闭源模式,开源能够从社区得到普遍输入,间接帮助下降研究和开发支出,提高了效率,性能和生产力。开源模式鼓励创新。下面是一些开源带来的其余好处和优点:网络
简而言之,虚拟化是虚拟 硬件、网络、存储、程序、访问等资源的过程。所以,虚拟化技术能够应用在以上提到的多个内容当中。架构
例如:app
尽管如此,在本书的内容中,咱们主要讨论基于Hypervisor的软件虚拟化方面的内容。从这个视角来看,虚拟化隐藏了底层物理硬件,使其能够被多个操做系统共享和使用。这也被称为平台虚拟化。简而言之,这代表了在底层硬件和运行在它上面的操做系统间,有一个称为hypervisor/VMM的中间层。运行在Hypervisor之上的操做系统被称为Guest或者VM。负载均衡
让咱们来讨论一下虚拟化的一些好处:dom
正如咱们在前一节所讨论的,尽管虚拟化能够在不一样的领域实现,但我想更多地讨论操做系统虚拟化和软件虚拟化。
OS虚拟化技术容许同一物理主机服务不一样的工做负载,并隔离每一个工做负载。请注意,这些工做负载在相同的操做系统上独立运行。这容许物理服务器运行多个独立的操做系统实例,称为容器。这被称为基于容器的虚拟化技术也没有什么不对。此类虚拟化技术的优点是,Host的操做系统不须要模拟和自身OS不一样的的系统调用接口。因为上述接口不存在,所以在这种虚拟化中,其余操做系统没法被虚拟化或支持。这是此类虚拟化的常见且易于理解的限制。Solaris containers、FreeBSD jails和Parallel的OpenVZ都属于这一类虚拟化。在使用这种方法时,全部的工做负载都运行在单个系统上。进程隔离和资源管理由内核提供。虽然全部的虚拟机/容器在同一个内核中运行,它们也有本身独立的文件系统、进程、内存、设备等等。从另外一个角度来看,同一物理主机上的Windows、Unix和Linux工做负载的混合,并非这种虚拟化的一部分。可是性能和效率上带来的好处远超过该技术的局限性,由于一个操做系统就能够支持全部的虚拟环境。此外,从一个分区切换到另外一个分区的速度很是快。
在咱们进一步讨论虚拟化和深刻到下一种虚拟化类型以前(hypervisor-based /软件虚拟化),了解计算机科学中的一些术语是颇有用的。话虽如此,咱们仍是从“protection rings”开始吧。在计算机科学中,存在着各类分级保护域(hierarchical protection domains)/特权环(privileged rings)。在访问计算机系统中的资源时,这种安全机制用于保护数据或错误(These are the mechanisms that protect data or faults based on the security enforced when accessing the resources in a computer system.)。这些保护域有助于计算机系统的安全性。
如以前的图片显示,protection rings从最高特权到最低特权进行编号。ring 0是最高特权等级,它直接与物理硬件交互,例如CPU和内存等。诸如内存,IO端口和CPU指令的资源经过特权ring受到保护。ring 1和ring 2一般不被使用。大多数通用操做系统只使用两个ring,即便它们运行的硬件提供了更多的CPU模式。这两个主要的CPU模式被称为内核模式(kernel mode)和用户模式(user mode)。从操做系统的角度来看,Ring 0被称为kernel mode/supervisor mode,而Ring 3是user mode。正如你所想的同样,应用程序运行在Ring 3。
诸如Linux和Windows这样的操做系统使用supervisor/kernel 和 user mode。用户模式在没有调用内核状况下,几乎不能作任何事,由于它被限制了对内存、CPU和I/O端口的访问。内核能够在特权模式下运行,这意味着它们能够在ring 0上运行。为执行特定的函数,用户模式代码(全部应用程序运行在ring 3)必须执行supervisor mode或内核空间的系统调用,操做系统的可信代码将执行所需的任务并将执行结果返回给用户空间。简而言之,正常环境下OS运行在ring 0下。它须要最高特权级别来进行资源管理并提供对硬件的访问。如下图片解释了这一点:
ring大于0时在称为unprotected的处理器模式下运行指令。hypervisor/VMM须要访问主机的内存、CPU和I/O设备。由于,只有在ring 0中运行的代码才能执行这些操做,它须要运行在最高特权的ring 0,而且放置在靠近内核的地方。若是没有特定的硬件虚拟化支持,hypervisor/VMM运行在ring 0中,这基本上阻止了虚拟机操做系统运行在ring 0。因此VM的操做系统必须运行在ring1。在VM中安装的操做系统也须要访问全部资源,由于它并不能感知虚拟化层。为了实现这一点,它必须和VMM同样运行在ring 0中。因为同一时间只有一个内核能够运行在ring 0,因此Guest OS必须在另外一个具备更少特权的ring中,或者必须修改以在用户模式下运行。
这致使须要引入称为全虚拟化和半虚拟化的虚拟化方法,咱们将在下面的部分中进行讨论。
在全虚拟化中,经过模拟特权指令来克服由Guest OS运行在ring1和VMM运行在ring 0中所产生的限制。全虚拟化在第一代x86 VMM中普遍采用。它依靠例如二进制转译(binary translation)来捕获和虚拟化某些敏感和没法虚拟化的指令。也就是说,在二进制转换中,一些系统调用被解释执行和动态重写。下图描述了“Guest OS如何在ring 1下访问主机硬件,执行特权指令”以及“非特权指令是如何在无ring 1参与的状况下得到执行”。
经过这种方法,关键指令就会在运行时(静态或动态地)发现,取而代之的是陷入VMM中以软件仿真的方式执行。与运行在原生虚拟化架构上的虚拟机相比,二进制转换可能会带来巨大的性能开销。
然而,如前面的图像所示,当咱们使用全虚拟化时,咱们可使用未修改的客户操做系统。这意味着咱们没必要改变运行在VMM上的Guest OS 内核。当Guest OS内核执行特权操做时,VMM提供CPU仿真来处理和修改受保护的CPU操做,可是正如前面提到的,与其余虚拟化模式(称为半虚拟化)相比,这会将致使较大的性能开销。
在半虚拟化中,须要对Guest OS进行修改,以容许这些指令访问ring 0。换句话说,OS须要经过修改,以“hypercalls”的方式实现VMM/hypervisor和Guest OS的通讯。
NOTE:请注意,咱们也能够称VMM为hypervisor。
半虚拟化技术中hypervisor提供API接口,通过修改的Guest OS能够调用该接口。特权指令调用与VMM提供的API接口完成信息交换。在这种状况下,修改后的Guest OS能够在ring 0中运行。
正如你所见,在这种技术下Guest 内核须要通过修改而运行在VMM上。换句话说,虚拟化对Guest kernel是可感知的。本应在ring 0中运行的特权指令/操做已经被VMM提供的hypercalls所替代。hypercalls调用VMM执行本来由Guest OS完成的工做。因为Guest kernel有能力经过hypercalls直接与VMM进行通讯,所以与全虚拟化相比,这种技术的有更大的性能优点。然而这须要Guest kernel进行定制化以感知半虚拟化技术,须要软件支持。
Intel和AMD意识到x86架构(这本书的范围仅限于x86体系结构中,咱们将主要讨论这个架构的演变)全虚拟化和半虚拟化的主要挑战是性能开销问题和虚拟化解决方案在设计与维护上的复杂性。Intel和AMD各自独立地建立了新的x86架构的处理器扩展,分别称为Intel VT-x和AMD-v。在Itanium架构上,硬件辅助虚拟化称为VT-i。硬件辅助虚拟化是一种平台虚拟化技术,旨在有效地利用硬件功能执行全虚拟化。不一样的厂商对此技术有不一样的命名,包括虚拟化加速、硬件虚拟机和原生虚拟化。
为了更好地支持虚拟化,Intel和AMD分别引入了虚拟化技术(VT)和安全虚拟机(SVM),做为IA-32指令集的扩展。这些扩展容许VMM/hypervisor能够在较低的ring中,运行本来须要运行在内核模式下的Guest OS。硬件辅助虚拟化不只提出了新的指令,还引入了一个新的特权访问级别ring -1,用以运行hypervisor/VMM,所以Guest OS能够在运行在ring 0。此外,在硬件辅助虚拟化下,VMM/hypervisor与前面提到的其余技术相比能够执行更少的工做,从而下降了性能开销。
简单来讲,这种虚拟化感知的硬件提供了构建VMM的支持,并确保了客户操做系统的隔离。这有助于实现更好的性能,并避免了虚拟化解决方案设计上的复杂性。现代虚拟化技术利用这个特性提供虚拟化。一个例子是KVM,咱们将在本书的范围内详细讨论它。
顾名思义,VMM或hypervisor是负责监视和控制VM或Guest OS的软件。hypervisor/VMM负责确保不一样的虚拟化管理任务,例如提供虚拟硬件、VM生命周期管理、VM迁移、实时分配资源、定义虚拟机管理策略等。VMM/hypervisor还负责有效地控制物理平台资源,例如内存转换和I / O映射。虚拟化软件的主要优势之一是它可以在同一物理系统或硬件上的运行多个客户机。多个客户机系统能够在相同的操做系统或不一样的操做系统上。例如,能够有多个Linux Guest OS做为客户机运行在同一物理系统上。VMM负责分配这些Guest OS请求的资源。系统硬件(如处理器、内存等)必须根据它们的配置分配给这些客户操做系统,VMM负责处理这个任务。所以,VMM是虚拟化环境中的一个关键组件。
根据VMM/hypervisor的位置,能够被归类为type 1或type 2型。
hypervisor主要被归类为Type 1和Type 2型(基于它们驻留在系统中的位置)。可是对于Type 1和Type 2型hypervisor并无明确或标准的定义。若是VMM/hypervisor直接运行在硬件之上,它一般被认为是一个Type 1的hypervisor。若是有一个操做系统存在,VMM/hypervisor做为一个单独的层运行,它将被认为是一个Type 2 hypervisor。再一次申明,这个概念是开放的,没有标准的定义。
Type 1型的hypervisor直接与系统硬件交互;它不须要任何主机操做系统。您能够直接将其安装在裸金属系统上,用以运行虚拟机。类型1的管理程序也称为裸金属、嵌入式或原生hypervisor。
oVirt-node是Type 1型的Linux hypervisor的例子。下图提供对Type 1型hypervisor设计概念图:
如下是Type 1型hypervisor的优势:
然而,Type 1 hypervisor不支持自定义。通常状况下,您不能安装任何第三方应用程序或驱动程序。
另外一方面,Type 2 hypervisor驻留在操做系统之上,容许您进行大量的自定义。Type 2 hypervisor也被称为hosted hypervisor。Type 2 hypervisor依赖于主机操做系统的操做。Type 2 hypervisor的主要优势是普遍的硬件支持,由于它由底层主机操做系统控制硬件访问。下面的图提供了Type 2 hypervisor设计概念的说明:
决定使用哪一类hypervisor主要取决于您在何处部署虚拟化的基础设施。
还有一点是,与Type 2 hypervisor相比,Type 1 hypervisor执行性能更好,由于它们直接运行在硬件之上。没有对Type 1和Type 2 hypervisor的正式定义,评估性能没有多大意义。
下表列出了Linux中的开源虚拟化项目:
Project | Virtualization Type | Project URL |
KVM (Kernel-based Virtual Machine) | Full virtualizatio | http://www.linux-kvm.org/ |
VirtualBox | Full virtualizatio | https://www.virtualbox.org/ |
Xen | Full and paravirtualization | http://www.xenproject.org/ |
Lguest | Paravirtualization | http://lguest.ozlabs.org/ |
UML (User Mode Linux) | http://user-mode-linux.sourceforge.net/ | |
Linux-VServer | http://www.linux-vserver.org/Welcome_to_Linux-VServer.org |
在接下来的部分中,咱们将讨论Xen和KVM,这是Linux中领先的开源虚拟化解决方案。
Xen起源于剑桥大学的一个研究项目,初版在2003年正式对外发布。以后,剑桥大学负责这个项目的主管,Lan Pratt,与另一位来自剑桥大学的Simon Crosby合做创办了公司XenSource。这家公司开始以开源的方式开发这个项目。在2013年4月15日,Xen做为一个协做项目被移入Linux基金会。Linux基金会为Xen项目推出了一个新商标,以区分该项目与旧Xen商标的任何商业用途。更多细节能够在xenproject.org网站找到。
Xen hypervisor已经移植到一些处理器家族中,例如,Intel IA-32/64,x86_64,PowerPC,ARM,MIPS等等。
Xen能够在半虚拟化和硬件辅助或全虚拟化(HVM)上运行,HVM容许运行未经修改的Guest。Xen hypervisor运行Guest OS的组件称为Domains。在XEN中主要有两种类型的Domains:
Dom U是无特权域或客户系统(guest system)。Dom 0也被称为特权域或特殊客户(special guest),具备扩展功能。Dom U由Dom 0管理。Dom 0包含系统中全部设备的驱动程序。Dom 0还包含一个控制堆栈来管理虚拟机的建立、销毁和配置。Dom 0还具备直接访问硬件的特权;它能够处理对系统I/O功能的全部访问,并能够与其余虚拟机进行交互。Dom 0设置Dom Us,使用虚拟驱动与硬件设备通讯。Dom 0对外提供控制接口,能够经过该接口控制整个系统。Dom 0是系统启动的第一个VM,是Xen hypervisor的必备域。
基于内核的虚拟机(KVM)表明了最新的开源虚拟化技术。这个项目的目标是建立一个现代化的hypervisor,它创建在前几代技术的经验之上,并利用当今可用的现代硬件技术(VT-x,AMD-v)。
当您安装了KVM内核模块,KVM轻松的将Linux内核转换为一个hypervisor。尽管如此,因为hypervisor是一个标准的Linux内核,使得它能够从标准内核的更新中受益(内存支持,调度等)。对这些Linux组件的优化(如3.1内核中的新调度器)不只让hypervisor从中受益,也有利于Linux Guest OS。在I/O仿真方面,KVM使用了一个用户态软件QEMU;Qemu是一个负责硬件仿真的用户程序。
它负责模拟处理器和一长串外围设备:磁盘、网络、VGA、PCI、USB、串口/并行端口等,从而构建一个完整的虚拟硬件,能够安装Guest OS,并经过KVM的支持变得更增强大。
下图给出了KVM的用户模式和内核模式组件的高级概述:
在系统管理实用程序(如virsh和virt-manager)的请求下,libvirtd为每一个虚拟机启动了一个单独的qemu-kvm进程。虚拟机的属性(cpu数量、内存大小、I/O设备配置)是在单独的XML文件中定义的,这些文件位于/etc/libvirt/qemu目录中,libvirtd使用这些XML文件的详细信息来传递给qemu-kvm进程的参数列表。举例:
qemu 14644 9.8 6.8 6138068 1078400 ? Sl 03:14 97:29 /usr/bin/qemu-system-x86_64 -machine accel=kvm -name guest1 -S -machine pc--m 5000 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 7a615914-ea0d-7dab-e709-0533c00b921f -no-user-config -nodefaults -chardev socket,id=charmonitor-drive file=/dev/vms/hypervisor2,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native -device id=net0,mac=52:54:00:5d:be:06
在此处,相似于-m 5000的一个参数为虚拟机指定了5GB的内存,--smp=4指定了4个vCPU,它的拓扑结构为四个vSocket,每一个Socket有一个核心。
关于libvirt和qemu是什么以及它们是如何相互通讯的详细内容,将在第2章中进行了解释。
多年来,Linux已经成为开发云计算方案的首选。许多成功的公共云提供商使用Linux虚拟化来为底层基础设施提供助力。例如,亚马逊(Amazon)是最大的IaaS云提供商,它使用Xen虚拟化来为其EC2提供动力,一样KVM为Digital Ocean的发展提供了助力。Digital Ocean是世界上第三大云供应商。Linux虚拟化一样也在私有云领域占据主导地位。
如下是使用Linux虚拟化构建IaaS软件的开源云软件的列表:
在本章中,您了解了Linux虚拟化、它的优势以及不一样类型的虚拟化方法。咱们还讨论了hypervisor的类型,而后介绍了Xen和KVM的高级架构,以及流行的开源Linux虚拟化技术。
在下一章中,咱们将讨论libvirt、qemu和KVM的内部工做机理,并了解这些组件如何相互通讯以实现虚拟化。