服务器虚拟化
本文介绍了服务器虚拟化的概念、类型及特性,以及CPU虚拟化、内存虚拟化和I/O虚拟化技术。
目录
1. 服务器虚拟化案例
假设一台服务器,内存为32GB,有两个用户A和B,用户A的程序需要部署在Windows操作系统上,内存需求为8GB,用户B的程序需要部署在Linux操作系统上,内存需求为4GB。如果两个用户的两个程序都部署在该服务器上,虽然服务器的内存资源能够满足两个用户的需求,但是一个用户程序运行的环境为Windows操作系统,另一个用户程序运行的环境为Linux操作,如何解决?另外,由于两个程序都部署在同一台服务器上,如何防止一个用户的程序非法访问另一个用户程序的数据问题?一种解决方案是再购买一台4GB内存的服务器,就可以解决上述问题,但是这样的做法的成本较高。假设还有一个用户需要一个4GB内存的服务器,那就应该再购买一台服务器,很显然这种做法是很浪费的。
此时可以采用服务器虚拟化技术,在该服务器上安装虚拟化软件,利用虚拟化软件创建两台虚拟机,一台虚拟化的内存为8GB,安装Windows操作系统,另一台虚拟机的内存为4GB,安装Linux操作系统,如图1所示,这样就可以在不增加服务器的情况下来满足两个用户的需求。如果还有新的用户需求,则再创建相应的虚拟机。通过虚拟机化技术可以保障不同用户之间数据隔离,以此来防止一个用户的程序窃取另一个用户程序数据。
图1. 服务器虚拟化示意图
2. 服务器虚拟化中的概念
服务器虚拟化是指利用虚拟化软件,将一个物理服务器虚拟成若干个虚拟服务器来使用,其中,物理服务器也称为物理机(Host Machine),虚拟服务器也称为虚拟机(Virtual Machine, VM)。虚拟机中运行的操作系统被称为客户操作系统(Guest OS),物理机中运行的操作系统被称为主机操作系统(Host OS)。例如,在上一节的例子中,将一个服务器虚拟化为两个虚拟化机,一个虚拟化上安装的客户操作系统是Windows,另一个虚拟机上安装的客户操作系统是Linux。
服务器虚拟化是通过虚拟化软件向上提供对硬件设备的抽象和对虚拟机的管理。目前,业界在描述这样的软件时通常使用两个专用术语:虚拟机监视器(Virtual Machine Monitor, VMM)和虚拟化平台(Hypervisor)。
虚拟机监视器:虚拟机监视器负责对虚拟机提供硬件资源抽象,为客户操操作系统提供环境。
虚拟化平台:虚拟化平台负责虚拟机的托管和管理,它直接运行在硬件之上,因此器实现直接受到底层体系结构的约束。
这两个术语通常不做严格区分,其出现源于虚拟化软件的不同实现模式。一般情况,对于采用裸金属架构的服务器虚拟化中,将虚拟化软件称为虚拟化平台,采用寄生架构的服务器虚拟化技术中,将虚拟化软件称为虚拟机监视器。
3. 服务器虚拟化的类型
根据服务器虚拟化实现方式的不同,服务器虚拟化主要分为两种类型:裸金属架构虚拟化和寄生架构虚拟化,如图2所示。
图2. 服务器虚拟化的实现方式
(1)裸金属架构虚拟化:首先在物理机之上安装虚拟化平台(Hypervisor)而无须先安装主机操作系统(Host OS) ,然后在虚拟化平台上创建和管理虚拟机,最后在虚拟机中安装客户操作系统(Guest OS)和各种应用软件,这种预装模式称为裸金属架构。代表性的服务器虚拟化产品有Xen、VMware ESX和Microsoft Hyper-V。
(2)寄生架构虚拟化:首先在物理机之上安装主机操作系统(Host OS),然后在主机操作系统上安装虚拟机监视器(VMM),在虚拟机监视器中创建和管理虚拟机,最后在创建的虚拟机中安装客户操作系统(Guest OS)和各种应用软件,这种预装模式称为裸金属架构。代表性的计算虚拟化产品有KVM、VirtualBox、VMware WorkStation。
在裸金属架构虚拟化中,运行在硬件上的不是主机操作系统,而是虚拟化平台(Hypervisor),虚拟机运行在Hypervisor上,Hypervisor提供指令集和设备接口,以提供对虚拟机的支持,这种实现通常具有较好的性能,但是实现起来更为复杂。寄生架构虚拟化利用主机操作系统的功能来实现硬件资源的抽象和虚拟机的管理,这种模式的虚拟化实现起来比较容易,但由于虚拟机对资源的管理需要通过主机操作系统来完成,因此其管理开销较大,性能损耗大。
4. 服务器虚拟化的特性
无论采用何种虚拟化方式,服务器虚拟化都需要具有如下特性。
(1)多实例。通过服务器虚拟化,在一个物理机上可以运行多个虚拟机,每个虚拟机可以运行一个单独的客户操作系统,每个客户操作系统只能看到虚拟化软件为其提供的“虚拟硬件”。物理机的资源,比如处理器、内存、硬盘和网络等,是以可控的方式分配给虚拟机的。
(2)隔离性。在多实例的服务器虚拟化中,一个虚拟机与其它虚拟机是完全隔离的,以防止相互影响。通过隔离机制,即使其中的一个或几个虚拟机崩溃,其他虚拟机也不会受到影响,虚拟机指之间也不会泄露数据。如果多个虚拟机内进行或者应用程序之间想要相互访问,只能通过所配置的网络进行通信,就如同采用虚拟化之前的几个独立的物理机之间相互访问一样。
(3)封装性。在采用服务器蓄虚拟化后,一个完整的虚拟机环境对外表现为一个单一的实体(例如,一个虚拟机文件、一个逻辑分区),这样的实体非常适合在不同的硬件之间备份、移动和复制等。同时,服务器虚拟化将物理机的硬件封装为标准化的虚拟硬件设备,提供虚拟机内的客户操作系统和应用程序,保证了虚拟机的兼容性。
(4)高性能。与直接在物理机上运行的系统相比,虚拟机与硬件之间多了一个虚拟化抽象层。虚拟化抽象层通过Hypervisor或VMM来实现,并会产生一定的开销,这种开销会给服务器虚拟化的性能带来一定的损耗。服务器虚拟化的高性能是指Hypervisor或VMM的开销要被控制在可承受的范围内。
为了实现服务器虚拟化,需要对CPU、内存和I/O设备进行虚拟化。
5. CPU虚拟化
CPU虚拟化技术把物理CPU抽象成虚拟CPU,任意时刻一个物理CPU只能运行一个虚拟CPU的指令。每个客户操作系统可以使用一个或多个虚拟CPU,在这些客户操作系统之间,虚拟CPU的运行相互隔离,互不影响。虚拟CPU分时复用物理CPU,如图3所示。虚拟机监控器VMM或虚拟化平台(Hypervisor)负责为虚拟CPU分配时间片,同时对虚拟CPU的状态进行管理。
图3. 虚拟CPU分时复用物理CPU
5.1. x86架构下CPU虚拟化
在x86体系结构中,CPU有4个运行级别:Ring 0、Ring 1、Ring 2和Ring 3,其中,Ring 0级别具有最高权限,可以执行任何指令而没有限制,运行级别从Ring 0到Ring 3依次递减,如图4所示。应用程序一般运行在Ring 3级别;第1和第2级别一般很少使用。操作系统内核代码运行在Ring 0级别,因为它需要直接控制和修改CPU的状态,而这样的操作只有在Ring 0级别才能完成。基于x86架构的操作系统被设计成直接运行在物理服务器上,这些操作系统在设计之初都假设其完整地拥有底层物理机硬件,尤其是CPU。
图4. x86架构下非虚拟化环境
在x86体系结构中实现虚拟化,需要在客户操作系统层以下加入虚拟化层,来实现物理资源共享。因此,这个虚拟化层需要运行在Ring 0级别,而客户操作系统只能运行在Ring 0以上级别。安装在虚拟机中的客户操作系统的一些指令(如中断处理和内存管理)如果不运行在Ring 0级别将会不产生作用。由于这些指令的存在,虚拟化x86体系结构并不那么容易!问题的关键在于这些虚拟机里执行的敏感指令不能直接作用于真实硬件之上,而需要被虚拟化层接管和模拟。
为了解决x86体系结构下的CPU虚拟化问题,业界提出了提出了全虚拟化和半虚拟化两种软件方案。随着CPU硬件对虚拟化技术的支持,虚拟机中的操作系统基于硬件辅助虚拟化技术正成为当前CPU虚拟化的趋势。
(1)全虚拟化。全虚拟化采用二进制代码动态翻译技术(Dynamic Binary Translation)来解决操作系统的特权指令问题,如图5(a)所示。所谓二进制代码动态翻译,是指在虚拟机运行时,在敏感指令前插入陷入指令,将执行陷入到虚拟机监视器中,虚拟机监视器会将这些指令动态地转换成可完成相同功能的指令序列后再执行,而对于非敏感指令则可以直接在物理处理器上运行。全虚拟化方式的优点是:不修改虚拟机操作系统,虚拟机的可移植性和兼容性较强,支持广泛的操作系统;但缺点是:运行时修改客户操作系统的二进制代码,性能损耗较大,并且引入了新的复杂性,导致虚拟机监视器开发难度较大。Microsoft Virtual PC/Server、VMware WorkStation、VMware ESX Server的早期版本都采用全虚拟化技术。
(2)半虚拟化。在半虚拟化中,被虚拟化平台托管的客户操作系统需要进行修改,将所有敏感指令替换为对底层虚拟化平台的超级调用(Hypercall),虚拟化平台为这些敏感的特权指令提供了调用接口,如图5(b)所示。半虚拟化中的客户操作系统被修改后,知道自己处的虚拟化环境中,从而主动配合虚拟化平台,在需要的时候对虚拟化平台进行调用来完成敏感指令的执行。全虚拟化方式的优点是:不修改虚拟机操作系统,虚拟机的可移植性和兼容性较强,支持广泛的操作系统;但缺点是:运行时修改客户操作系统的二进制代码,性能损耗较大,并且引入了新的复杂性,导致虚拟化平台开发难度较大。Citrix的Xen、VMware的EXS Server和Microsoft的Hyper-V的最新版本都采用半虚拟化技术。
图5. x86架构下基于软件的CPU虚拟化
(3)硬件辅助虚拟化。无论是全虚拟化还是半虚拟化,它们都是纯软件的CPU虚拟化,不要求x86架构下的处理器本身进行任何改变。随着硬件技术发展,当前主流的x86 CPU开始在硬件层面上提供对虚拟化支持。支持虚拟化技术的CPU加入了新的指令集和处理器运行模式来完成与CPU虚拟化相关的功能。目前Intel公司和AMD公司分别推出了硬件辅助虚拟化技术Intel VT和AMD-V,并逐步地集成到最新推出的微处理器产品中。以Intel VT为例,支持硬件辅助虚拟化的处理器增加了一套名为虚拟机扩展(VMX)的指令集,该指令集包括十条左右的新增指令来支持与虚拟化相关的操作。此外,Intel VT为处理器定义了两种模式:根模式(root)和非根模式(non-root)。虚拟化平台运行在根模式下,客户操作系统运行在非根模式下,如图6所示。
图6. x86架构下硬件辅助虚拟化(Intel VT)
5.2. Kunpeng&ARM CPU虚拟化
华为公司在鲲鹏(Kunpeng)&ARMv8中首次引入了Exception Level(EL)的概念,每个Exception Level代表了不同的特权级别。ARMv8将特权级别分为4个level,分别是EL0, EL1, EL2, EL3,每个level的特权不一样的,特权大小EL0<EL1<EL2<EL3。因为ARMv8中ARM TrustZOne的广泛使用,则将整个系统分为两部分一个是Normal World,一个是Secure World。Normal World就代表的是正常的世界,比如android手机中linux操作系统就在normal world,Secure World就是安全世界,比如android手机中的高通的QSEE就是运行在Secure World。华为ARMv8虚拟化架构如图7所示。
图7. 华为ARMv8虚拟化架构
EL0: 就是用户空间,在Normal world中比如运行的应用程序,在Secure world就是TA,Trust Applicatio。
EL1:运行操作系统,Normal World比如Linux操作系统,或者Windows操作系统。在Secure World则就是Trusted OS,比如高通的QSEE, 开源的OP-TEE,豌豆荚的TEE等。
EL2:ARM为了支持虚拟化,设计的Hypervisor层,只有在Normal world使用。
- EL3:Secure Monitor的作用是用于Normal world和Secure world切换使用。当normal world想要访问Secure world需要发送SMC指令进入Secure Monitor层,然后进入到Secure world。
6. 内存虚拟化
内存虚拟化技术把物理机的真实物理内存统一管理,包装成多个虚拟的物理内存分别供若干个虚拟机使用,使得每个虚拟机拥有各自独立的内存空间。对于每个虚拟机来说,不论它分配了多少内存,它都认为自己的内存是从零地址开始的一段空间。VMM负责维护虚拟机内存在物理内存上的映射,这种映射对于虚拟机的操作系统来说是完全透明的。•现代操作系统中对于内存管理采用了段式、页式、段页式、多级页表、缓存、虚拟内存等复杂技术,VMM必须能够支持这些技术,使其在虚拟机环境下仍然有效。
为了实现内存虚拟化,内存系统中共有3种地址,它们之间的关系如图8所示。
机器地址:真实硬件的机器地址,在地址总线上可见到的地址信号。
虚拟机物理地址:经过VMM抽象后虚拟机看到的伪物理地址。
逻辑地址:客户操作系统为其应用程序提供的线性地址空间。
图8. 内存虚拟化
从逻辑地址到虚拟机物理地址的映射关系记为g,由客户操作系统的内存管理单元(Memory Management Unit, MMU)负责维护。对于客户操作系统而言,它并不知道自己所看到的物理地址其实是虚拟机的物理地址。从虚拟机物理地址到机器地址的映射关系记为f,由虚拟机监视器的内存虚拟化管理单元负责维护。
客户操作系统的虚拟机监视器只能完成1次虚拟地址到物理地址的映射,但获得的物理地址只是虚拟机物理地址,而不是机器地址,所以需要通过虚拟机监视器来获得总线上可以使用的机器地址。但是如果每次内存访问操作都需要虚拟机监视器的参与,效率将会变得非常低。为了实现从虚拟地址到机器地址的高效转换,目前普遍采用的方法是:由虚拟机监视器根据映射f和g生成复合映射fg,直接写入MMU。具体实现方式主要有两种:页表写入法和影子页表法。
(1)页表写入法。半虚拟化使用页表写入法来实现内存虚拟化。当客户操作系统创建一个页表时,需要向虚拟机监视器注册该页表,此时,虚拟机监视器将剥夺客户操作系统对页表的写权限,并向该页表写入由客户操作系统维护的机器内存地址。当客户操作系统访问内存时,它可以在自己的页表中获得真实的机器内存地址。客户操作系统对页表的每次修改都会陷入虚拟机监视器,由虚拟机监视器来更新页表,保证其页表记录的始终是真实的机器地址。页表写入法的本质是将映射关系fg直接写入客户操作系统的页表中,替换原来的映射g。页表写入法需要修改客户操作系统 ,Xen是采用该方法的典型代表。
(2)影子页表法。全虚拟化使用影子页表法来实现内存虚拟化。客户操作系统维护自己的页表,该页表中的内存地址是客户操作系统看到的虚拟机物理地址。虚拟机监视器为每台虚拟机维护一个对应的页表,这个页表中记录的是真实的机器内存地址。虚拟机监视器中的页表是以客户操作系统维护的页表为蓝本建立起来的,并且会随着客户操作系统的更新而更新,就像影子一样,所以被称为“影子页表”。影子页表法与页面写入法的的不同之处在于:虚拟机监视器为客户操作系统的每一个页面维护一个影子页表,并将映射fg写入影子页面中,客户操作系统的页面内容保持不变。VMware Workstation、 VMware ESX Server和KVM都采用影子页表法。
7. I/O虚拟化
I/O虚拟化就是通过截取客户操作系统对I/O设备的访问请求,用软件模拟真实的硬件,复用有限的外设资源。I/O虚拟化与CPU虚拟化是紧密相关的,当前的I/O虚拟化的典型方法有:全虚拟化、半虚拟化和直接划分。
(1)全虚拟化。虚拟机监视器对网卡、磁盘等关键设备进行模拟,以组成一组统一的虚拟I/O设备。客户操作系统对虚拟I/O设备的操作都会嵌入虚拟机监视器中,由虚拟机监视器对I/O指令进行解析并映射到实际物理设备,直接控制硬件完成操作。这种方法可以获得较高i的性能,而且对客户操作是完全透明的,但是其设计较为复杂,且难以应对设备的快递更新。
(2)半虚拟化。半虚拟化又叫做前端/后端模拟,这种方法在客户操作系统中需要为I/O设备安装特殊的驱动程序,即前端驱动。虚拟机监视器中提供了简化的驱动程序,即后端驱动。前端驱动将来自于其它模块的请求经过虚拟机监视器定义的系统调用后端驱动通信,后端驱动收到处理请求后会检查请求的有效性,并将其映射到实际物理设备,最后由设备驱动程序来控制硬件完成操作,硬件完成操作后再将通知发回前端。这种方法简化了虚拟机监视器的设计,但需要在客户操作系统中安装驱动程序甚至修改代码。
(3)直接划分。直接划分是指将物理I/O设备分配给指定的虚拟机,让客户操作系统可以在不经过虚拟机监视器或特权指令介入的情况下直接访问I/O设备。这种方法重用已有的驱动,直接访问也减少了虚拟化开销,但需要购买较多的额外硬件。该技术与基于硬件辅助的CPU虚拟化技术相对应。
8. 主流的服务器虚拟化技术
(1)Xen。Xen是剑桥大学于20世纪90年代开发的,是最早的开源虚拟化软件,半虚拟化的概念也是Xen最早提出的。Xen不仅支持半虚拟化,还支持全虚拟化,可以运行几乎在所有的x86平台上,此外最新的Xen也支持ARM虚拟化。2007年8月,Xen被Citrix公司收购,并发布管理工具XenServer。Xen目前已很少被新建的虚拟化系统的公司使用,但由于其兼容性和稳定性较好,一些在Xen上有积累的公司目前仍在使用这一软件。
(2)KVM。KVM全称Kernel Virtual Machine,即内核虚拟机。最初是由以色列Qumranet公司开发的虚拟化引擎,2007年2月被正式合并到Linux2.6.20内核中。2008年9月4日,Red Hat公司收购了Qumranet,开始RHEL中用KVM替换Xen,KVM已成为RHEL系统默认的虚拟化引擎。KVM引擎不仅可以正在具备Intel VT或者AMD-V功能的X86平台上运行,在Linux3.9中添加了KVM引擎对ARM架构的支持。KVM是OpenStack平台首先虚拟引擎,国内公有云大部分采用KVM技术。
(3)VMWare。VMWare首款产品发布于1999年,是最早出现在X86平台上的虚拟化软件,具有良好的兼容性和稳定性。VMWare面向企业数据中心的主要产品有: VMWare Infrastructure、 VMWare vCenter Server系列管理软件、 VMWare Capacity Planner、 VMWare Data recovery和VMWare Server等。VMWare的软件是非开源产品,对用户收费,所以一般只被传统行业与政府机关所采用,中小企业和互联网公司使用较少。
(4)Hyper-V。Hyper-V是微软出品的虚拟化软件,近年来发展较为迅速。Hyper-V必须在64位的Windows系统上运行,但可以创建Linux虚拟机。Hyper-V是非开源的收费产品,管理工具SCVMM的配置比较复杂,在管理多台宿主机时,需要先配置Window域和Windows Server集群,因此只在一些Windows系统为主的企业中应用。
(5)VMWare Workstation。VMWare Workstation是VMWare公司开发的运行于台式机和工作站上的虚拟化软件,也是VMWare公司第一个面市的产品(1999年5月)。VMWare Workstation最早采用二进制翻译技术,在X86 CPU硬件虚拟化技术还未出现前,为客户提供基于软件的全虚拟化解决方案。
(6)Virtual Box。VirtualBox是一款开源桌面虚拟化软件,最早是由德国 Innotek 公司开发,由Sun公司出品的软件,使用Qt编写,在 Sun 被Oracle收购后正式更名成 Oracle VM VirtualBox。VirtualBox即支持软件虚拟化,也支持Intel VT-x与AMD-V硬件虚拟化技术。为了方便其他虚拟机向VirtualBox迁移, VirtualBox可以读写VMWare VMDK格式与VirtualPC VHD格式的虚拟磁盘文件。
参考文献
1. 虚拟化云计算小组. 虚拟化与云计算. 电子工业出版社,2009.10.
2. 雷葆华等. 云计算解码. 电子工业出版社, 2011.4.
2. 王伟等. 云计算原理与实践. 人民邮电出版社,2018.8.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)