虚拟化技术详解(第21课)

一、什么是虚拟化?

虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。

 

虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。

 

二、为什么要用虚拟化?

  • 基础架构的利用率,通过将基础架构资源池化并打破一个应用一台物理机的限制,虚拟化大幅提升了资源利用率。通过减少额外硬件的采购,企业可以节约大幅成本。
  • 虚拟机比真实的机器可以被更容易从外部被控制和检查,并且可以配置更灵活,比如动态分配CPU资源、内存、磁盘等。
  • 创建一个新的虚拟机不需要预先购买硬件,只需要在有资源空闲的设备上用简单的命令创建一台即可,大大简化了服务器的供应问题。
  • 同时,一个新的虚拟机可以容易地从一台计算机转移到另一台上,这点还可以被用于远距离灾难恢复方案。
  • 节约能耗、制冷和机房空间。通过减少数据中心里服务器和相关硬件的数量,企业可以从减少机房空间、能耗与制冷需求中获益,从而降低IT成本。

 

三、CPU指令的特权级

要彻底弄明白什么是虚拟化?我们得先讲讲CPU的特权级。

 

CPU的特权级(Ring)也叫hierarchical protection domains(等级保护域)。它是CPU设计的一种机制,用来保护数据和阻止恶意行为,确保计算机安全。特权级共分为4级:0、1、2、3。特权级是针对CPU指令的,并非操作系统,操作系统仅提供不同权限访问级别的资源。

 

操作系统一般只使用特权级0和3。特权最高的是0,可以直接操作硬件,如CPU和内存。一般操作系统和驱动运行在此级别下。特权级3是给一般的程序使用的,可以调用基本的CPU指令。特权级3是无法调用特权级0的指令的,如果非要调用则会显示为非法指令。

 

引用特权级的概念是为了保护计算机,一些危险指令只有操作系统可以执行,防止普通程序滥用其他程序的资源。如间谍软件要想开启摄像头就必须向特权级0的驱动程序请求开启,否则就不允许。

 

四、虚拟化基本类型:虚拟化的技术有哪些?

 

1、全虚拟化(FullVirtulization)

在完全虚拟化技术中,不再对底层的硬件资源进行划分,而是部署一个统一的主机系统,并在其上加装了Virtual Machine Monitor虚拟层作为应用级别的软件而存在,不涉及操作系统内核,虚拟层会给每个虚拟机模拟一套独立的硬件设备,包含CPU,内存,主板,显卡,网卡等硬件资源,在其上安装客户操作系统,最终用户的应用程序运行在客户操作系统中。它区别于其他虚拟化技术最大的特点就是允许操作系统完全不需修改的运行在虚拟平台上。

 

VMware Workstation采用了将常用的PC硬件进行虚拟化的方法,允许多个操作系统在用一台主机上运行。Hypervisor(虚拟机管理程序)是客户操作系统和硬件之间的抽象层。该抽象层允许任何其他客户操作系统运行在主机操作系统之上。它采用了二进制翻译技术,在被虚拟的操作系统运行时监听二进制指令动态捕捉特权操作,以相应的代码替换这些特权操作,从而完成虚拟化工作。VMware Workstation也能虚拟IO硬件,增加了高性能设备驱动到Hypervisor中,整个虚拟环境实际上是一个单独的文件,这意味整个系统(包括客户操作系统,虚拟机和虚拟硬件)可以简单快速的整合到一个新的主机,从而实现负载均衡。

 

完全虚拟化技术最大的好处就是可以无需修改操作系统,直接移植到虚拟环境中,支持多个Guest OS。但是完全虚拟化的缺点就是虚拟机的Guest OS的系统性能会受到影响,而且往往比原有的系统性能下降不少,尤其是在IA32等常见体系结构上。因为它们运行于用户空间,频繁的由用户空间向内核空间进行切换严重的影响了它的性能。

 

虚拟化是其他软件运行的软件和/或硬件的仿真,这种虚拟环境称作virtual machine(VM)。虚拟化的形式有很多,主要通过计算架构层来进行区别。例如,应用程序虚拟化提供了运行应用程序期望使用的应用程序编程接口(API)的虚拟实现,允许为一个平台开发的应用程序在另一个平台上运行,而无需修改应用本身。Java虚拟机(JVM)是应用程序虚拟化的一个例子; 它作为Java应用程序代码和操作系统(OS)之间的中介。虚拟化的另一种形式,被称为操作系统虚拟化,提供了操作系统界面的虚拟实现,可用于运行为与主机相同的操作系统编写的应用程序,每个应用程序都在单独的VM容器,

 

