虚拟化技术分析

lucian 发表于 2009-08-17 11:18 | 来源:IT168 | 阅读 19 views

vm

虚拟化的含义丰富,应用广泛。服务器虚拟化是目前一个主要的虚拟化技术,即在一个宿主计算机上提供多个独立操作系统。本文将探索虚拟化背后的思想,然后讨论实现虚拟化的一些技术。我们还将了解现有的其他一些虚拟化技术,例如Linux上操作系统的虚拟化。

进行虚拟化就是要将某种形式的东西以另外一种形式呈现出来。对计算机进行虚拟化就是要将计算机以多台计算机或一台完全不同的计算机的形式呈现出来。

虚拟化也可以将多台计算机组合成一台计算机的形式呈现出来。这通常称为服务器聚合或网格计算。

下面让我们首先来看一下虚拟化的起源。

虚拟化的历史

虚拟化并不是什么新主题;实际上,它的存在已经超过40年了。虚拟化技术最早的一些用法包括IBM 7044、麻省理工学院(MIT)在IBM 704上开发的CTSS(Compatible Time Sharing System)以及曼彻斯特大学的Atlas项目(世界上最早的超级计算机之一),这些都是请求页面调度和监管进程调用的先驱。

硬件虚拟化

IBM早在20世纪60年代开发System/360 Model 67大型机时就认识到了虚拟化的重要性。Model 67通过VMM(Virtual Machine Monitor)对所有的硬件接口都进行了虚拟化。在早期计算中,操作系统被称为supervisor。能够在其他操作系统上运行的操作系统被称为 hypervisor(这个术语是在20世纪70年代出现的)。

VMM可以直接在底层硬件上运行,允许运行多个虚拟机(VM)。每个VM都可以运行一个自己私有操作系统的实例——在早些时候,这称为CMS(或 Conversational Monitor System)。之后VM继续发展,现在您可以在System z9大型机上发现VM。这提供了很好的向后兼容性,甚至是对System/360产品线的兼容性。

处理器虚拟化

虚拟化早期的另外一种用法(在本例中是对处理器的仿真)是 P-code(或伪码)机。P-code是一种机器语言,运行于虚拟机而不是实际硬件。P-code早在20世纪70年代就已在加州大学圣地亚哥分校 (UCSD)Pascal系统上颇有名气了,它将Pascal程序编译成 P-code,然后在一个P-code虚拟机上运行。这就使P-code程序具有了高度的可移植性,而且,只要有可用的P-code虚拟机,P-code 程序就可以运行。

20世纪60年代对BCPL(Basic Combined Programming Language)的设计中也采用了相同的概念,C语言即由BCPL发展而来。在这种用法中,编译器会将BCPL代码编译成称为O-code的中间机器代 码。接下来的第二个步骤是将O-code编译成目标机器的原始语言。现代编译器所使用的这种模型为将编译器移植到新目标体系结构上提供了很大的灵活性(通 过一种中间语言将前端和后端分隔开来)。

指令集虚拟化

虚拟化最新的发展称为指令集虚拟化,或者二进制转换。在这种模型中,虚拟指令集被转换成底层硬件的物理指令集,这个过程通常都是动态的。当代码执行时, 就会对代码的某个段进行转换。如果出现分支情况,就会导入新代码集并进行转换。这使它与缓存操作非常类似,后者是将指令块从内存移动到本地快速缓存中执 行。

这种模型最近在Transmeta设计的Crusoe中央 处理单元(CPU)中得到了使用。二进制转换由Code Morphing的专利技术实现。类似的一个例子是完全虚拟化解决方案通过运行时代码扫描来查找和重定向特权指令(用来解决特定处理器指令集的一些问 题)。

虚拟化的类型

实现虚拟化的方法不止一种。实际上,有几种方法都可以通过不同层次的抽象来实现相同的结果。本节将介绍Linux中常用的3种虚拟化方法,以及它们相应 的优缺点。业界有时会使用不同的术语来描述相同的虚拟化方法。本文中使用的是最常用的术语,同时给出了其他术语以供参考。

硬件仿真

毫无疑问,最复杂的虚拟化实现技术就是硬件仿真。在这种方法中,可以在宿主系统上创建一个硬件VM来仿真所想要的硬件,如图1所示。

