与当代计算基础设施的部署和配置相关的挑战有很多。考虑到操作系统及其众多版本的多样性——包括为适应各种流行的应用程序而经常需要的特定配置——建立和管理此类系统已成为一个难题。
虚拟化在很大程度上受到这些挑战的推动,但也由于它提供的其他重要机会,最近已成为计算机系统软件的主要关注点。它使单台计算机能够托管多个不同的操作系统堆栈,并减少服务器数量,降低整体系统复杂性。EMC 的 VMware 是该领域最引人注目且最早的进入者,但最近 XenSource、Parallels 和 Microsoft 也推出了虚拟化解决方案。许多主要的系统供应商,如 IBM、Sun 和 Microsoft,都在努力利用虚拟化。虚拟化似乎远不止是又一个短暂的市场趋势。它有望为企业和消费者使用计算机系统的方式带来深刻的变革。
虚拟化解决了哪些问题?此外,为了利用它带来的创新,您需要了解和/或做哪些不同的事情?在本文中,我们概述了系统虚拟化,并仔细研究了 Xen 虚拟机监控器及其半虚拟化架构。然后,我们回顾了部署和利用计算机系统和软件应用程序方面的一些挑战,并着眼于当今的 IT 基础设施管理,并展示虚拟化如何帮助解决其中一些挑战。
所有现代计算机都足够强大,可以使用虚拟化来呈现多个较小的 VM(虚拟机)的假象,每个虚拟机都运行一个单独的操作系统实例。操作系统虚拟化环境为每个虚拟化的操作系统(或访客操作系统)提供了它独占访问其运行的基础硬件平台的假象。当然,虚拟机本身可以为访客操作系统提供与实际可用的硬件不同的硬件视图,包括 CPU、内存、I/O 和受限的设备视图。
虚拟化历史悠久,起源于大型机环境,源于在用户之间提供隔离的需求。基本趋势始于分时系统(使多个用户能够共享一台昂贵的计算机系统),并借助操作系统设计方面的创新来支持属于单个用户的进程的概念。大多数商业相关处理器上用户和管理模式的增加意味着操作系统代码可以受到用户程序的保护,使用一组所谓的“特权”指令,这些指令专用于在管理模式下运行的操作系统软件。内存保护以及最终的虚拟内存被发明出来,以便可以将单独的地址空间分配给不同的进程,以共享系统的物理内存,并确保不同应用程序对内存的使用是相互隔离的。
这些最初的增强功能都可以在操作系统内部完成,直到有一天,同一物理机器上的不同用户或不同应用程序想要运行不同的操作系统。只有通过支持多个 VM 才能满足此要求,每个 VM 都能够运行自己的操作系统。虚拟化时代(以 IBM 于 1972 年发布 System/360 的 VM 为标志)已经来临。
操作系统虚拟化是通过在访客操作系统和底层硬件之间插入一个系统软件层来实现的,这个层通常被称为虚拟机监控器或 VMM(虚拟机监视器)。此层负责允许多个操作系统映像(及其所有正在运行的应用程序)共享单台硬件服务器的资源。每个操作系统都认为它控制了整台机器的资源,但在其底层,虚拟化层或虚拟机监控器透明地确保资源在不同的操作系统映像及其应用程序之间得到正确且安全地划分。虚拟机监控器管理所有硬件结构,例如 MMU(内存管理单元)、I/O 设备和 DMA(直接内存访问)控制器,并向每个访客操作系统呈现这些资源的虚拟化抽象。
实现虚拟化的最直接方法是在软件中提供底层硬件平台架构的完整模拟,特别是涉及处理器的指令集架构。对于 x86 处理器,特权指令——操作系统专门使用(用于中断处理、设备读写和虚拟内存)——构成了需要模拟的主要指令类别。根据定义,用户程序无法执行这些指令。强制模拟这些指令的一种技术是在虚拟机内执行所有代码,包括正在虚拟化的操作系统,作为用户代码。然后,常驻 VMM 处理尝试执行特权指令时产生的异常,并代表操作系统执行所需的操作。
虽然一些 CPU 在架构设计时就考虑了操作系统虚拟化(IBM 360 就是一个这样的例子),但许多当代商品处理器架构是从早期的设计演变而来的,而早期的设计并未预料到虚拟化。在这种情况下,提供处理器的完全虚拟化是一个具有挑战性的问题,通常会导致所谓的“虚拟化漏洞”。x86 处理器的虚拟化也不例外。例如,某些指令在用户模式和管理模式下都执行,但产生不同的结果,具体取决于执行模式。克服这些问题的一种常见方法是扫描操作系统代码并修改有问题的指令序列,以产生预期的行为或强制陷入 VMM。不幸的是,这种修补和陷入方法可能会导致严重的性能损失。
实现虚拟化的另一种方法是预先呈现与底层硬件相似但不完全相同的 VM 抽象。这种方法被称为半虚拟化。
半虚拟化的概念不是直接软件模拟底层硬件架构,而是访客操作系统和底层虚拟机监控器紧密协作以实现最佳性能。许多访客操作系统实例(不同配置和类型)可以在给定硬件平台上的一个虚拟机监控器之上运行。这提供了改进的性能,尽管它确实需要修改访客操作系统。但重要的是要注意,它不需要更改访客系统提供的 ABI(应用程序二进制接口);因此,不需要修改访客操作系统的应用程序。
在许多方面,这种方法类似于 IBM 360 和 370 大型机的 VM 的操作系统虚拟化方法。1,2 在纯虚拟化下,您可以运行未修改的操作系统二进制文件和未修改的应用程序二进制文件,但资源消耗管理和性能隔离存在问题——例如,一个访客操作系统和/或其应用程序可能会消耗所有物理内存和/或导致抖动。半虚拟化方法需要一些工作来移植每个访客操作系统,但虚拟机监控器可以严格分配硬件资源,从而确保适当的性能隔离和保证。
半虚拟化的使用以及处理器架构扩展以支持它的补充创新(特别是最近在 Intel 和 AMD 处理器中引入的那些,它们消除了“陷入和模拟”的需要)现在允许 x86 架构的高性能虚拟化。
在 x86 架构上应用的半虚拟化的一个例子是 Xen 虚拟机监控器(图 1)。Xen 最初由 Ian Pratt 和剑桥大学的一个团队在 2001-02 年开发,后来发展成为一个具有广泛参与的开源项目。
任何虚拟机监控器(无论是实现完整的硬件模拟还是半虚拟化)都必须为以下系统设施提供虚拟化
现在让我们简要检查一下 Xen 对这些设施中的每一个的处理方法。(有关更多详细信息,我们推荐 Pratt 等人的论文3 中对 Xen 的设计和原理的出色介绍和全面处理。)
在 Xen 的半虚拟化中,CPU 和内存以及低级硬件中断的虚拟化由一个低级高效的虚拟机监控器层提供,该层以大约 50,000 行代码实现。当操作系统更新硬件数据结构(例如页表)或启动 DMA 操作时,它通过调用虚拟机监控器提供的 API 与虚拟机监控器协作。
反过来,这允许虚拟机监控器跟踪操作系统所做的所有更改,并优化地决定如何在上下文切换时管理硬件数据结构的状态。虚拟机监控器被映射到每个访客操作系统的地址空间中,这意味着在虚拟机监控器调用时,操作系统和虚拟机监控器之间没有上下文切换开销。
最后,通过与访客操作系统协同工作,虚拟机监控器可以深入了解操作系统的意图,并可以使其意识到它已被虚拟化。这对访客操作系统来说可能是一个巨大的优势——例如,虚拟机监控器可以告诉访客操作系统,在上一次运行和当前运行之间,真实时间已经过去,从而使其能够做出更明智的重新调度决策,以适当地响应快速变化的环境。
Xen 使访客操作系统(在 VMM 之上运行)能够感知虚拟化,并通过所谓的虚拟机监控器调用 API 向其呈现略微修改的 x86 架构。这消除了任何难以且成本高昂的模拟特权指令,并通过显式调用虚拟机监控器提供了等效但并非完全相同的功能。操作系统必须进行修改以应对此更改,但在结构良好的操作系统中,这些更改仅限于其架构相关的模块,通常是完整操作系统实现的一个相当小的子集。最重要的是,操作系统的大部分和应用程序的全部保持不变。
对于 Linux,Xen 虚拟机监控器调用 API 采用内核加载时填充的跳转表的形式。当内核在原生实现中运行时(即,不在半虚拟化虚拟机监控器之上),跳转表填充了默认的原生操作;当内核在 Xen 上运行时,跳转表填充了 Xen 虚拟机监控器调用。这使得相同的内核可以在原生和虚拟化形式中运行,具有半虚拟化的性能优势,但无需重新认证针对内核的应用程序。
虚拟机(因此,在每个虚拟机中运行的各自的访客操作系统)之间的隔离是 Xen 提供的一个特别重要的属性。硬件平台的物理资源(例如 CPU、内存等)在 VM 之间严格划分,以确保它们各自获得平台整体处理能力、内存、I/O 等的保证部分。此外,由于每个访客操作系统都在其自己的一组虚拟硬件上运行,因此独立操作系统中的应用程序彼此受到保护的程度几乎与安装在独立物理主机上时相同。鉴于当前操作系统无法提供针对间谍软件、蠕虫和病毒的保护,此属性特别有吸引力。在 Xen 这样的系统中,被认为构成此类风险的不可信应用程序(可能例如 Web 浏览器)可以被分配到它们自己的虚拟机,从而与底层系统软件和其他更受信任的应用程序完全隔离。
在半虚拟化 VMM(如 Xen)中,I/O 虚拟化是通过一组驱动程序实现的。Xen 虚拟机监控器公开了一组干净且简单的设备抽象,并且在核心虚拟机监控器之外的特殊域(VM)中实现了一组用于物理平台上所有硬件的驱动程序。这些驱动程序通过虚拟机监控器的抽象 I/O 接口提供,供其他 VM 内使用,因此被所有访客操作系统使用。4
在每个 Xen 访客操作系统中,简单的半虚拟化设备驱动程序取代了物理平台的硬件特定驱动程序。半虚拟化驱动程序独立于所有物理硬件,但代表每种类型的设备(例如,块 I/O、以太网)。这些驱动程序通过将 I/O 控制权转移到虚拟机监控器来实现高性能、虚拟化安全的 I/O,而访客操作系统中没有额外的复杂性。重要的是要注意,Xen 架构中的驱动程序在基本虚拟机监控器之外运行,其保护级别低于虚拟机监控器核心本身。因此,虚拟机监控器可以防止设备驱动程序中的错误和崩溃(它们不会使 Xen VMM 崩溃),并且可以使用市场上可用的任何设备驱动程序。此外,虚拟化操作系统映像在硬件之间更具可移植性,因为驱动程序和硬件管理的低级别是虚拟机监控器控制下运行的模块。
在完全虚拟化(模拟)实现中,平台的物理硬件设备被模拟,并且运行每个访客操作系统的未修改二进制文件,包括它包含的本机驱动程序。在这些情况下,很难限制各个操作系统对平台物理硬件的使用,并且一个虚拟机的运行时行为可能会显着影响其他虚拟机的性能。由于对硬件的所有物理访问都在 Xen 的 I/O 虚拟化方法中集中管理,因此可以管理每个访客的资源访问。这为每个访客操作系统带来了性能隔离的重大好处。
那些有微内核经验的人可能会发现这种 I/O 虚拟化方法很熟悉。然而,Xen 与微内核历史工作之间的一个显着区别是,Xen 放宽了实现对 x86 处理器 I/O 架构的完整且架构纯粹的模拟的约束。Xen 使用通用的、共享内存的、基于环的 I/O 通信原语,它能够通过批量处理请求来实现非常高的吞吐量。这种 I/O 抽象在移植到其他处理器架构(包括 IA-64 和 PowerPC)时表现良好。它还提供了一种创新的方法来向 I/O 路径添加功能,方法是在访客虚拟设备和真实设备驱动程序之间插入额外的模块。网络堆栈中的一个示例是完全 OSI 第 2 层交换、数据包过滤甚至入侵检测的支持。
最近硬件方面的创新,尤其是在 CPU、MMU 和内存组件方面(特别是 Intel VT-x 和 AMD-V 架构中目前可用的硬件虚拟化支持,在客户端和服务器平台中都提供),为操作系统虚拟化提供了一些直接的平台级架构支持。这使得虚拟化访客操作系统能够实现接近裸机的性能。
Xen 提供了一个通用的 HVM(硬件虚拟机)抽象,以隐藏 Intel 和 AMD 技术及其实现之间的细微差异。HVM 提供两个主要功能:首先,对于未修改的访客操作系统,它避免了在操作系统中陷入和模拟特权指令的需要,方法是允许访客以其本机特权级别运行,同时在访客执行会不安全地修改机器状态的特权指令时,提供硬件向量(称为 VM EXIT)进入虚拟机监控器。虚拟机监控器开始执行时,访客的完整状态可供其使用,并且可以快速决定如何最好地处理 VM EXIT 的原因。今天的硬件大约需要 1,000 个时钟周期来保存当前正在执行的访客的状态并转换到虚拟机监控器,这提供了良好但并非出色的性能。
HVM 实现的第二个功能是,它们为运行半虚拟化虚拟机监控器的访客操作系统(特别是它们的设备驱动程序)提供了直接调用虚拟机监控器的新指令。这些指令可用于确保访客 I/O 采用最快的路径进入虚拟机监控器。半虚拟化设备驱动程序插入到每个访客操作系统中,然后可以实现最佳的 I/O 性能,即使 Intel 和 AMD 的 x86 虚拟化扩展(分别为 Intel VT 和 AMD-V)都没有为 I/O 虚拟化提供特定的性能优势。
许多长期存在的挑战与计算机系统及其应用程序的部署和管理相关,尤其是在现代大规模、商业和/或企业使用的背景下。虚拟化提供了与物理硬件的抽象,打破了单个硬件平台上只能运行单个操作系统实例的约束。由于它封装了运行环境,因此虚拟化是一种非常强大的抽象。
过去十年见证了硬件成本的革命性降低,以及许多基本硬件平台组件(处理器、存储和内存)的容量和性能的显着提高。具有讽刺意味的是,尽管现在相对便宜的基于 x86 的服务器得到了广泛采用,但大多数企业都发现其 IT 成本和复杂性迅速升级。
虽然摩尔定律的稳步发展显着降低了硬件的购置成本,但这种廉价计算的相应激增导致复杂性大大增加——服务器配置、管理、电力和维护的成本使硬件的基本成本相形见绌。当考虑到服务器的所有成本(配置、维护、管理、电力、房地产、硬件和软件)时,数据中心中的每台服务器平均每年花费企业 10,000 美元。此外,当前操作系统和系统软件架构的缺陷导致当今大多数服务器的利用率低于 10%。
当代商品硬件平台中看到的快速性能和容量增长直接带来了几个机会。过去十年商业 IT 基础设施的趋势是不断扩展的硬件宇宙:通过硬件的“横向”扩展来实现性能和容量。鉴于当今单台商品机器上可用的惊人性能,我们现在可能正在目睹这个宇宙的收缩——仍然是一个横向趋势,但方向相反。五年前,可能需要许多服务器来支持企业级甚至部门级计算,而虚拟化允许将许多大型应用程序负载放在一个硬件平台或更少数量的平台上。这可以显着降低每台服务器的资本成本和整体生命周期运营成本。
10% 的利用率统计数据表明,服务器整合可以实现基础设施成本的十倍节省,这不仅是通过减少 CPU 数量,更重要的是通过随之而来的交换、通信和存储基础设施以及电力和管理成本的减少。由于虚拟化允许多个操作系统映像(以及与构成软件服务的每个操作系统映像相关的应用程序)共享单台硬件服务器,因此它是服务器整合的基本推动因素。
虚拟 I/O 抽象是服务器虚拟化的另一个重要组成部分。过去,当使用多台服务器和/或每台服务器多个硬件接口来支持可伸缩性时,可以单独分配物理硬件设备,以保证特定操作系统和应用程序负载的特定性能、特定安全属性和/或其他配置方面。如今,单个设备可能具有显着更高的性能(例如,从快速以太网过渡到廉价的千兆甚至万兆网络接口卡),并且单个服务器或服务器配置上可能只存在一个或更少数量的物理设备。
在这种配置中,单个物理硬件设备由单台服务器上的多个托管 VM 共享,确保它们各自对共享硬件的需求之间存在适当的隔离至关重要。严格分配共享 CPU、内存和 I/O 资源,以及确保平台和访客的安全是虚拟机监控器的关键要求。
除了服务器整合的直接应用之外,服务器虚拟化还提供了许多其他好处,这些好处源于虚拟机(操作系统及其应用程序)与物理硬件的分离。这些好处(其中一些尚未在应用程序中得到充分利用)包括动态配置、高可用性、容错以及“实用计算”范例,其中计算资源动态分配给虚拟化应用程序工作负载。
一旦操作系统及其应用程序被封装到虚拟机中,VM 就可以在任何具有虚拟机监控器的计算机上运行。将所有状态(包括应用程序和操作系统配置)封装到单个、可移植、即时运行的包中的能力提供了极大的灵活性。首先,可以配置应用程序并将 VM 保存在“挂起”状态,这使其可以即时运行而无需进一步配置。可以保存已在 VM 中正确配置并准备运行的一个或多个应用程序的映像,然后可以将其用作软件服务的高度可移植分发格式。
不再需要安装和配置操作系统以及在平台上实例化和启动软件服务之前必要的应用程序的管理任务。预配置和保存的 VM 映像只需加载和启动即可。VMware 以其设备概念引领行业,该概念旨在将打包的 VM 用作一种新的软件分发技术。VMware 从其网站提供 200 多个预打包设备。
在企业内部,打包的 VM 提供了额外的好处:工程组交付的软件可以与其所需的操作系统打包在一起,并且可以作为 VM 进行暂存以进行测试和生产。应用程序及其认证的操作系统可以轻松且即时地配置到测试设备上,可以在经济高效的环境中快速测试,然后再作为打包的 VM 提供,准备部署到生产环境中。
数据中心的一个关键问题是能够快速将新应用程序投入生产。新应用程序通常需要 60 到 90 天才能获得资格。为了使其从测试进入数据中心,IT 人员必须购置一台新机器,为其配置操作系统,安装应用程序,配置和测试相关服务的设置,然后在满意后才将生成的服务器安装到数据中心中。
这种打包方法提供了一种解决方案的途径。一旦新软件被打包为设备,就可以立即在数据中心中任何有足够容量运行它的现有服务器上部署和运行。如果需要,在服务可供生产使用之前,仍然可以进行任何最终测试或资格认证,但消除了在最终使用点购置、安装和/或自定义新硬件的交付周期。
虚拟设备加速了软件配置和可移植性。实时迁移——在不停止 VM 的情况下将其从一台服务器动态移动到另一台服务器的能力——提供了另一个好处:当与负载平衡和服务器资源优化软件结合使用时,这为实现“实用计算”范例提供了强大的工具。当 VM 资源不足时,可以将其动态迁移到另一台资源更多的机器。当容量紧张时,可以快速克隆现有 VM 的其他副本并将其部署到其他可用的硬件资源,以提高整体服务容量。即时负载考虑因素是 IT 管理世界中一个臭名昭著的挑战。应用于分布式虚拟化服务器的网格引擎(其中备用资源被保留)可用于动态生成给定应用程序的多个实例,以满足增加的负载或需求。
在客户端,虚拟化为增强安全性、可管理性、提高工作者移动性以及增强客户端设备的稳健性提供了各种机会。通过在现代服务器级系统上托管多个客户端操作系统实例,也可以实现客户端虚拟化。将每个客户端环境作为位于数据中心服务器上的虚拟化系统实例提供,为用户提供了现代的瘦客户端等效物。用户的移动性是他们能够从任何客户端端点远程访问其虚拟化工作负载的直接结果。Sun 的 Sun Ray 系统就是这种实现的一个例子。
数据、应用程序及其使用环境的增强安全性,以及客户端系统管理总成本的降低是该技术的重要方面。例如,可以通过在用户的 PC 上嵌入特定于功能的隐藏 VM 来实现增强的可靠性和安全性,其中 VM 旨在监视流量、实施“嵌入式 IT”策略或类似策略。将应用程序和操作系统映像打包到可移植设备中也为应用程序状态的可移植性提供了一个强大的隐喻:只需将挂起的 VM 复制到记忆棒,用户就可以将正在运行的应用程序携带到任何支持虚拟化的设备。VMware 的免费 Player 应用程序是一个轻量级的客户端虚拟化“播放器”,它能够执行打包的 VM。示例包括会话后可以丢弃的预打包安全 Web 浏览器(以获得更高的安全性)以及安全的用户特定或企业特定应用程序。
虚拟化的使用预示着客户端安全性和可管理性的更多机会。此处提供的示例仅开始说明虚拟化的应用方式。虚拟化代表了系统软件和数据中心架构的基本变化。它为计算基础设施的成本节约和效率以及服务器和客户端基础设施的集中管理和维护提供了一些重要的机会。我们期望它从根本上改变软件的开发、测试和交付,并在商业和企业环境中得到一些即时应用。
我们特别感谢剑桥大学的团队,包括 Paul Barham、Boris Dragovic、Keir Fraser、Steven Hand、Tim Harris、Alex Ho、Derek McAuley、Rolf Neugebauer、Ian Pratt、Andrew Warfield 和 Matt Williamson,他们开发和进化了 Xen 系统。本文报告了他们的工作。
SIMON CROSBY 是 XenSource 的 CTO,他在那里负责 XenEnterprise R&D、技术领导和产品管理,并与 XenSource 创始人 Ian Pratt 运营的 Xen 项目保持密切联系。Crosby 曾是 Intel 的首席工程师,他在那里领导分布式自治计算以及平台安全和信任方面的研究。在 Intel 之前,Simon 创立了网络优化软件供应商 CPlane Inc.。他曾是剑桥大学的终身教职员工,在那里他领导了网络性能和控制以及多媒体操作系统方面的研究。
DAVID BROWN 是 Sun Microsystems 的 Solaris 工程组的成员。他领导了 Solaris ABI 兼容性计划,最近致力于多个项目,以支持 Sun 的基于 AMD x64 和 Intel 的平台。早些时候,他是 Silicon Graphics 和 Digital Equipment Corporation 的工作站系统工程组的创始人。在他的剑桥大学博士论文中,他介绍并描述了用于高性能图形硬件的统一内存架构方法。
最初发表于 Queue 第 4 卷,第 10 期—
在 数字图书馆 中评论本文
Mendel Rosenblum, Carl Waldspurger - I/O 虚拟化
虚拟这个术语被严重地过度使用了,引发了从云中运行的虚拟机到跨虚拟世界运行的化身的一切。即使在计算机 I/O 的狭隘背景下,虚拟化也具有悠久而多样的历史,逻辑设备就是例证,这些逻辑设备有意地与其物理实例化分离。
Scot Rixner - 网络虚拟化:打破性能壁垒
虚拟化最近的重新流行导致其在越来越多的环境中使用,其中许多环境需要高性能网络。例如,考虑服务器整合。网络虚拟化的效率直接影响可以有效地整合到单台物理机器上的网络服务器数量。不幸的是,现代网络虚拟化技术会产生显着的开销,这限制了可实现的网络性能。我们需要新的网络虚拟化技术来实现网络密集型领域中虚拟化的全部优势。
Ulrich Drepper - 虚拟化的成本
虚拟化可以通过许多不同的方式来实现。它可以借助硬件支持,也可以不借助硬件支持来实现。虚拟化的操作系统可能需要为了虚拟化而进行更改,也可能期望它在不更改的情况下工作。无论如何,软件开发人员都必须努力实现 Gerald Popek 和 Robert Goldberg 提出的虚拟化的三个目标:保真度、性能和安全性。
Werner Vogels - 超越服务器整合
虚拟化技术在 20 世纪 60 年代后期被开发出来,目的是更有效地利用硬件。硬件非常昂贵,而且可用性不高。处理工作主要外包给少数拥有计算机的地方。在一台 IBM System/360 上,可以并行运行多个环境,这些环境保持完全隔离,并使每个客户都产生拥有硬件的错觉。虚拟化是在粗粒度级别上实现的时间共享,隔离是该项技术的关键成就。