云计算与虚拟化技术丛书
点击查看第二章
点击查看第三章
KVM实战:原理、进阶与性能调优
任永杰 程舟 著
第1章
虚拟化简介
在写作上一本书的时候(2013年),云计算虽然已经在国际上提出多年,但在国内还是刚刚兴起。到写作本书时这短短4年内,国内云计算已经翘首追赶,紧跟国际的步伐。例如阿里云,截至笔者写作时,阿里云已经连续7个季度3位数的同比增长率。老牌公司微软也在这几年加速追赶,在这个新的领域跻身一线。
1.1 云计算概述
1.1.1 什么是云计算
一直以来,云计算(Cloud Computing)的定义也如同它的名字一样,云里雾里,说不清楚。维基百科里是这样定义的:是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机各种终端和其他设备。以前,我们的信息处理(计算)是由一个实实在在的计算机来完成的,它看得见,摸得着。后来,随着计算硬件、网络技术、存储技术的飞速发展,人们发现,每个人独自拥有一台计算机似乎有些浪费,因为它大多数时候是空闲的。那么,如果将计算资源集中起来,大家共享,类似现代操作系统那样分时复用,将是对资源的极大节省和效率的极大提升,经济学上的解释也就是边际效应(成本)递减。科技行业的发展,根源也是经济利益的推动。在这样的背景下,云计算应运而生了。它就是把庞大的计算资源集中在某个地方或是某些地方,而不再是放在身边的那台计算机了;用户的每一次计算,都发生在那个被称为云的他看不见摸不着的某个地方。
以CPU为例,图1-1和图1-2摘选了从2000年到2017年上市的Intel桌面CPU的参数(主频、核数、LLC、制造工艺),从中可以大概看到CPU处理能力的飞速提升。它的另一面也就意味着,个人单独拥有一台计算机,从资源利用效率角度来看,被大大闲置了的。
1.1.2 云计算的历史
正式的云计算的产品始发于2006年,那年8月,亚马逊(Amazon)发布了“弹性计算云”(Elastic Compute Cloud)。2008年10月,微软宣布了名为Azure的云计算产品,并在2010年2月正式发布Windows Azure。Google也从2008年开始进入云计算时代,那年4月,其发布了Google App Engine Beta,但直到2013年12月,其Google Compute Engine对标AWS EC2才正式可用。
2010年7月,NASA和Rackspace共同发布了著名的开源项目Openstack。
从国内来看,2009年,阿里巴巴率先成立了阿里云部门,一开始只对内服务于其自身的电商业务,如淘宝、天猫。2011年7月,阿里云开始正式对外销售云服务。
无论是国内还是国外,云计算的市场都快速发展。“Amazon把云计算做成一个大生意没有花太长的时间:不到两年时间,Amazon上的注册开发人员达44万人,还有为数众多的企业级用户。有第三方统计机构提供的数据显示,Amazon与云计算相关的业务收入已达
1亿美元。云计算是Amazon增长最快的业务之一。”国内的阿里云也在2013年以后快速蓬勃发展。无论是国际巨头AWS(亚马逊)还是国内的阿里云,这些年都是快速增长,尤其阿里云,虽然体量暂时还远不及AWS,但一直都是超过100%的增长,让人侧目,如图1-3所示。
1.1.3 云计算的几种服务模型
“云计算是推动IT转向以业务为中心模式的一次重大变革。它着眼于运营效率、竞争力和快速响应等实际成果。这意味着IT的作用正在从提供IT服务逐步过渡到根据业务需求优化服务的交付和使用。这种全新的模式将以前的信息孤岛转化为灵活高效的资源池和具备自我管理能力的虚拟基础架构,从而以更低的成本和以服务的形式提供给用户。IT即服务将提供业务所需要的一切,并在不丧失对系统的控制力的同时,保持系统的灵活性和敏捷性。”
云计算的模型是以服务为导向的,根据提供的服务层次不同,可分为:IaaS(Infrastructure as a Service,基础架构即服务)、PaaS(Platform as a Service,平台即服务)、SaaS(Software as a Service,软件即服务)。它们提供的服务越来越抽象,用户实际控制的范围也越来越小,如图1-4所示。
1. SaaS,软件即服务
云服务提供商提供给客户直接使用软件服务,如Google Docs、Microsoft CRM、Salesforce.com等。用户不必自己维护软件本身,只管使用软件提供的服务。用户为该软件提供的服务付费。
2. PaaS,平台即服务
云服务提供商提供给客户开发、运维应用程序的运行环境,用户负责维护自己的应用程序,但并不掌控操作系统、硬件以及运作的网络基础架构。如Google App Engine等。平台是指应用程序运行环境(图1-4中的Runtime)。通常,这类用户在云环境中运维的应用程序会再提供软件服务给他的下级客户。用户为自己的程序的运行环境付费。
3. IaaS,基础设施即服务
用户有更大的自主权,能控制自己的操作系统、网络连接(虚拟的)、硬件(虚拟的)环境等,云服务提供商提供的是一个虚拟的主机环境。如Google Compute Engine、AWS EC2等。用户为一个主机环境付费。
从图1-4中可以看到,无论是哪种云计算服务模型,虚拟化(Virtualization)都是其基础。那么什么是虚拟化呢?
1.2 虚拟化技术
1.2.1 什么是虚拟化
维基百科关于虚拟化的定义是:“In computing, virtualization refers to the act of creating a virtual (rather than actual) version of something, including virtual computer hardware platforms, storage devices, and computer network resources。”(在计算机领域,虚拟化指创建某事物的虚拟(而非实际)版本,包括虚拟的计算机硬件平台、存储设备,以及计算机网络资源)可见,虚拟化是一种资源管理技术,它将计算机的各种实体资源(CPU、内存、存储、网络等)予以抽象和转化出来,并提供分割、重新组合,以达到最大化利用物理资源的目的。
广义来说,我们一直以来对物理硬盘所做的逻辑分区,以及后来的LVM(Logical Volume Manager),都可以纳入虚拟化的范畴。
结合图1-4来看,在没有虚拟化以前(我们抽掉Virtualization层),一个物理的主机(Sever、Storage、Network层)上面只能支持一个操作系统及其之上的一系列运行环境和应用程序;有了虚拟化技术,一个物理主机可以被抽象、分割成多个虚拟的逻辑意义上的主机,向上支撑多个操作系统及其之上的运行环境和应用程序,则其资源可以被最大化地利用。
如图1-5所示的Virtual Machine Monitor(VMM,虚拟机监控器,也称为Hypervisor)层,就是为了达到虚拟化而引入的一个软件层。它向下掌控实际的物理资源(相当于原本的操作系统);向上呈现给虚拟机N份逻辑的资源。为了做到这一点,就需要将虚拟机对物理资源的访问“偷梁换柱”—截取并重定向,让虚拟机误以为自己是在独享物理资源。虚拟机监控器运行的实际物理环境,称为宿主机;其上虚拟出来的逻辑主机,称为客户机。
虚拟化技术有很多种实现方式,比如软件虚拟化和硬件虚拟化,再比如准虚拟化和全虚拟化。下面将针对每种实现方式做一个简单的介绍。
1.2.2 软件虚拟化和硬件虚拟化
1.软件虚拟化技术
软件虚拟化,顾名思义,就是通过软件模拟来实现VMM层,通过纯软件的环境来模拟执行客户机里的指令。
最纯粹的软件虚拟化实现当属QEMU。在没有启用硬件虚拟化辅助的时候,它通过软件的二进制翻译仿真出目标平台呈现给客户机,客户机的每一条目标平台指令都会被QEMU截取,并翻译成宿主机平台的指令,然后交给实际的物理平台执行。由于每一条都需要这么操作一下,其虚拟化性能是比较差的,同时其软件复杂度也大大增加。但好处是可以呈现各种平台给客户机,只要其二进制翻译支持。
2.硬件虚拟化技术
硬件虚拟化技术就是指计算机硬件本身提供能力让客户机指令独立执行,而不需要(严格来说是不完全需要)VMM截获重定向。
以x86架构为例,它提供一个略微受限制的硬件运行环境供客户机运行(non-root mode),在绝大多数情况下,客户机在此受限环境中运行与原生系统在非虚拟化环境中运行没有什么两样,不需要像软件虚拟化那样每条指令都先翻译再执行,而VMM运行在root mode,拥有完整的硬件访问控制权限。仅仅在少数必要的时候,某些客户机指令的运行才需要被VMM截获并做相应处理,之后客户机返回并继续在non-root mode中运行。可以想见,硬件虚拟化技术的性能接近于原生系统,并且,极大地简化了VMM的软件设计架构。
Intel从2005年就开始在其x86 CPU中加入硬件虚拟化的支持—Intel Virtualization Technology,简称Intel VT。到目前为止,在所有的Intel CPU中,都可以看到Intel VT的身影。并且,每一代新的CPU中,都会有新的关于硬件虚拟化支持、改进的feature加入。也因如此,Intel x86平台是对虚拟化支持最为成熟的平台,本书将以Intel x86平台为例介绍KVM的虚拟化。
1.2.3 半虚拟化和全虚拟化
1.半虚拟化
通过上一节的描述,大家可以理解,最理想的虚拟化的两个目标如下:
1)客户机完全不知道自己运行在虚拟化环境中,还以为自己运行在原生环境里。
2)完全不需要VMM介入客户机的运行过程。
纯软件的虚拟化可以做到第一个目标,但性能不是很好,而且软件设计的复杂度大大增加。
那么如果放弃第一个目标呢?让客户机意识到自己是运行在虚拟化环境里,并做相应修改以配合VMM,这就是半虚拟化(Para-Virtualization)。一方面,可以提升性能和简化VMM软件复杂度;另一方面,也不需要太依赖硬件虚拟化的支持,从而使得其软件设计(至少是VMM这一侧)可以跨平台且是优雅的。“本质上,准虚拟化弱化了对虚拟机特殊指令的被动截获要求,将其转化成客户机操作系统的主动通知。但是,准虚拟化需要修改客户机操作系统的源代码来实现主动通知。”典型的半虚拟化技术就是virtio,使用virtio需要在宿主机/VMM和客户机里都相应地装上驱动。
2.全虚拟化
与半虚拟化相反的,全虚拟化(Full Virtualization)坚持第一个理想化目标:客户机的操作系统完全不需要改动。敏感指令在操作系统和硬件之间被VMM捕捉处理,客户操作系统无须修改,所有软件都能在虚拟机中运行。因此,全虚拟化需要模拟出完整的、和物理平台一模一样的平台给客户机,这在达到了第一个目标的同时也增加了虚拟化层(VMM)的复杂度。
性能上,2005年硬件虚拟化兴起之前,软件实现的全虚拟化完败于VMM和客户机操作系统协同运作的半虚拟化,这种情况一直延续到2006年。之后以Intel VT-x、VT-d为代表的硬件虚拟化技术的兴起,让由硬件虚拟化辅助的全虚拟化全面超过了半虚拟化。但是,以virtio为代表的半虚拟化技术也一直在演进发展,性能上只是略逊于全虚拟化,加之其较少的平台依赖性,依然受到广泛的欢迎。
1.2.4 Type1和Type2虚拟化
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为Typel和Type2,如图1-6所示。
Type1(类型1)Hypervisor也叫native或bare-metal Hypervisor。这类虚拟化层直接运行在硬件之上,没有所谓的宿主机操作系统。它们直接控制硬件资源以及客户机。典型地如Xen(见1.4.1节)和VMware ESX。
Type2(类型2)Hypervisor运行在一个宿主机操作系统之上,如VMware Workstation;或系统里,如KVM。这类Hypervisor通常就是宿主机操作系统的一个应用程序,像其他应用程序一样受宿主机操作系统的管理。比如VMware Workstation就是运行在Windows或者Linux操作系统上的一个程序而已。客户机是在宿主机操作系统上的一个抽象,通常抽象为进程。
1.3 KVM简介
1.3.1 KVM的历史
KVM全称是Kernel-based Virtual Machine,即基于内核的虚拟机,是采用硬件虚拟化技术的全虚拟化解决方案。
KVM最初是由Qumranet公司的Avi Kivity开发的,作为他们的VDI产品的后台虚拟化解决方案。为了简化开发,Avi Kivity并没有选择从底层开始新写一个Hypervisor,而是选择了基于Linux kernel,通过加载模块使Linux kernel本身变成一个Hypervisor。2006年10月,在先后完成了基本功能、动态迁移以及主要的性能优化之后,Qumranet正式对外宣布了KVM的诞生。同月,KVM模块的源代码被正式纳入Linux kernel,成为内核源代码的一部分。作为一个功能和成熟度都逊于Xen的项目,在这么快的时间内被内核社区接纳,主要原因在于:
1)在虚拟化方兴未艾的当时,内核社区急于将虚拟化的支持包含在内,但是Xen取代内核由自身管理系统资源的架构引起了内核开发人员的不满和抵触。
2)Xen诞生于硬件虚拟化技术出现之前,所以它在设计上采用了半虚拟化的方式,这让Xen采用硬件虚拟化技术有了更多的历史包袱,不如KVM新兵上阵一身轻。
2008年9月4日,Redhat公司以1.07亿美元收购了Qumranet公司,包括它的KVM开源项目和开发人员。自此,Redhat开始在其RHEL发行版中集成KVM,逐步取代Xen,并从RHEL7开始,正式不支持Xen。
1.3.2 KVM的功能概览
KVM从诞生开始就定位于基于硬件虚拟化支持的全虚拟化实现。它以内核模块的形式加载之后,就将Linux内核变成了一个Hypervisor,但硬件管理等还是通过Linux kernel来完成的,所以它是一个典型的Type 2 Hypervisor,如图1-7所示。
一个KVM客户机对应于一个Linux进程,每个vCPU则是这个进程下的一个线程,还有单独的处理IO的线程,也在一个线程组内。所以,宿主机上各个客户机是由宿主机内核像调度普通进程一样调度的,即可以通过Linux的各种进程调度的手段来实现不同客户机的权限限定、优先级等功能。
客户机所看到的硬件设备是QEMU模拟出来的(不包括VT-d透传的设备,详见6.2节),当客户机对模拟设备进行操作时,由QEMU截获并转换为对实际的物理设备(可能设置都不实际物理地存在)的驱动操作来完成。
下面介绍一些KVM的功能特性。
1.内存管理
KVM依赖Linux内核进行内存管理。上面提到,一个KVM客户机就是一个普通的Linux进程,所以,客户机的“物理内存”就是宿主机内核管理的普通进程的虚拟内存。进而,Linux内存管理的机制,如大页、KSM(Kernel Same Page Merge,内核的同页合并)、NUMA(Non-Uniform Memory Arch,非一致性内存架构)、通过mmap的进程间共享内存,统统可以应用到客户机内存管理上。
早期时候,客户机自身内存访问落实到真实的宿主机的物理内存的机制叫影子页表(Shadow Page Table)。KVM Hypervisor为每个客户机准备一份影子页表,与客户机自身页表建立一一对应的关系。客户机自身页表描述的是GVA→GPA的映射关系;影子页表描述的是GPA→HPA的映射关系。当客户机操作自身页表的时候,KVM就相应地更新影子页表。比如,当客户机第一次访问某个物理页的时候,由于Linux给进程的内存通常都是拖延到最后要访问的一刻才实际分配的,所以,此时影子页表中这个页表项是空的,KVM Hypervisor会像处理通常的缺页异常那样,把这个物理页补上,再返回客户机执行的上下文中,由客户机继续完成它的缺页异常。
影子页表的机制是比较拗口,执行的代价也是比较大的。所以,后来,这种靠软件的GVA→GPA→HVA→HPA的转换被硬件逻辑取代了,大大提高了执行效率。这就是Intel的EPT或者AMD的NPT技术,两家的方法类似,都是通过一组可以被硬件识别的数据结构,不用KVM建立并维护额外的影子页表,由硬件自动算出GPA→HPA。现在的KVM默认都打开了EPT/NPT功能。
2.存储和客户机镜像的格式
严格来说,这是QEMU的功能特性。
KVM能够使用Linux支持的任何存储来存储虚拟机镜像,包括具有IDE、SCSI和 SATA的本地磁盘,网络附加存储(NAS)(包括NFS和SAMBA/CIFS),或者支持iSCSI和光线通道的SAN。多路径I/O可用于改进存储吞吐量和提供冗余。
由于KVM是Linux内核的一部分,它可以利用所有领先存储供应商都支持的一种成熟且可靠的存储基础架构,它的存储堆栈在生产部署方面具有良好的记录。
KVM还支持全局文件系统(GFS2)等共享文件系统上的虚拟机镜像,以允许客户机镜像在多个宿主机之间共享或使用逻辑卷共享。磁盘镜像支持稀疏文件形式,支持通过仅在虚拟机需要时分配存储空间,而不是提前分配整个存储空间,这就提高了存储利用率。KVM 的原生磁盘格式为QCOW2,它支持快照,允许多级快照、压缩和加密。
3.实时迁移
KVM支持实时迁移,这提供了在宿主机之间转移正在运行的客户机而不中断服务的能力。实时迁移对用户是透明的,客户机保持打开,网络连接保持活动,用户应用程序也持续运行,但客户机转移到了一个新的宿主机上。
除了实时迁移,KVM支持将客户机的当前状态(快照,snapshot)保存到磁盘,以允许存储并在以后恢复它。
4.设备驱动程序
KVM支持混合虚拟化,其中半虚拟化的驱动程序安装在客户机操作系统中,允许虚拟机使用优化的 I/O 接口而不使用模拟的设备,从而为网络和块设备提供高性能的 I/O。
KVM 使用的半虚拟化的驱动程序是IBM和Redhat联合Linux社区开发的VirtIO标准;它是一个与Hypervisor独立的、构建设备驱动程序的接口,允许多种Hypervisor使用一组相同的设备驱动程序,能够实现更好的对客户机的互操作性。
同时,KVM也支持Intel的VT-d 技术,通过将宿主机的PCI总线上的设备透传(pass-through)给客户机,让客户机可以直接使用原生的驱动程序高效地使用这些设备。这种使用是几乎不需要Hypervisor的介入的。
5.性能和可伸缩性
KVM也继承了Linux的性能和可伸缩性。KVM在CPU、内存、网络、磁盘等虚拟化性能上表现出色,大多都在原生系统的95%以上。KVM的伸缩性也非常好,支持拥有多达288个vCPU和4TB RAM的客户机,对于宿主机上可以同时运行的客户机数量,软件上无上限。
这意味着,任何要求非常苛刻的应用程序工作负载都可以运行在KVM虚拟机上。
1.3.3 KVM的现状
至本书写作时,KVM已经10周岁了。10年之间,得益于与Linux天然一体以及Redhat的倾力打造,KVM已经成为Openstack用户选择的最主流的Hypervisor(因为KVM是Openstack的默认Hypervisor)。来自Openstack的调查显示,KVM占到87%以上的部署份额,并且(笔者认为)还会继续增大。可以说,KVM已经主宰了公有云部署的Hypervisor市场;而在私有云部署方面,尤其大公司内部私有云部署,还是VMware的地盘,目前受到HyperV的竞争。
功能上,虚拟化发展到今天,各个Hypervisor的主要功能都趋同。KVM作为后起之秀,并且在公有云上广泛部署,其功能的完备性是毋庸置疑的。并且由于其开源性,反而较少一些出于商业目的的限制,比如一篇文章(ftp://public.dhe.ibm.com/linux/pdfs/Clabby_Analytics_-_VMware_v_KVM.pdf)
中比较VMware EXS 与KVM,就是一个例子。
性能上,作为同样开源的Hypervisor,KVM和Xen都很优秀,都能达到原生系统95%以上的效率(CPU、内存、网络、磁盘等benchmark衡量),KVM甚至还略微好过Xen一点点。与微软的Hyper-V相比,KVM似乎略逊于最新的Windows 2016上的HyperV,而好于Windows 2012 R2上的HyperV,但这是微软的一家之言,笔者没有重新测试验证。其他与诸如VMware EXS等的性能比较,网上也可以找到很多,读者可以自行搜索。总的来说,即使各有优劣,虚拟化技术发展到今天已经成熟,KVM也是如此。
1.3.4 KVM的展望
经过10年的发展,KVM已经成熟。那么,接下来KVM会怎样进一步发展呢?
1)大规模部署尚有挑战。KVM是Openstack和oVirt选择的默认Hypervisor,因而实际的广泛部署常常是大规模的(large scale, scalability)。这种大规模,一方面指高并发、高密度,即一台宿主机上支持尽可能多的客户机;另一方面,也指大规模的单个客户机,即单个客户机配备尽可能多的vCPU和内存等资源,典型的,这类需求来自高性能计算(HPC)领域。随着硬件尤其是CPU硬件技术的不停发展(物理的processor越来越多),这种虚拟化的大规模方面的需求也在不停地增大,并且这不是简单数量的增加,这种增加会伴随着新的挑战等着KVM开发者去解决,比如热迁移的宕机时间(downtime)就是其中一例。
2)实时性(Realtime)。近几年一个新的趋势就是NFV(Network Functions Virtualization,网络功能的虚拟化),它指将原先物理的网络设备搬到一个个虚拟的客户机上,以便更好地实现软件定义网络的愿景。网络设备对实时性的要求是非常高的;而不巧,NFV的开源平台OPNFV选择了Openstack,尽管Openstack向下支持各种Hypervisor,但如前文所说,KVM是其默认以及主要部署的选择,所以NFV实时性的要求责无旁贷地落到了KVM头上,NFV-KVM项目应运而生,它作为OPNFV的子项目主要解决KVM在实时性方面受到的挑战。
3)安全是永恒的主题/话题。就像网络病毒永远不停地演变推陈出新一样,新时代的IT架构的主体,云/虚拟化,也会一直受到各类恶意攻击的骚扰,从而陷入道高一尺魔高一丈的循环。Hypervisor的开发者、应用者会一直从如何更好地隔离客户机、更少的Hypervisor干预等方面入手,增加虚拟化的安全性。KVM作为Type 2的Hypervisor,天然地与Host OS有关联,安全性方面的话题更引人注目。同时,硬件厂商如Intel,也会从硬件层面不停地推出新的安全方面的功能(feature),KVM从软件方面也要跟上脚步,使能(enable)之。
4)性能调优。如同一句广告词说的:“进无止境”。一方面,新的功能代码的不停引入总会给性能调优开辟新的空间;另一方面,老的功能的实现也许还有更好的方法。还有,新的硬件功能的出现,也是性能调优永恒的动力源泉。
1.4 其他的虚拟化解决方案简介
1.4.1 Xen
Xen的出现要早于KVM,可以追溯到20世纪90年代。剑桥大学的Ian Pratt和Keir Fraser在一个叫作Xenoserver的研究项目中开发了Xen虚拟机。在那个年代,硬件虚拟化还没有出现,所以Xen最开始采用的是半虚拟化的解决方案。
Xen 在2002年开源,并在2003年发布了1.0版本、2004年发布了2.0版本,随即被Redhat、Novell和Sun的Linux 发行版集成,作为其虚拟化组件。2005年的3.0版本开始加入Intel和AMD的硬件虚拟化的支持,以及Intel的IA64架构,从此,Xen也提供全虚拟化解决方案(HVM),可以运行完全没有修改的客户机操作系统。2007年10月,思杰公司出资5亿美元收购了XenSource,变成了Xen项目的东家。2013年,Xen成为Linux基金会赞助的合作项目。
Xen在架构上是一个典型的Type 1 Hypervisor,与KVM形成鲜明对比,如图1-8所示。严格来说,它没有宿主机的概念,而是由Xen Hypervisor(VMM)完全管控硬件,但用户却看不见、摸不着它,只能通过特殊的0号虚拟机(Dom0),通过其中xl 工具栈(tool stack)与Xen Hypervisor交互来管理其他普通虚拟机(DomU)。0号虚拟机是一个运行修改过的半虚拟化的内核的Linux虚拟机。从架构上,Xen的虚拟化方案既利用了Linux内核的IO部分(Dom0的内核),将Linux内核的CPU、内存管理等核心部分排除在外由自己接手(Xen Hypervisor),所以,一开始就受到了Linux内核开发人员的抵制,致使Linux内核作为Dom0对Xen的支持部分一直不能合入Linux内核社区。一直到2010年,在采用基于内核的PVOPs方式大量重写了Xen代码以后,才勉强合入Linux内核社区。2011年,从Linux内核2.6.37版本开始,正式支持Xen Dom0。
1.4.2 VMware
VMware成立于1998年,是最早专注于虚拟化商业软件(并成功)的公司,从它的名字也可以看出它对自己的定位和目标。从十几年前虚拟化软件兴起开始,它就是这个市场的霸主。笔者早年的认知也是虚拟化=VMware。直到最近,在公有云兴起的背景之下,VMware开始受到KVM和Xen等开源项目以及微软Azure/HyperV的挑战。VMware最初是由一对夫妇等几人创立的,2004年被EMC收购。2016 年,EMC又被Dell收购,所以现在VMware是Dell旗下的子公司。
VMware从诞生起就一直专注于虚拟化,其产品线非常全,既有PaaS产品,也有IaaS产品;既有Hypervisor,也有应用管理、存储管理等配套软件;既有面向个人用户的桌面级虚拟化产品,也有面向企业的服务器级产品;既有运行于Linux平台上的产品,也有Windows和Mac平台上的产品。本书只选择最著名的两款产品给大家简单介绍下,更多更详细的信息大家可以到它的官网查看。
1. VMware Workstation
VMware Workstation是VMware最早的产品,也是最广为人知的产品,1999年发布。在刚开始的时候,还没有硬件虚拟化技术,所以它是采用二进制翻译的方式实现虚拟化的。但是由于它的二进制翻译技术独步当时,性能还很出色,尤其跟当时同类产品相比。可以说,是VMware Workstation奠定了VMware在虚拟化软件行业的地位。VMware Workstation是桌面级虚拟化产品,运行在Windows、Linux和Mac操作系统上,是Type 2 Hypervisor。使用它需要购买License,但VMware同时提供了与Workstation功能类似,只是有所删减的Workstation Player,供大家非商业化地免费使用。
2. VMware ESXi
VMware ESXi是服务器级的虚拟化软件。与Workstation不同,它直接运行在硬件平台上,是Type1 Hypervisor。在架构上与Xen有些相像,是现在VMware的拳头产品,大多数大公司的私有云都是用它搭建的。除了vMotion(即Live Migration功能)、HA(High Availability,指软硬件运行的不间断地冗余备份)等业界常见功能外,ESXi还支持Cisco Nexus 1000v,作为分布式虚拟交换机运行在ESXi集群中。
1.4.3 HyperV
与VMware一样,HyperV也是闭源(Close Source,与Opensource相对)的商业软件。微软从Windows 8/Windows Server 2008开始,用它取代原来的Virtual PC,成为Server OS版本自带的平台虚拟化软件。
HyperV在架构上与Xen类似,也是Type 1 Hypervisor。它有Partition的概念,有一个Parent Partition,类似于Xen Dom0,有管理硬件资源的权限;HyperV的Child Partion就类似于普通的客户机DomU。对Hypervisor的请求以及对客户机的管理都要通过Parent Partition,硬件的驱动也由Parent Partition来完成。客户机看到的都是虚拟出来的硬件资源,它们对其虚拟硬件资源的访问都会被重定向到Parent Partition,由它来完成实际的操作,这种重定向是通过VMBus连接Parent Partition的VSP(Virtualization Service Provider)和child partition的VSC(Virtualization Service Consumer)来完成的,而这个过程对客户机OS都是透明的。图1-9中,HyperV Hypervisor运行在Ring -1,也就是Intel VMX技术的root mode(特权模式),而parent partition和child partition的内核都运行在non-root mode的Ring 0和Ring 3,也就是非特权模式的内核态和用户态。这样的架构安全性是比较好的。性能上如1.3.3节提到的那样,据微软自己说是略好于KVM的。
1.4.4 Container
Container严格来说与前面提到的虚拟化软件不是一个大类,首先,它不是某个虚拟化软件,而是某类软件的统称,包括Docker和LXC等;其次,它不是硬件平台级的虚拟化技术,而是软件运行环境的虚拟化,是一种操作系统级的虚拟化技术,与前面提到的不是一个层次的。
Container技术利用了Linux kernel提供的cgroup、namespace等机制,将应用之间隔离起来,好像自己是操作系统上的唯一一个应用似的。而Linux kernel除了封装出这些应用单独的运行环境以外,还可以控制分配给各个应用的资源配额,比如CPU利用率、内存、网络带宽等。
与平台虚拟化技术相比,Container技术省去了启动和维护整个虚拟客户机的开销(硬件初始化、Kernel boot、init等),因而它非常轻量级,非常适用于PaaS服务模型。但另一方面,由于各个Contained instance其实还是共用一个OS、一个Kernel,所以安全性比不上平台虚拟化技术。总而言之,Container和KVM等平台虚拟化技术,目前还是各有所长,还处在相互取长补短的过程中。
1.5 本章小结
本章从云计算的基本概念入手,给读者讲解了SaaS、PaaS、IaaS这3种云服务类型,还讲到了作为云计算底层的虚拟化技术。对于虚拟化技术,着重对KVM的基础架构进行了介绍,同时对Xen、VMware、HyperV等虚拟化技术以及容器技术也进行了简介。本章目的在于让读者在开始学习KVM虚拟化技术之前,对虚拟化技术有一个整体的简明扼要的认识。