在完全虚拟化中,一个或多个操作系统及其包含的应用程序在虚拟硬件之上运行。操作系统及其应用程序的每个实例都在名为客户机操作系统的单独VM中运行。主机上的Guest OS由Hypervisor管理,也称为虚拟机监视器(VMM),它控制Guest OS和物理硬件之间的指令流,如CPU,磁盘存储,内存和网络接口卡。Hypervisor可以对系统的资源进行分区,并隔离Guest OS,以便每个用户只能访问其自己的资源,以及可能访问共享资源(如主机操作系统上的文件)。此外,每一个Guest OS可以被完全封装,使其可移植。

 

在完全虚拟化中,Hypervisor提供的大多数硬件接口与硬件物理平台提供的硬件接口相同。这意味着,如果操作系统和应用程序与底层硬件兼容,则完全虚拟化中运行的操作系统和应用程序不需要修改,以使虚拟化工作。完全虚拟化的一个有趣的转折是半虚拟化,这是Hypervisor为Guest OS提供接口的方法,Guest OS可以使用它,而不是使用普通的硬件接口。如果Guest OS可以使用半虚拟化接口,则它们可以显著加快对硬盘和网络等资源的访问。 不同类型的半虚拟化由不同的Hypervisor提供。

 

完全虚拟化的动机

最近全面虚拟化产品和服务的使用增加受到许多好处的推动。采用完全虚拟化的最常见原因之一是运营效率:公司可以通过在每台计算机上放置更多的负载来更有效地使用他们现有的硬件。通常,使用完全虚拟化的服务器可以比运行单个操作系统实例和单个服务集的服务器更多地使用计算机的处理和内存资源。CPU架构的最新进展使虚拟化的速度比几年前还快,而CPU供应商和虚拟化软件供应商也将继续推进类似的进步。此外,CPU体系结构的改变已经使完全虚拟化更加安全,通过加强Hypervisor限制资源。

 

完全虚拟化的第二个常见用途是桌面虚拟化,其中单个PC运行多个OS实例。 部署桌面虚拟化有如下几个原因。它可以为仅在特定操作系统上运行的应用程序提供支持。它允许对操作系统进行更改,并随后在需要时恢复为原始状态,例如消除对安全性产生负面影响的更改。桌面虚拟化还支持更好地控制操作系统,以确保其符合组织的安全要求。 可以通过创建一个不间断更新Guest OS以确保其授权的程序的确切版本的高保证平台,而不需要其他程序,来实现此控制。要实现此控制,可以通过创建一个高保证平台不断的更新Guest OS,使程序的确切版本被授权而不需要其他程序。

 

最常用的桌面虚拟化使用方式是当用户桌面运行在较新版本时,使那些只能运行在老版本系统上的程序可以运行。在这种情况下,桌面虚拟化对应用程序的连续性很有用,因为操作系统的运行速度要比运行它们的应用程序快。随着越来越多的应用程序成为基于Web的,桌面虚拟化将变得更加重要:只有在特定浏览器的旧版本上运行的Web应用程序可以在具有该浏览器的较旧版本的虚拟化系统中运行,而用户的主要环境正在运行较新版本(通常更安全)的浏览器版本。对于诸如此类的用例,许多公司使用应用程序虚拟化而不是桌面虚拟化。

 

完全虚拟化对安全性有一定的影响。虚拟化增加了技术层次,额外安全控制来增加安全管理负担。而且,如果发生安全性损害,将许多系统组合到单个物理计算机上可能会产生更大的影响。此外,一些虚拟化系统可以轻松地在系统之间共享信息;如果没有小心控制,这种方便会称为攻击载体。在某些情况下,虚拟化环境是非常动态的,这使得创建和维护必要的安全边界变得更加复杂。

 

完全虚拟化的类型

有两种类型的完全虚拟化,下图比较了它们的高级架构。在bare metal virtualization(也称为native virtualization)中,Hypervisor直接在底层硬件上运行,而无需主机操作系统;Hypervisor甚至可以内置到计算机的固件中。完全虚拟化的另一种形式,称为hosted virtualization,Hypervisor运行在主机操作系统之上; 主机操作系统几乎可以是任何常见的操作系统,如Windows,Linux或MacOS。Hosted virtualization体系结构通常还具有在Guest OS中运行的额外的软件层(虚拟化应用程序),它提供实用程序来控制客户操作系统中的虚拟化,例如与主机操作系统共享文件的功能。Hosted virtualization架构还允许用户与hosted virtualization应用程序一起运行诸如Web浏览器和电子邮件客户端的应用程序,而不像只能在虚拟化系统中运行应用程序的裸机架构。

 

服务器通常在使用metal virtualization的计算机上进行虚拟化。台式机通常在具有hosted virtualization的计算机上进行虚拟化。在bare metal和hosted virtualization中,每个guest OS似乎都有自己的硬件,如普通计算机。 这包括:

  • CPU
  • Memory
  • Storage
  • Storage controllers
  • Ethernet controllers
  • Dispaly and sound devices
  • Keyboard and mouse

 