硬件仿真

图1. 硬件仿真使用VM来模拟所需要的硬件

正如您所能预见的一样,使用硬件仿真的主要问题是速度会非常慢。由于每条指令都必须在底层硬件上进行仿真,因此速度减慢100倍的情况也并不稀奇。若要实现高度保真的仿真,包括周期精度、所仿真的CPU管道以及缓存行为,实际速度差距甚至可能会达到1000倍之多。

硬件仿真也有自己的优点。例如,使用硬件仿真,您可以在一个 ARM 处理器主机上运行为PowerPC设计的操作系统,而不需要任何修改。您甚至可以运行多个虚拟机,每个虚拟器仿真一个不同的处理器。

完全虚拟化

完全虚拟化(full virtualization),也称为原始虚拟化,是另外一种虚拟化方法。这种模型使用一个虚拟机,它在客户操作系统和原始硬件之间进行协调(参见图 2)。“协调”在这里是一个关键,因为VMM在客户操作系统和裸硬件之间提供协调。特定受保护的指令必须被捕获下来并在hypervisor中进行处理, 因为这些底层硬件并不由操作系统所拥有,而是由操作系统通过hypervisor共享。

完全虚拟化

图2. 完全虚拟化使用hypervisor来共享底层硬件

虽然完全虚拟化的速度比硬件仿真的速度要快,但是其性能要低于裸硬件,因为中间经过了hypervisor的协调过程。完全虚拟化的最大优点是操作系统无需任何修改就可以直接运行。惟一的限制是操作系统必须要支持底层硬件(例如PowerPC)。

超虚拟化

超虚拟化(paravirtualization)是另外一种流行的虚拟化技术,它与完全虚拟化有一些类似。这种方法使用了一个hypervisor来 实现对底层硬件的共享访问,还将与虚拟化有关的代码集成到了操作系统本身中(参见图3)。这种方法不再需要重新编译或捕获特权指令,因为操作系统本身在虚 拟化进程中会相互紧密协作。

客户操作系统

图3. 超虚拟化与客户操作系统共享进程

正如前面介绍的一样,超虚拟化技术需要为hypervisor修改客户操作系统,这是它的一个缺点。但是超虚拟化提供了与未经虚拟化的系统相接近的性能。与完全虚拟化类似,超虚拟化技术可以同时支持多个不同的操作系统。

操作系统级的虚拟化

我们要介绍的最后一种技术是操作系统级的虚拟化,它使用的技术与前面所介绍的有所不同。这种技术在操作系统本身之上实现服务器的虚拟化。这种方法支持单个操作系统,并可以将独立的服务器相互简单地隔离开来(参见图4)。

 操作系统

图4. 操作系统级虚拟化实现服务器的隔离

操作系统级的虚拟化要求对操作系统的内核进行一些修改,但是其优点是可以获得原始性能。

为什么虚拟化如此重要?

在了解目前Linux可以使用的虚拟化方法之前,让我们先来了解一下虚拟化的优点。

从商业角度来看,使用虚拟化技术有很多原因。大部分原因都可以归结于服务器的巩固(server consolidation)。简单来说,如果您可以对一个服务器上多个未经充分利用的系统进行虚拟化,由于服务器的数量少了,显然可以节省大量电力、空 间、制冷和管理成本。由于很难确定服务器的利用情况,虚拟化技术支持称为动态迁移的技术。动态迁移(Live migration)允许操作系统及其应用程序迁移到新的服务器上,从而实现负载在可用硬件上的均衡。

虚拟化技术对于开发人员来说也非常重要。Linux内核占据了一个单一的地址空间,这意味着内核或任何驱动程序的故障都会导致整个操作系统的崩溃。虚拟 化技术意味着您可以运行多个操作系统,如果其中一个系统由于某个bug而崩溃了,那么hypervisor和其他操作系统都依然可以继续运行。这可以使内 核的调试非常类似于用户空间应用程序的调试。

与Linux有关的虚拟化项目

表1给出了几个Linux系统上的虚拟化项目,并着重介绍了其中的开源解决方案。

虚拟化

表1. 与Linux有关的虚拟化项目

