虚拟设备和 Open Virtualization Format
虚拟设备 是通过虚拟化支持的一种软件交付形式,它促进了高效和优化的应用程序的交付,推动了快速成长的云计算浪潮。本文将探索虚拟化和虚拟设备背后的理念,虚拟设备对操作系统的影响,以及将简化虚拟设备软件部署的未来标准。虚拟设备的关键因素我们首先快速讨论一下虚拟设备背后的关键因素:虚拟化平台。操作系统代表针对各种应用程序的虚拟化平台(共享对处理器和资源的访问),而管理程序(hypervis
虚拟设备 是通过虚拟化支持的一种软件交付形式,它促进了高效和优化的应用程序的交付,推动了快速成长的云计算浪潮。本文将探索虚拟化和虚拟设备背后的理念,虚拟设备对操作系统的影响,以及将简化虚拟设备软件部署的未来标准。
我们首先快速讨论一下虚拟设备背后的关键因素:虚拟化平台。操作系统代表针对各种应用程序的虚拟化平台(共享对处理器和资源的访问),而管理程序(hypervisor)则代表针对各个操作系统的虚拟化平台。管理程序很重要,因为它支持在同一个系统上运行多个不同的操作系统。对于桌面用户而言,这种能力很重要,因为它允许桌面用户同时运行 Windows® 和 Linux®。对于服务器而言,这种能力支持托管多个操作系统,这些操作系统能够同时运行各种服务器应用程序,如 Web 服务器、电子邮件程序、数据库和其他有用的服务。另外,各个操作系统之间都是相互独立的,一个操作系统中的故障不会影响另一个操作系统。
我们首先快速讨论一下虚拟设备背后的关键因素:虚拟化平台。操作系统代表针对各种应用程序的虚拟化平台(共享对处理器和资源的访问),而管理程序(hypervisor)则代表针对各个操作系统的虚拟化平台。管理程序很重要,因为它支持在同一个系统上运行多个不同的操作系统。对于桌面用户而言,这种能力很重要,因为它允许桌面用户同时运行 Windows® 和 Linux®。对于服务器而言,这种能力支持托管多个操作系统,这些操作系统能够同时运行各种服务器应用程序,如 Web 服务器、电子邮件程序、数据库和其他有用的服务。另外,各个操作系统之间都是相互独立的,一个操作系统中的故障不会影响另一个操作系统。
对于服务器应用程序,虚拟化非常重要。美国环保局最近一份研究表明,典型服务器的利用率通常只有 5%。因此,服务器上还有许多空间、许多潜力可以挖掘,可以节约大量成本。虚拟化技术能够解决这个问题,它能够创建虚拟服务器,虚拟服务器上可以运行多个操作系统及其应用程序。这样,10 个或更多的物理服务器能够减少为一个运行 10 个或多个虚拟服务器的物理服务器(见图 1)。
图 1. 服务器虚拟化的好处
图 1 显示,每个软件堆栈(操作系统和应用程序)都是一个独立的虚拟机(VM)。一个虚拟机失败并不意味着所有虚拟机都会失败。但是,图 1 中最重要的部分是每个堆栈的顶部。每个软件堆栈的最终目的都与应用程序有关:应用程序是软件堆栈的真正价值所在。从这个意义上讲,虚拟设备只是应用程序的容器。应用程序有其自身的依赖项(如操作系统或库),但应用程序是关键因素。
因此,一个虚拟设备只是应用程序及其所有依赖项(操作系统、第三方库、配置等)的一个容器。下面让我们深入探讨虚拟设备及其替代品。
虚拟设备容器是一个 VM 映像(VMI),VMI 是一个包含 VM 的硬盘映像(包括内核、引导分区和引导文件系统)的文件。这个文件通常采用压缩格式 — 尤其是,该文件并不是根据 VM 的硬盘容量确定的,它的大小随着 VMI 的内容变化。从兼容性角度看,VMI 的格式很重要,我将稍后介绍这个主题。
您可以将虚拟设备视为一个软件堆栈,这个软件堆栈包含目标应用程序、库、服务配置、相关数据和操作系统。另外,虚拟设备不仅仅是一组合并的元素,它还针对特定应用程序进行了配置和优化(见图 2)。
图 2. 虚拟设备剖析
但说到底,虚拟设备只不过是一个大文件,管理程序可以用它创建一个 VM 实例。作为一个文件,虚拟设备拥有一些有用的特性 — 比如,复制(以便备份)和在多个管理程序之间移动(称为 VM 迁移)。
虚拟设备的优势是,关注点在应用程序上。VMI 包含在虚拟环境中运行应用程序所需的所有组件,它针对应用程序进行配置和优化,从而简化了应用程序的部署。现在,考虑一下一种替代方法:同样的应用程序可以在一个 VMI 之外分发并在任意操作系统上运行,这需要编译应用程序及其所有依赖库和服务,然后配置和调优应用程序和环境。应用程序也可以有特定的操作系统要求。这个过程很常见,其复杂性取决于应用程序本身,但这个过程会耗费大量时间,而且容易出错。
这两种方法之间的根本区别在于对应用程序的关注点不同。例如,一个应用程序安装可能已根据特定操作系统(或特定文件系统)量身定做,也可能需要安装某些服务(如数据库)和库(以满足这些服务的依赖项),而且,这些元素可能都需要配置和调优。一旦该应用程序部署到一个特定系统后,它也就被绑定到那个系统之上了。
VMI 依赖一个兼容的管理程序,而且可能需要对该管理程序的设备模拟进行一些配置,但其关注点还是在应用程序上。但是,除了配置简单外,虚拟设备还有别的价值。现在,让我们看看虚拟设备的一个关键特性。
当您开始从应用程序角度看待虚拟设备时,您可以开始调整并调优应用程序周围的整个环境。考虑一下操作系统。对于特定应用程序,某个操作系统服务可能不是必须的,但其他服务对于目标应用程序的性能可能很重要。这个上下文中提到的操作系统称为 Just Enough Operating System,或 JeOS(发音与 juice 相同)。VMware 首先提出这个术语,表示针对虚拟设备的理想构造。
尽管 VMware 创造了这个术语,但实践却花了很长时间。基于 Linux 的嵌入式系统通常采用一个规模更小的内核和应用程序堆栈,这比提供的嵌入式设置更适合受限制的环境。然而,VMware 的应用不仅仅是最小化服务以支持一个受限制的环境。服务器空间中的硬盘空间和内存通常很充足,但实际上很多硬盘空间和内存都处于闲置状态。更少的服务和驱动程序意味着给定系统上需要维护的软件更少,从管理角度看,这意味着更新操作系统需要的补丁更少(更新需要的带宽和存储空间也就更少)。
从可靠性角度看,JeOS 提供了一些好处。通过排除给定系统不需要的软件,您减少了故障发生的几率并提高了稳定性。这还将最小化系统遭受攻击的几率(更少的服务意味着攻击系统的路径更少),从而提高软件堆栈的安全性。
Linux(一个单片内核)提供通过模块动态调整操作系统的方法,但更大程度的架构最小化只能通过内核编译实现。相比之下,微核操作系统提供动态抛出功能的方法,从而提供伸缩性更好的环境。为实现上述目标,微核创建一个只包含基本服务(如内存管理和调度)的内核并将其他功能推到内核之外。除了提供伸缩性更好的环境之外,微核还能提供稳定性优势。特权空间中运行的代码越少,操作系统失败的可能性也就越小。
要最小化 Linux 内核,您可以采用两种完全不同的方法。第一种方法是通过内核构建流程手动配置内核。尽管这也许是(针对特定应用程序)最小化内核的最精确的方法,但还有简单得多的方法。大多数 Linux 发布版供应商提供 JeOS 版本,这些操作系统版本专门针对在一个管理程序上运行的虚拟设备配置(参见 参考资料 的链接获取更多信息)。
Ubuntu JeOS 是针对在 VMware ESXi、VMware Server 或 Kernel-based Virtual Machine (KVM) Linux 管理程序上的运行而优化的 Ubuntu 版本。它不包含图形环境,在内存低于 380MB 的 Intel® 或 AMD x86 架构上运行。Ubuntu JeOS 还包含 ubuntu-vm-builder 实用程序,它用于根据用户定义的规范构建虚拟设备。
SUSE Linux 也提供一个 JeOS 环境,名为 SUSE Appliance Program。这个环境与 Ubuntu 的发布版类似,但也有一些明显的差别。这个 SUSE 版本使用 SUSE Linux 内核并根据您的特定需求提供几个虚拟设备构建工具。SUSE 提供 Kiwi,这是一个支持通过 XML 创建设备规范的基于命令行的工具。通过 Kiwi,您可以以各种格式构建虚拟设备,这些格式包括 LiveCD、可引导 USB 映像和 OVF。最后,SUSE Studio 提供一个易用的基于 Web 的设备创建工具,该工具提供点选式构造方法。
另外两个软件 — Oracle Enterprise Linux JeOS 和 OpenSolaris JeOS project— 提供类似的功能以构建小规模的虚拟设备。但一个最早的商业解决方案 —— 来自 rPath 的 rBuilder —— 可以用于构建在线虚拟设备。rBuilder 使用一个基于 Web 的前端,允许使用 rPath 的 Linux 发行版、CenOS 或 Ubuntu 构建公共虚拟设备。
最后,OVF Toolkit 是一组 Eclipse 插件和一个 Java™ API,可以用于构建 OVF 格式的虚拟设备包。参考资料 部分提供了一个链接,链接到一个介绍这个工具的用法的优秀教程。
虚拟设备只有具备可移植性才有用。获得一个虚拟设备并在 VMware 上运行(正如您在 Xen 或 KVM 上所做的那样)的能力意味着该设备有更多利用机会。这就是 OVF(以前称为 Open Virtual Machine Format)的作用所在。OVF 是一个针对 VM(这里为虚拟设备)的可移植的(意味着中立于管理程序)分发方法的规范。使用 OVF,您可以安全有效地打包并分发虚拟设备。OVF 甚至可以表示单个包中的多个 VM。OVF 是可扩展的,允许随着虚拟化的发展进行扩展。
OVF 是一种 XML 格式,描述一个 VM(磁盘格式)的所有特性,包括组成 VM 的磁盘,VM 的网络配置,VM 需要的处理器和内存资源,描述虚拟设备创建程序的各种元数据,VM 的目标以及操作系统描述。参考资料 部分提供了一份 VMware OVF 白皮书的链接,该白皮书包含一个 OVF 的完整示例。
另外,有一些工具可以将旧格式的 VM 转换为 OVF。例如,可以使用 ovftool
将旧格式的 .vmx VM 文件转换为 OVF。您还可以发现一些将 VMware 和 QEMU 转换为 VirtualBox 并将 VMware 转换为 Xen 和 Parallels 的工具。
虚拟设备是解决复杂应用程序部署问题的一种简单方法,具体方法是通过将预先配置的应用程序和一个(刚好够用的)操作系统合并为一个映像,以便在一个管理程序上运行。您可以找到几乎包括任何应用程序的虚拟设备 —— 从防火墙和安全设备再到服务器、备份设备和存储应用程序(包括复制和归档)。
虚拟设备不仅能为个人用户简化应用程序部署过程,还能支持下一代云计算架构。大多数云计算基础设施都提供便于部署的虚拟设备以满足任意需求,而不是花费大量时间构建一个专门化的应用程序发行版。由于虚拟设备只是带有一个包装器(XML 描述)的文件,因此复制和分发这样的设备都很简单。
OVF 规范是由几个公司共同开发的,这些公司同时涉足虚拟化和硬件开发领域,包括 IBM、Microsoft、Hewlett-Packard、Dell、VMware 和 XenSource。既然这些大公司都能在 OVF 这样的规范上达成共识,可以想见,虚拟设备肯定前景广阔。随着围绕虚拟设备的开发不断深入,虚拟设备必然会不断发展,诸如 OVF 之类的新规范肯定会发挥应有的作用。
Linux 虚拟化和 PCI 透传技术
平台虚拟化是在两个或多个操作系统之间共享一个平台,以便更有效地利用资源。但平台 并不只是意味着一个以上的处理器,它还包含组成平台的其他重要元素,比如存储器、网络和其他硬件资源。某些硬件资源可以轻松虚拟化,比如处理器和存储器;而另一些硬件资源则不然,比如视频适配器和串口。当共享不可能或没用时,Peripheral Component Interconnect (PCI) 透传技术提供有效使用这些资源的方法。本文探索透传(passthrough)技术的概念及其在管理程序(hypervisor)中的实现,详细介绍支持这个最新创新技术的管理程序。
在探索透传技术之前,让我们先讨论一下如今设备模拟在两个管理程序架构中是如何工作的。第一个架构将设备模拟整合到管理程序中,而第二个架构将设备模拟推到管理程序之外的一个应用程序中。
管理程序中的设备模拟 是在 VMware 工作站产品(一个基于操作系统的管理程序)中实现的一个公共方法。在这个模型中,管理程序包含各种客户操作系统能够共享的公共设备,如虚拟磁盘、虚拟网络适配器和其他必需的平台元素。这个特定模型如图 1 所示。
图 1. 基于管理程序的设备模拟
第二个架构称为用户空间设备模拟(见图 2)。顾名思义,这种设备模拟是在用户空间中实现的,而不嵌入到管理程序中。QEMU(不仅提供设备模拟,还提供一个管理程序)提供设备模拟,用于大量独立管理程序,如 Kernel-based Virtual Machine (KVM) 和 VirtualBox 等。这个模型更具优势,因为设备模拟独立于管理程序,因而可以在多个管理程序之间共享。另外,这个模型还支持任意设备模拟,无须管理程序(以特权状态运行)负担这个功能。
图 2. 用户空间设备模拟
将设备模拟从管理程序推向用户空间有一些明显的优势,最大的优势涉及所谓的可信计算基础(trusted computing base,TCB)。一个系统的 TCB 是对该系统安全性很关键的所有安全组件的集合。有一点是显而易见的:如果系统被最小化,出现 bug 的可能性也就更小,因此系统也就越安全。这个原理也适用管理程序。管理程序的安全性很重要,因为它分隔多个独立的客户操作系统。管理程序中的代码越少(将设备模拟推到特权较低的用户空间中),将特权泄露给不可信用户的机率也就越少。
基于管理程序的设备模拟的另一个变体是准虚拟化(paravirtualized)驱动程序。在这个模型中,管理程序包含物理驱动程序,每个客户操作系统包含一个管理程序可以感知的驱动程序,这个驱动程序与管理程序驱动程序(称为准虚拟化 或 PV 驱动程序)配合工作。
无论设备模拟发生在管理程序内还是在一个客户虚拟机(VM)之上,模拟方法都是相似的。设备模拟能够模拟一个特定设备(如 Novell NE1000 网络适配器)或一个特定磁盘类型(如 Integrated Device Electronics [IDE])。物理硬盘可以完全不同 — 例如,尽管一个 IDE 驱动器被模拟为客户操作系统,物理硬件平台可以使用一个串口 ATA (SATA) 驱动器。这种技术很有用,因为 IDE 支持在许多操作系统中都很普遍,可以用作一个通用标准,而不是要求所有操作系统都支持更高级的驱动器类型。
正如上面介绍的两个设备模型所示,设备共享是有代价的。无论设别模拟是在管理程序还是在一个独立 VM 中的用户空间中执行,都存在开销。只要有多个客户操作系统需要共享这些设备,这个开销就是值得的。如果共享不是必须的,则有更有效的方法来共享这些设备。
因此,在最高层面上,设备透传就是向一个特定客户操作系统提供一种设备隔离,以便该设备能够被那个客户操作系统独占使用(见图 3)。但这种技术为什么有用?设备透传之所以有价值,原因有很多,其中两个最重要的原因是性能以及提供本质上不能共享的设备的专用权。
图 3. 管理程序内的设备透传
对于性能而言,使用设备透传可以获得近乎本机的性能。对于某些网络应用程序(或那些拥有高磁盘 I/O 的应用程序)来说,这种技术简直是完美的。这些网络应用程序没有采用虚拟化,原因是穿过管理程序(达到管理程序中的驱动程序或从管理程序到用户空间模拟)会导致竞争和性能降低。但是,当这些设备不能被共享时,也可以将它们分配到特定的客户机中。例如,如果一个系统包含多个视频适配器,则那些适配器可以被传递到特定的客户域中。
最后,可能有一些只有一个客户域使用的专用 PCE 设备,或者有一些不受管理程序支持因而应该被传递到客户机的设备。单独的 USB 端口可以与一个给定域隔离,一个串口(自身不是可共享的)可以与一个特定客户机隔离。
早期的设备模拟类型在管理程序中实现影子(shadow)形式的设备接口,以便为客户操作系统提供一个到硬件的虚拟接口。这个虚拟接口包含预期的接口,包括表示设备(如 shadow PCI)的虚拟地址空间和虚拟中断。但是,由于有一个设备驱动程序与虚拟接口通信,且有一个管理程序为实际硬件转换这种通信,因此开销非常大 — 特别是在诸如网络适配器之类的高带宽设备中。
Xen 使 PV 方法(上一小节介绍过)得以流行,PV 方法通过使客户操作系统驱动程序意识到它正在被虚拟化来减少性能降低幅度。在本例中,客户操作系统将不会看到一个设备(比如网络适配器)的 PCI 空间,而是一个提供高级抽象(比如包接口)的网络适配器应用程序编程接口(API)。这种方法的缺点是客户操作系统必须针对 PV 进行修改,优点是在某些情况下您可以得到近乎本机的性能。
在设备透传技术早期发展过程中,开发人员使用一个瘦模拟模型,在该模型中,管理程序提供基于软件的内存管理(将客户操作系统地址空间转换为可信主机地址空间)。尽管开发人员在早期提供了隔离一个设备和一个客户操作系统的方法,但那种方法缺乏大型虚拟化环境需要的性能和伸缩性。幸运的是,处理器供应商已经为下一代处理器装备了一些指令,以支持管理程序和用于设备透传的逻辑,包括终端虚拟化和直接内存访问(DMA)支持。因此,新的处理器提供 DMA 地址转换和权限检查以实现有效的设备透传,而不是捕获并模拟对管理程序下的物理设备的访问。
Intel 和 AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为Virtualization Technology for Directed I/O (VT-d),而 AMD 称之为 I/O Memory Management Unit (IOMMU)。不管是哪种情况,新的 CPU 都提供将 PCI 物理地址映射到客户虚拟系统的方法。当这种映射发生时,硬件将负责访问(和保护),客户操作系统在使用该设备时,就仿佛它不是一个虚拟系统一样。除了将客户机映射到物理内存外,新的架构还提供隔离机制,以便预先阻止其他客户机(或管理程序)访问该内存。Intel 和 AMD CPU 提供更多虚拟化功能,您可以在 参考资料 部分了解更多信息。
另一种帮助将中断缩放为大量 VM 的技术革新称为 Message Signaled Interrupts (MSI)。MSI 将中断转换为更容易虚拟化的消息(缩放为数千个独立中断),而不是依赖将被关联到一个客户机的物理中断 pin。从 PCI 2.2 开始,MSI 就已经可用,但 PCI Express (PCIe) 也提供 MSI,在 PCIe 中,MSI 支持将结构缩放为多个设备。MSI 是理想的 I/O 虚拟化技术,因为它支持多个中断源的隔离(而不是必须通过软件多路传输或路由的物理 pin)。
使用最新的支持虚拟化的处理器架构,有多个管理程序和虚拟化解决方案支持设备透传。您将在 Xen 和 KVM 以及其他管理程序中发现设备透传支持(使用 VT-d 或 IOMMU)。在多数情况下,客户操作系统(域为 0)必须被编译为支持透传,这通常作为一个内核构建时选项提供。也许还需要对主机 VM 隐藏设备(Xen 中使用 pciback
实现)。PCI 中有一些限制(例如,一个 PCIe-to-PCI 桥接器后面的 PCI 设备必须被分配到相同的域),但 PCIe 没有这种限制。
另外,您将在 libvirt(以及 virsh)中发现设备透传的配置支持,这为底层管理程序使用的配置模式提供一个抽象。
设备透传带来的一个问题体现在实时迁移方面。实时迁移 是指一个 VM 在迁移到一个新的物理主机期间暂停迁移,然后又继续迁移,该 VM 在这个时间点上重新启动。实时迁移是在一个物理主机网络上支持负载平衡的一个很好的特性,但使用透传设备时它会产生问题。PCI 热插拔(有几个关于它的规范)就是需要解决的一个问题。PCI 热插拔允许 PCI 设备从一个给定内核进出,这很理想 — 特别是将 VM 迁移到新主机上的管理程序时(设备需要在这个新管理程序中拔出然后再插入)。当设备被模拟(比如虚拟网络适配器)时,模拟提供一个抽象层以抽象物理硬件。这样,一个虚拟网络适配器可以在该 VM 内轻松迁移(这个 VM 还得到 Linux® 绑定驱动程序的支持,该驱动程序支持将多个逻辑网络适配器绑定到相同的接口上)。
I/O 虚拟化的未来实际上已经在今天实现。例如,PCIe 包含虚拟化支持。一种适合服务器虚拟化的虚拟化概念被称为 Single-Root I/O Virtualization (SR-IOV),这种虚拟化技术(通过 PCI-Special Interest Group 或 PCI-SIG 创建)在单根复杂实例(在本例中为一个带有多个 VM 的服务器,这些 VM 共享一个设备)中提供设备虚拟化。另一个变体(称为 Multi-Root IOV)支持大型拓扑(比如刀片服务器,其中多个服务器能够访问一个或多个 PCIe 设备)。从某种意义上说,这种技术支持任意规模的大型设备网络,该网络可以包含服务器、终端设备和交换机(用于设备发现和包路由)。
通过 SR-IOV,一个 PCIe 设备不仅可以导出多个 PCI 物理功能,还可以导出共享该 I/O 设备上的资源的一组虚拟功能。这个简化的服务器虚拟化架构如图 4 所示。在这个模型中,不需要任何透传,因为虚拟化在终端设备上发生,从而允许管理程序简单地将虚拟功能映射到 VM 上以实现本机设备性能和隔离安全。
图 4. 通过 SR-IOV 实现透传
虚拟化的发展已经历经 50 多年,但直到现在 I/O 虚拟化才引起广泛注意。商业处理器虚拟化支持只出现了 5 年时间。因此,从本质上说,平台和 I/O 虚拟化将如何发展已迫在眉睫。作为诸如云计算之类的未来架构的关键元素,虚拟化肯定会成为值得关注的有趣技术。和往常一样,Linux 处于支持这些新技术的前沿阵地,最新的内核(2.6.27 或更高)已经开始包含对这些新的虚拟技术的支持。
更多推荐
所有评论(0)