许多虚拟化环境提供了额外的虚拟硬件,如USB控制器,用于打印的并行端口和串行端口。 一些Hypervisor允许一些硬件接口的半虚拟化,最常见的是存储控制器和以太网控制器。如果Hypervisor正在运行的硬件CPU中支持这些功能,某些Hypervisor还可向高速存储控制器和以太网控制器提供直接内存访问(DMA)。来自guest OSs的DMA访问可以显着提高磁盘和网络访问的速度,尽管这种类型的加速可以防止一些有用的虚拟化功能,如快照和移动的guest OSs。

 

决定bare metal和hosted virtualization(无论是否拥有主机操作系统)都是重要的操作和安全决策。在主机操作系统之上添加虚拟机管理程序会给主机增加更多的复杂性和更多的漏洞。然而,Hypervisor比主机操作系统要简单得多,因此它提供了较小的目标。通过使用Hypervisor替换主机操作系统来选择metal virtualization可以提高安全性,这取决于Hypervisor的良好安全性,而在主机操作系统之上添加Hypervisor时往往会增加风险。在决定是否在服务器或桌面虚拟化解决方案下使用主机操作系统时,组织应平衡安全性和功能性。他们还应该考虑到bare metal Hypervisors运行在比hosted Hypervisors更有限的硬件范围上; 例如,bare metal Hypervisors通常仅在有限数量的以太网控制器和显卡上工作。

 

硬件仿真(有时称为硬件翻译)是一种托管虚拟化。主要区别在于,在硬件仿真中,Hypervisor提供与物理硬件提供的不同的硬件接口。因为硬件仿真中的Hypervisor可以模拟guest OS所需的所有硬件,所以它可以运行不同于主机平台的平台设计的未修改的操作系统。例如,早期版本的Virtual PC允许用户在Apple MacOS平台支持的PowerPC处理器上运行Microsoft Windows操作系统。同样,苹果公司也为其提供了英特尔Mac OS X平台的Rosetta软件,允许为Mac OS X PowerPC版本设计的程序在Intel Mac平台上运行。

 

虚拟化硬件

为了使完全虚拟化有效,呈现给guest OS的虚拟化硬件必须非常接近于物理硬件。此外,虚拟化系统必须为虚拟化硬件提供附加功能,以帮助其与组织网络中的物理硬件集成。本节讨论虚拟化网络和存储,以及如何封装guest OS。

 

1、虚拟化网络

完全虚拟化管理程序可以提供网络功能,允许各个guest OSs彼此通信,同时限制对外部物理网络的访问。Guest OSs所看到的网络接口可以是虚拟的,物理的或两者都是。 典型的Hypervisors提供三种主要形式的网络访问:

  • Network Bridging。 客户操作系统可以独立于主机操作系统直接访问主机的网络接口卡(NIC)。
  • Network Address Translation(NAT)。 Guest OS被提供一个虚拟NIC,连接到Hypervisor内的模拟NAT。 与传统NAT一样,所有出站网络流量都通过虚拟网卡发送到主机操作系统进行转发,通常是主机系统上的物理网卡。
  • Host Only Networking。 客户操作系统被给予一个不直接路由到物理网卡的虚拟网卡。 在这种情况下,客户操作系统可以配置为彼此通信,并且可能与主机操作系统进行通信。

 

当单个主机上存在多个guest OSs时,Hypervisor可以为这些客户机提供虚拟网络。Hypervisor可以实现虚拟交换机,集线器和其他网络设备。使用Hypervisor的网络在单个主机上的客户端之间进行通信具有大大提高速度的优势,因为数据包不会触及物理网络设备。Hypervisor可以通过多种方式完成内部host-only networking。在某些系统中,内部网络看起来像虚拟交换机。其他用户使用虚拟LAN(VLAN)标准来更好地控制客户端系统的连接方式。 大多数Hypervisors程序还提供内部网络地址和端口转换(NAPT),就像是NAT一样的虚拟路由器。

 

然而,虚拟机管理程序的网络结构内部的网络可能会造成操作上的缺点。许多网络依赖于在流经路由器和交换机时监视流量的工具; 这些工具在管理程序的网络中移动时无法查看流量。有一些Hypervisor允许网络监控,但是这种功能通常不如许多公司期望对物理网络进行重大监控的工具那么强大。一些Hypervisors提供了允许特权虚拟机对网络流量具有完全可见性的API。不幸的是,这些API还可以为攻击者尝试监控网络通信提供其他方法。通过Hypervisor进行网络监控的另一个问题是由于流量大而导致Hypervisor发生性能下降或拒绝服务条件的可能性

 