Bochs是一个x86计算机仿真器,它在很多平台上(包括x86、PowerPC、Alpha、SPARC和MIPS)都可以移植和运行。使 Bochs更为有趣的是它不仅可以对处理器进行仿真,还可以对整个计算机进行仿真,包括计算机的外围设备,比如键盘、鼠标、视频图像硬件、网卡(NIC) 等。

Bochs可以配置作为一个老式的Intel 386或其后继处理器使用,例如486、Pentium、Pentium Pro或64位处理器。它甚至还可以对一些可选的图形指令进行仿真,例如MMX和3DNow。

使用Bochs仿真器,您可以运行任何Linux上的Linux发行版、Linux上的Microsoft Windows 95/98/NT/2000(以及各种应用程序),甚至Linux上的BSD(Berkeley Software Distribution)操作系统(FreeBSD、OpenBSD等)。

QEMU(仿真)

QEMU是另外一个仿真器,它与Bochs非常类似,不过也有一些值得一提的区别。QEMU支持两种操作模式。第一种是Full System Emulation(完全系统仿真)模式。这种模式与Bochs非常类似,它可以对一个具有处理器和外围设备的完整个人计算机(PC)进行仿真。这种模式 可以仿真很多处理器架构,例如x86、x86_64、ARM、SPARC、PowerPC和MIPS,其动态转换的速度也比较理想。使用这种模式,您可以 在Linux、Solaris和FreeBSD上仿真Windows操作系统(包括XP)和Linux。很多其他操作系统的组合也都可以得到支持(更多信 息请参看参考资料部分)。

QEMU还可以支持第二种模式,称为 User Mode Emulation(用户模式仿真)。这种模式只能宿主于Linux,在这种模式下,可以启动不同体系结构的二进制文件。例如,在x86平台上运行的 Linux系统上可以执行为MIPS体系架构编译的二进制文件。这种模式支持的其他体系结构还包括ARM、SPARC和PowerPC,而且还有很多尚在 开发之中。

VMware(完全虚拟化)

VMware是完全虚拟化的一个商业解决方案。在客户操作系统和裸硬件之间有一个hypervisor作为抽象层使用。这个抽象层允许任何操作系统在硬件上运行,而不需要了解任何其他客户操作系统。

VMware也会对可用的I/O硬件进行虚拟化,并将一些高性能的设备驱动程序加入到hypervisor中。

整个虚拟化后的环境都作为一个文件保存,这意味着整个系统(包括客户操作系统、VM和虚拟硬件)可以很容易地快速迁移到新宿主机器上进行负载均衡。

z/VM(完全虚拟化)

尽管IBM System z是一个新品牌,不过它实际上已经有很长的一段历史,可以一直追溯到20世纪60年代。System/360在1965年就可以支持使用虚拟机进行虚拟化。有趣的是,System z保留了对之前的System/360产品线的向后兼容性。

z/VM是System z上的操作系统hypervisor。其核心是Control Program(CP),它为客户操作系统,包括Linux,提供了物理资源的虚拟化(参见图5)。这样,多个处理器和其他资源就可以在多个客户操作系统上被虚拟化。

操作系统级虚拟化

图5. 使用z/VM的操作系统级虚拟化

z/VM也可以为想要相互通信的客户操作系统仿真一个客户局域网(LAN)。仿真完全是在hypervisor中进行的,因此相当安全。

Xen(超虚拟化)

Xen是一个来自于XenSource的操作系统级超虚拟化的免费开源解决方案。回想一下在超虚拟化中,hypervisor和操作系统会共同协作,虽然操作系统需要进行一些更改,但却可以带来接近于原始系统的性能。

就像Xen需要进行协作(对客户操作系统进行修改)一样,只有那些修补过的操作系统才可以通过Xen进行虚拟化。Linux本身就是开源的,所以从 Linux角度来看,这是一个很合理的折衷,因为最终可以获得比完全虚拟化更好的性能。但是从广泛支持的角度来看(例如对其他非开源操作系统的支持),这 显然是一个缺点。

Windows可以在Xen上作为一个客户操作系统运行,但是它只能在运行Intel Vanderpool或AMD Pacifica的系统上使用。支持Xen的其他操作系统包括Minix、Plan 9、NetBSD、FreeBSD和OpenSolaris。

