Linux虚拟化技术分析(下)

日期: 2009-03-17 作者:M. Tim Jones 来源:TechTarget中国 英文

  在本文的上半部分中,我们介绍了虚拟化的历史及其分类。在下半部分中,我们将继续分析虚拟化的重要性和硬件支持。

  为什么虚拟化如此重要?

  在了解目前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非常类似,虚拟化为性能、可移植性和灵活性提供了很多选项。这意味着您可以选择最适合于您自己应用程序的虚拟化方法。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