Hypervisor内部网络的安全隐患不应该最小化。例如,这里有两台计算机,一台充当面向公众的Web服务器,另一台是内部数据库服务器。公司还监视连接两台计算机的交换机,观察表示数据库发生攻击的流量。如果这两个服务器都移动到单个Hypervisor,并且Hypervisor的虚拟网络用于服务器之间的通信以提高效率,则监视两个系统之间的所有流量的能力将丢失,除非管理程序本身可以执行此监视符合公司的安全政策。

 

为了避免这种可见性的损失,一些公司有意将虚拟主机之间的网络流量暴露给组织中已经存在的物理网络。这需要Hypervisors运行的系统具有多个网络接口,与虚拟网络相比,这可能会显着减慢网络通信,但优点在于公司不需要更改其安全策略来获得虚拟化的成本优势。公司应该考虑在Hypervisors中隐藏的流量之间的折衷以及暴露流量的额外开销和风险,但是可以使用已经用于控制其他网络流量的相同工具来控制流量。

 

2、虚拟化存储

Hypervisor系统具有许多方式来模拟客户操作系统的磁盘存储。 所有Hypervisors至少具有虚拟硬盘驱动器,而其中一些虚拟机也具有更高级的虚拟存储选项. 此外,一些Hypervisors可以使用主机系统上的高级存储接口,例如网络连接存储(NAS)和存储区域网络(SAN),以向guest OSs提供不同的存储选项。

 

通常使用的所有Hypervisor通过使用磁盘映像来呈现具有虚拟硬盘驱动器的客户机操作系统。磁盘映像是主机上看起来像guest OS的文件,就像整个磁盘驱动器一样。无论guest OS向虚拟硬盘驱动器写入什么,都将进入磁盘映像。通过hosted virtualization,磁盘映像作为文件或文件夹显示在主机操作系统中,可以像其他文件和文件夹一样处理。

 

大多数虚拟化系统还允许guest OS直接访问物理硬盘驱动器,就像它们直接连接到guest OS一样。 这与使用磁盘映像不同,因为磁盘映像是实际驱动器的虚拟表示。对于连接到主机操作系统的软驱和CD-ROM驱动器,直接访问是常见的,这样的话,guest OS就可以从插入主机的CD-ROM安装新软件。一些Hypervisor还允许guest OS连接到整个物理硬盘驱动器。使用物理硬盘驱动器的主要优点是访问速度比访问磁盘映像要快得多。

 

许多计算机可以访问NAS和SAN系统。 一些Hypervisor可以将这些系统作为NAS或SAN呈现给guest OS,而其他管理程序可以使这些系统显示为虚拟驱动器。这是虚拟化市场的一个积极的发展领域,并且新型存储虚拟化正在频繁地被添加到Hypervisors中。

 

使用虚拟存储的安全隐患基本上与使用真实存储相同。Guest OS可以访问的各种类型的存储的访问应该被控制,就像在完整计算机上使用存储时一样。当然,使用磁盘备份作为安全策略的一部分与虚拟计算机一样重要,因此,公司应将虚拟化存储的备份合并到其备份策略中。另外,可以在host和VM级别上控制对虚拟存储的访问。利用现有的认证和授权机制来根据公司策略限制用户对文件和对象资源的访问。

 

3、Guest OS Images

完全虚拟化Hypervisor将Guest OS的所有组件(包括其应用程序及其使用的虚拟资源)封装到单个逻辑实体中。镜像是至少包含该封装信息的文件或目录。镜像存储在硬盘驱动器上,可以以与任何文件相同的方式传输到其他系统(请注意,镜像的大小通常为千兆字节)。一些虚拟化系统使用称为Open Virtualization Format(OVF)的虚拟化图像元数据标准,该虚拟化图像元数据标准支持跨虚拟化解决方案的图像元数据和组件的互操作性。

 

快照是运行图像的状态的记录,通常被捕获为图像和当前状态之间的差异。例如,快照将记录虚拟存储,虚拟内存,网络连接和其他状态相关数据中的更改。快照允许客户机操作系统被挂起,随后恢复,而不必关闭或重新启动客户机操作系统。 许多但并非全部的虚拟化系统都可以拍摄快照。

 

在某些Hypervisor中,甚至可以在不同的主机上恢复guest OS的快照。虽然可能会引入许多问题来处理实时迁移,包括传输延迟和两个物理服务器之间可能存在的任何差异(例如,IP地址,处理器数量或硬盘空间),但大多数实时迁移解决方案 提供解决这些问题的机制。如果目标系统使用相同的虚拟化产品,则不会出现其中的许多问题。但是,跨异构管理程序的实时迁移可能会引入可能影响Guest OS安全性的潜在配置错误。

 