User-mode Linux(超虚拟化)

User-mode Linux(UML)允许Linux操作系统在其他操作系统的用户空间中运行。每个客户Linux操作系统都存在于宿主Linux操作系统中的一个进程中 (参见图6)。这就允许Linux内核(使用自己的相关用户空间)在单个Linux内核中运行。

超虚拟化

图6. User-mode Linux中的Linux

在2.6版本的Linux内核中,UML驻留于主内核树内,但它必须提前启用,然后再重新编译才能使用。这些变化除了常见的虚拟化功能之外,还可以提供 设备的虚拟化。这样一来,客户操作系统就可以共享可用的物理设备,例如块设备(比如软盘、CD-ROM和文件系统)、控制台、NIC 设备、声音硬件等。

注意由于客户内核是在应用程序空间中运行的,因此它们必须为这种用法而被特殊编译(不过它们可以是不同的内核版本)。这样就产生了主机内核(硬件上的内 核)和客户内核(在主机内核的用户空间中运行)。这些内核甚至可以是嵌套的,这样就允许一个客户内核在另外一个运行于主机内核的客户内核上运行。

Linux-VServer(操作系统级虚拟化)

Linux-VServer是一个操作系统级虚拟化解决方案。Linux-VServer对Linux内核进行虚拟化,这样多个用户空间环境——又称为 Virtual Private Server(VPS)——就可以单独运行,而不需要互相了解。Linux-VServer通过修改Linux内核实现用户空间的隔离。

要将各个用户空间与其他用户空间隔离开来,就需要从上下文的概念入手。上下文是给定VPS进程使用的一个容器,这样通过诸如ps之类的工具就可以了解 VPS的进程。内核为最初的引导定义了一个缺省的上下文。另外管理端还能查看所有的上下文(所有的执行进程)。正如您可能猜到的那样,内核和内部数据结构 也需要进行修改来支持这种虚拟化方法。

Linux- VServer还使用了一种chroot格式来为每个VPS隔离root目录。虽然chroot允许指定新root目录,但还是需要其他一些功能(称为 Chroot-Barrier)来限制VPS脱离其隔离的root目录回到上级目录。给定一个隔离的root目录之后,每个VPS就可以拥有自己的用户列 表和root密码。

2.4和2.6版本的Linux内核支持Linux-VServer,它可以运行于很多平台之上,包括x86、x86-64、SPARC、MIPS、ARM 和 PowerPC。

OpenVZ(操作系统级虚拟化)

OpenVZ是另外一个操作系统级的虚拟化解决方案,它与Linux-VServer类似,不过也有一些有趣的区别。OpenVZ是一个支持虚拟化的内核(修改过的),可以支持用户空间隔离、VPS和一组用户管理工具。例如,您可以简单地从命令行创建一个新的VPS:

清单1. 从命令行创建VPS

$ vzctl create 42 –ostemplate fedora-core-4

Creating VPS private area

VPS private area was created

$ vzctl start 42

Starting VPS …

VPS is mounted

另外还可以使用vzlist命令显示目前创建的VPS,该命令与标准Linux ps命令类似。

为了对进程进行调度,OpenVZ还包括了两级CPU调度器。首先,调度器确定哪个VPS应该获得CPU。在这个步骤完成之后,第二级调度器会根据给定的标准Linux优先级挑选进程来执行。

OpenVZ还包括了所谓的beancounters。beancounter包括很多参数,这些参数为给定的VPS定义了资源分配。这为VPS提供了一定层次上的控制,定义了有多少内存可用,有多少进程间通信(IPC)对象可用等。

OpenVZ的一个特性是检查点功能和将VPS从一个物理服务器迁移到其他物理服务器上的能力。检查点意味着正在运行的VPS的状态被冻结并存储到一个文件中。然后可以将这个文件迁移到一个新服务器上并加以还原以使VPS恢复运行。

OpenVZ支持很多硬件体系结构,包括x86、x86-64和PowerPC。

对完全虚拟化和超虚拟化的硬件支持

回想一下IA-32(x86)体系结构在进行虚拟化时会产生的一些问题。特定的特权模式指令无法捕获,基于所使用的模式还可能返回不同的结果。例 如,x86 STR指令可以检索安全状态,但是所返回的值要取决于请求者特定的特权级别。在尝试在不同的层次对不同的操作系统进行虚拟化时,这会出现问题。例 如,x86支持4环保护,其中级别0(最高特权)通常运行操作系统,级别1和2支持操作系统服务,级别3(最低级别)支持应用程序。不过硬件供应商已经认 识到了这种缺陷(以及其他一些问题),并且已经开发了一些支持并加速虚拟化的新设计。

Intel正在开发新虚拟化技术,能在x86(VT-x)和Itanium(VT-i)体系架构上支持hypervisor。VT-x支持两种格式的操 作,一种用于VMM(root),另外一种用于客户操作系统(非root)。root格式完全是特权级的,而非root格式是非特权级的(即使对环0来说 也是如此)。这种体系架构支持定义指令来使VM(客户操作系统)退出到VMM和保存处理器状态。

AMD也开发了硬件辅助虚拟化技术,称为Pacifica。除了其他一些特性之外,Pacifica还为在特殊指令执行时保存的客户操作系统维护了一个 控制块。VMRUN指令允许虚拟机(及其相关的客户操作系统)一直运行,直到VMM重新获得控制权为止(这也是可配置的)。这种可配置能力允许CMM为每 个客户操作系统定制特权指令。Pacifica还可以使用宿主和客户内存管理单元(MMU)表来进行地址转换。

这些新技术也可以应用到此处讨论的很多其他虚拟化技术中,包括Xen、VMware、User-mode Linux等。

Linux KVM(内核虚拟机)

Linux传出的最新消息是将KVM合并到Linux内核中(2.6.20)。KVM是一种完全虚拟化解决方案,它有一个方面非常独特:它将Linux 内核转换为一个使用内核模块的hypervisor。这个模块允许使用其他客户操作系统,然后在宿主Linux内核的用户空间中运行(参见图7)。内核中 的KVM通过/dev/kvm字符设备来公开虚拟化后的硬件。客户操作系统使用为PC硬件仿真修改过的QEMU进程与KVM模块接口。

内核虚拟机

图 7. 使用内核虚拟机(KVM)的虚拟化

KVM模块向内核中引入了一个新的执行模块。普通内核支持内核模式和用户模式,而KVM则引入了一种客户模式。客户模式用来执行所有非I/O客户代码,而普通用户模式支持客户I/O。

KVM的引入是Linux的一个有趣革新,因为它代表了作为主流Linux内核一部分的第一个虚拟化技术。它已经存在于2.6.20树中,不过也可以作 为2.6.19内核的一个内核模块使用。当在支持虚拟化的硬件上运行时,KVM支持 Linux(32位和64位)和 Windows(32位)客户机。

结束语

如果40年前出现的技术还可以算是”新”技术的话,那么虚拟化就是一个重要的新技术领域。虚拟化技术已经在很多场合中应用过了,但现在主要的关注点是服 务器和操作系统的虚拟化。与Linux非常类似,虚拟化为性能、可移植性和灵活性提供了很多选项。这意味着您可以选择最适合于您自己应用程序的虚拟化方 法。

喜欢VVVPS的文章,那就通过 RSS Feed 功能订阅阅读吧!

已经有5 个评论

  1. TabathaTillman21 说:

    I realize that good students attempt to create the essays of extra quality. But, not experienced students order custom essays at the business writing service and get a lot of advantages.

  2. essays 说:

    Academic career is really important for university students. Nevertheless, they spend their money for different staff rather than high quality custom research paper. Do a bright decision utilize assistance of the essay writing service to save your grade.

  3. thesis writing service 说:

    After know this commentary I drink in a lot on how to comp articles. As a graduate, I have neverclosed one prevalent assignment and always use buy thesis. What a shame! But now I have cool in writing. Thank you.

  4. thesis writing 说:

    I could just dream about such talent in thesis research close to this topic composing. I ordinarily take the aid of the reliable thesis service. In such case it sutes me the best.

  5. academic writing jobs 说:

    Have you known about Freelance writing job service? I wanted to say that the thoughts referring to this post is great! Thank you so much for doing it!

我要评论

*

* 绝不会泄露



返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明 |