完全虚拟化使用案例

完全虚拟化有两个主要用例:服务器虚拟化和桌面虚拟化。

 

服务器虚拟化

虚拟化服务器可以提供一些安全的好处。 在Hypervisor中运行服务器提供了一个沙箱,可以限制妥协的影响,Hypervisor可能会提供比guest OS更小的攻击面,从而减少在客户机外部扩展成功的妥协的可能性。然而,服务器虚拟化并不能防止攻击者通过服务器应用程序或客户机操作系统中的漏洞来破坏服务器,也不会阻止攻击者直接破坏主机操作系统(如果存在),例如在同一个子网内,从另一个主机攻击主机操作系统的网络服务。最重要的是,虚拟化同一主机上的多个服务器往往会对安全性产生负面影响,因为服务器的逻辑接近以及影响主机上所有服务器的单一折中的潜在影响。

 

下面的讨论解决了使用单服务器和多服务器虚拟化的常见原因。

 

单服务器虚拟化

单一服务器虚拟化的常见用例是支持仅在遗留的操作系统上运行的服务,该服务不能自行正确保护。例如,常规安全控制可能不适用于旧版操作系统。如果服务和legacy OS作为guest OS运行,则Hypervisor或主机操作系统可能能够使用legacy OS本身不能使用的各种安全控制来监视客户操作系统的操作。此外,可以添加一个额外的身份验证和审核层,例如在主机操作系统级别。 这种监控可以建立在组织的安全策略中。

 

多服务器虚拟化

多年来,公司通常将每个重要服务部署到自己的专用主机上,以便更好地将每个服务器与其他服务器隔离开来,并防止一台服务器或主机受到危及其他服务器的控制。然而,由于拥有许多主机的是昂贵的(空间,功耗,维护,硬件等),所以组织已经采用了服务器虚拟化,以便它们可以在单个主机上托管多个服务,每个服务都在单独的客户操作系统中执行 安全要求。当某个服务超负荷使用时,Hypervisor可以协调guest OS和其他Hypervisor之间的请求,以确保资源正确分配。很少使用的服务可以由guest OS保存在保存状态,并由guest OS根据需要加载。 这样可以释放其他guest OSs的资源。 此外,可以部署新的服务器,而无需配置和部署新的专用硬件。

 

数据中心的另一个优点是Hypervisor可以将资源作为单个实体呈现给guest OS,例如将多个硬盘驱动器显示为单个存储实体。这允许从系统中透明地添加或删除个别资源,而无需修改单个guest OS。单个只读映像可以在许多服务器之间共享。 另外,配置管理有好处,因为每个客户机操作系统都可以从父客户操作系统导出,提供一致的安全基准,并减少配置和修补单个服务器所需的时间和精力。利用虚拟化的公司可以从改进的事件处理中获益; 服务器可以快速恢复到未感染的状态,而受感染的guest OS的完整状态(包括RAM)可以保存在快照中供以后检查。

 

然而,在单个管理程序中整合多个服务可能存在重大的安全风险。 例如,关键服务通常放置在自己的专用主机上,以便主机可以专门为该服务进行安全保护,从而使任何其他服务的妥协不会影响关键服务。通过将主要服务放在其他服务的主机上,这两个目标都受到影响。 如果主机具有明显不同的安全需求,则将多个服务放置在主机上是特别危险的。例如,假设一个服务被认为是关键的,并且被非常强大地保护,而同一个主机上的另一个服务被认为是低影响的并且被相对弱化。希望破坏关键服务的攻击者可能会影响低影响的服务,并且使用虚拟网络本地来尝试访问关键服务或破坏虚拟机管理程序,从而获得对关键服务的访问这一事实。具有与计算机资源分配有关的政策的公司应在这些政策中考虑虚拟化。

 

当多台服务器虚拟化用于在许多主机上运行服务器,并根据不断变化的资源需求将服务器从主机移动到主机时,可称之为云计算。完全虚拟化是云基础设施作为服务架构的核心支持技术。

 

桌面虚拟化

使用桌面虚拟化的最常见原因之一是允许用户在单个主机上为不同的操作系统运行应用程序。 没有虚拟化,这将通过使用多个设备(每个具有不同的操作系统)或通过将单个设备配置为使用多个操作系统进行引导并一次使用一个操作系统(和应用程序)来实现。 桌面虚拟化允许用户在一台计算机上同时访问这两个操作系统。

 

桌面虚拟化的另一个常见用途是允许组织更紧密地控制其用户的环境。 组织存储包含操作系统和用户所需的所有应用程序的已知良好映像。用户使用托管虚拟化加载此映像,并且在此映像中执行所有操作,而不是在主机操作系统上,然后退出客户机操作系统。 稍后,用户重新启动客户机操作系统,导致客户机操作系统的任何先前更改都将丢失。这种quit-and-restart策略的优点是已经引入到操作系统或应用程序的恶意更改被退出删除。

 

通过桌面虚拟化,用户的数据通常存储在主机或网络上; 否则,每次用户退出虚拟化系统时都会丢失。桌面虚拟化的这个方面可能是用户最为沮丧和复杂的问题; 将新文档存储在似乎是正确的地方是很容易的,只有稍后发现文档丢失,因为它存储在错误的地方。一些桌面虚拟化系统具有处理在退出之前确保用户数据正确存储的方法,但是这些程序并不是万无一失的。例如,许多Windows程序在Windows注册表中存储有价值的信息,并且这些数据通常很难找到并正确备份。公司应测试其用于桌面用户预期使用的所有软件的任何桌面虚拟化系统的数据备份设施。

 

2、半虚拟化(Parairtulization)

为了改善完全虚拟化技术的性能,一种新的半虚拟化技术诞生了。它使用Hypervisor分享存取底层的硬件,但是它的客户操作系统集成了虚拟化方面的代码。该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。与全虚拟化的动态监听客户操作系统的二进制代码相比,半虚拟化是在源码级别替换掉客户操作系统中的特权级操作。通过对操作系统的内核做一定的修改,使得原本一些需要直接通过CPU执行的保护任务,可以在修改后的内核中直接执行,这样就有效的提高了虚拟机的效率。客户操作系统通过类似于系统调用的方式陷入完成其特权级操作的请求。

 

要实现虚拟化,需要满足以下条件:

  1. 体系架构本身要至少存在两种操作模式用户模式和特权模式。
  2. 非特权模式下的应用程序可以通过函数调用或者其他方法来访问特权模式下的资源。
  1. 要有一个内存分配或者保护机制,例如分段,分页机制。
  2. 要有一个异步的中断机制来保证子系统可以和进行交互。

 

Intel的IA-32架构基本都符合这些要求。但是x86架构的设计并不支持完全的虚拟化,如果要正确实现x86架构虚拟化,VMM就必须能够对某几条特定的“超级指令”进行操作。这些超级指令是指只有特权级别的程序才有权限执行的命令。完全虚拟化的方式是动态地重写这些超级指令,在其中有可能需要VMM干涉的地方插入陷阱操作。但是由于要动态地监听所有指令,所以这种转换要被应用于整个Guest OS的内核,这就导致了相关的转换、执行和缓存等开销。Xen采用的半虚拟化方式的实现,是在源码级别替换掉这些会引起问题的指令,在运行期间处理流程会由Guest OS转移到虚拟监视层Hypervisor,像应用程序使用系统调用一样来完成特权级的转换,这就避免了对二进制代码的动态监听,提高了效率。

 

半虚拟化总体架构

办虚拟化架构如下图所示,监控程序(Hypervisor)运行在最高优先级(Ring0)上,Guest OS内核运行在较低的优先级上(Ring1),运行在Guest OS中的应用程序还是运行在最低的优先级上(Ring3).每一个Guest OS都运行在一个虚拟域(Domain)中,其中有一个主控制域(Domain0),拥有对整个(或部分)物理系统资源的管理功能,并提供对整个系统的管理平台,负责创建和删除其他的虚拟域(DomainU)。

 

下面对其中的管家部分进行说明:

 

虚拟抽象层(Hypervisor)

Hypervisor只是用来提供一些最基本的控制操作。设计与实现过程中,我们希望能够尽可能把实现策略从机制当中剥离出来。一些比较底层和抽象的实现必须放在虚拟抽象层上,抽象层处在底层硬件和上层的Guest OS之间,各个虚拟化实例是彼此隔离的,所以数据传递必须通过抽象层来控制,例如在各个控制域(domain)之间调度CPU,掌控实际物理内存资源,或者在读取数据块的时候进行访问控制等。

 

主控制域(Domain0)

Hypervisor只提供了最基本的控制操作,复杂的策略决策实现都放在一个特殊的主控制域上来实现。这个控制平台可以看作是在一个特殊的Guest OS上面运行管理软件进行控制。这样,Hypervisor只提供实现机制,而控制平台负责具体策略。主控制域是在系统启动时第一个被加载的控制域,只有它有权限对物理系统资源进行操作,如块设备、显示和输入输出等,它具有对这些设备响应的原生驱动程序可以使用控制接口它还负责操控应用级的控制接口,这些控制接口具有创建和终止其它虚拟域的能力,还能控制创门相关的调度参数、物理存储分配以及它们对给定的物理磁盘和网络设备的访问。

 

被控制域(DomainU)

除了主控制域外的其他的虚拟域都是由主控制域创建和管理的,它们有着更多的限制。在这些虚拟域中运行的Guest OS内核一般来说并不应该通过Hyper call来操作底层硬件资源,而是通过实现在其中的前端驱动来与主控制域中的后端驱动通信来完成对硬件资源的请求。但是VMM并没有在机制上禁止Guest OS利用Hypercall,这只是一种出于安全的考虑。

 

设计方法概述

 

通信机制

有两种机制用于Hypervisor和其上的各个虚拟域之间进行控制的交互:

  • 使用hypercall产生从domain到Hypervisor的同步调用。
  • 使用异步事件机制完成从Hypervisor到虚拟域的通告递交。

 

hypercall接口允许虚拟域通过执行一个同步软陷阱陷入到Hypervisor执行一个特权操作,这类似于在传统的操作系统中对系统调用的使用。hypercall的机制是类似于Linux中的系统调用的,它使用的是int 82中断,hypercall的调用号存在EAX寄存器中,然后根据调用号在hypercall_table中找到这个调用号对应的处理函数,调用这个函数。

 

从Hypervisor到虚拟域的通信是由一个异步事件机制提供的。这个机制取代了常用的利用设备中断的递交机制,它允许重要事件采用轻量级的通告形式。和传统的Unix信号类似,这些重要事件的个数比较少,但每一个都用作针对某一特定类型事件的标记。未决的事件存放在每个虚拟域的bitmask(专门的数据结构,位图掩码)中。bitmask的更新要由Hypervisor在调用一个和Guest OS相应的事件回调处理程序(callback handler)之前完成(Hypervisor针对某类事件要向上发通告,如果Hypervisor调用了Guest OS相应的事件回调处理程序,就说明该事件完成了,下面要把控制交回给虚拟域,所以必然要在调用事件回调处理程序之前由Hypervisor将bitmask更新)。调用回调处理程序负责重新设置未决事件集合(调用仍旧是由Hypervisor操作,更新bitmask)同时以相应的行为和通告相呼应。一个虚拟域可以通过设置一个Hypervisor可读的软件标记来显式地推迟对事件操作:这一点是与在真实的处理器中禁止中断的过程类似的。

 

CPU虚拟化

虚拟化CPU对Guest OS提出了几个要求。因为Hypervisor插在操作系统的下层违背了惯常的关于操作系统在整个系统中特权最高的假设。为了保护Hypervisor不会受到操作系统不正确行为的影响(即Domain不受另一个Domain的影响),Guest OS就必须被改造为能够运行在较低的特权级上。做一些改动使操作系统改为运行在Ring1特权级上,这就防止了Guest OS会直接执行特权指令,也保证了操作系统与运行在Ring3上的应用程序之间相隔离的安全性。特权指令需要被Xen确认和执行以达到准虚拟化的目的,只有Xen有足够高的特权级来执行这些指令,所以任何Guest OS试图直接运行特权指令都会失败。

 

对于异常的处理,每个vcpu都有自己的虚拟IDT表来记录对每类异常进行描述的句柄,表中所列的异常都是在Xen中有记录的,以用作确认。有两类异常会经常发生而影响到系统的性能系统调用和页面错误。因此,每个Guest OS都记录一个“快速的”异常操作句柄来改进系统调用的性能。而缺页异常需要从特权处理器寄存器(CR2)中读出出错的地址,所以页面错误必须要经过Xen才能提交,Xen保存CR2的值供来自Ring1的访问使用。中断被轻量级的事件机制所取代,Xen来负责将硬件中断以事件方式通告给相应的Guest OS。

 

Xen为每个Guest OS提供了周期计数时间,系统时间,虚拟时间和挂钟时间(wall-clock time)四个概念。系统时间是以纳秒为单位给出的,是从机器引导起来开始计算的时间。Domain的虚拟时间只是在它运行的时候才会被记入这主要供Guest OS的调度器使用来确保Guest OS上的应用进程能够正确地共享时间片。挂钟时间是真实的时间。周期计数时间是用来推断或校正其他时间。Xen还提供了定时器,使得能够处理超时事件,超时事件将会使用事件机制来递交。

 

Xen当前对Domain的默认调度采用的是Credit调度算法。Xen为每个Domain分配了一个vcpu,这是调度的基本单元。同时Xen也提供了其他的算法,并且由于Xen对调度算法进行了封装,使得实现新的算法十分方便。

 

内存虚拟化

虚拟化存储管理是虚拟化一个体系结构中最困难的部分,它包括Hypervisor本身所需的机制和移植Guest OS所需的改动。x86架构并没有由软件管理的TLB,在发生TLB失效的时候,处理器会自动通过遍历硬件页表结构来处理。因此为了获得可能达到的最好性能,当前地址空间内所有的有效页转换都要在硬件可访问的页表中给出。TLB是没有标记的,所以地址空间的切换需要整个TLB的刷新。在这些限制下,Xen有这样的设计:(1)由Guest OS负责分配和管理硬件页表,这么做最小化了底层Hypervisor对页表操作的影响,确保了安全性和隔离;(2)Hypervisor处于每个地址空间的最顶部的64MB空间内,因此避免了在进入和离开Hypervisor冲时进行TLB刷新操作。Xen把所有进程的页表最高64M都映射到这一段空间,避免了在内核与VMM切换时重新加载CR3,因此减少了TLB刷新的次数。

 

每当Guest OS需要一个新的页表,例如创建了一个新进程,它就在自己保留的内存空间内分配和初始化一个页面,并且将其在Hypervisor中记录。此时操作系统必须放弃对页表存储空间直接写的权限所有后续的更新操作都必须由Hypervisor进行确认。为了避免频繁地进入虚拟机,Xen使用了一个队列将写操作分批进行确认以减小开销, Guest OS可以成批地进行更新操作以减少每次更新都要进入Hypervisor带来的代价(因为每次更新都要Hypervisor确认)。客户操作系统可以被分配一段不连续的内存空间。

 

在内存虚拟化中,对段机制所需做的工作相对较少,并且和页机制以类似的方式。对段描述的写也是要通过超级调用陷入Xen来完成的。对于x86架构上段描述符的限制只有:(1)它们的特权级别必须比Hypervisor要低;(2)它们不能够对地址空间中Hypervisor的保留部分进行访问。

 

在虚拟模式下,Xen引入了“伪物理地址”(pseude physical address)。的概念。Xen通过伪物理地址给了Guest OS一个假象。伪物理地址是一段以0开头的连续空间,大小在启动其所在域时被确定。每个伪物理地址实际实际上对应的是一个真实的机器地址,Xen为每个域维持了一张对Guest OS只读的表将这个域的空间映射到真实的机器物理空间中,在更新页表时利用这张表来将真实的机器地址填充到页表中,从而实现了Guest OS对物理内存读的直接操作。

 

设备虚拟化

设备I/O的虚拟化是整个VMM系统里面比较复杂的部分。从系统软件的角度来看,I/O设备其实就是特定资源的集合,即I/O端口、内存映射I/O和中断等。当操作系统按照硬件手册规定的方式操作资源,如读写I/O端口,接收中断,I/O设备就会按照规定完成的操作(读写磁盘,收发网络包等)。对设备I/O的管理,在某一时刻只有一个虚拟域对某个物理设备具有特权,其他虚拟域则共享这个设备。设备驱动分为前端和后端两部分,前端和后端在没有权限的虚拟机和拥有实际物理设备的虚拟机之间通过事件通告进行通信。另一个附加的好处就是前端可以为整个物理设备提供一个单一的接口,这个设备接口和我们的虚拟设备接口不依赖于底层的物理驱动,而且只需要一个新的前端驱动就可以连接现有的后端。Domain0运行后端驱动,控制真正的硬件操作同时DomainU运行前端驱动,前端驱动主要提供块设备和网络设备的I/O接口,前端驱动可以有多个。Hypervisor通过提供事件通道、授权表和环缓冲区来帮助前端与后端进行通信,许多消息在后端和前端驱动之间传送。

 

Xen给出了一套清楚、简单的设备抽象,可以设计一个接口以有效地满足对保护性和隔离性的需求。为了做到这一点,I/O和各个Domain之间的数据传递都是要经过Hypervisor的,可以使用的方法有事件通道、环缓冲区以及授权表等。这些方法能够在Hypervisor有效地执行确认检查的同时,为在系统中的竖直方向上传递缓冲区信息提供了一个高性能的通信机制。和硬件中断类似,Xen支持一个轻量级的事件递交机制用于为一个Domain传送异步通告。这些通告是在对未决事件类型的位图进行更新的时候产生的,也可以通过调用一个Guest OS专有的事件句柄产生。

 

只有Domian0能够不经检查地直接访问物理(IDE和SCSI)磁盘。所有其它的虚拟域访问永久性存储介质的时候,都要通过虚拟块设备(VBD)抽象。这个抽象是由运行在Domain0中的管理软件来创建和配置的。由Domain0管理VBD使得Xen中的机制比较简单,不避使用更复杂的解决方案。

头像
  • ¥ 129.0元
  • 市场价:199.0元
  • ¥ 99.0元
  • 市场价:129.0元
  • ¥ 98.0元
  • 市场价:198.0元
  • ¥ 0.0元
  • 市场价:99.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: