进行虚拟化 就是要将某种形式的东西以另一种形式呈现出来。对计算机进行虚拟化就是要将计算机以多台计算机或一台彻底不一样的计算机的形式呈现出来。html
虚拟化也能够将多台计算机组合成一台计算机的形式呈现出来。这一般称为服务器聚合或网格计算。前端
下面让咱们首先来看一下虚拟化的起源。linux
虚拟化并非什么新主题;实际上,它的存在已经超过 40 年了。虚拟化技术最先的一些用法包括 IBM® 704四、麻省理工学院(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 所示。
正如您所能预见的同样,使用硬件仿真的主要问题是速度会很是慢。因为每条指令都必须在底层硬件上进行仿真,所以速度减慢 100 倍的状况也并不稀奇。若要实现高度保真的仿真,包括周期精度、所仿真的 CPU 管道以及缓存行为,实际速度差距甚至可能会达到 1000 倍之多。
硬件仿真也有本身的优势。例如,使用硬件仿真,您能够在一个 ARM 处理器主机上运行为 PowerPC® 设计的操做系统,而不须要任何修改。您甚至能够运行多个虚拟机,每一个虚拟器仿真一个不一样的处理器。
彻底虚拟化(full virtualization),也称为原始虚拟化,是另一种虚拟化方法。这种模型使用一个虚拟机,它在客户操做系统和原始硬件之间进行协调(参见图 2)。“协调”在这里是一个关键,由于 VMM 在客户操做系统和裸硬件之间提供协调。特定受保护的指令必须被捕获下来并在 hypervisor 中进行处理,由于这些底层硬件并不禁操做系统所拥有,而是由操做系统经过 hypervisor 共享。
虽然彻底虚拟化的速度比硬件仿真的速度要快,可是其性能要低于裸硬件,由于中间通过了 hypervisor 的协调过程。彻底虚拟化的最大优势是操做系统无需任何修改就能够直接运行。唯一的限制是操做系统必需要支持底层硬件(例如 PowerPC)。
超虚拟化(paravirtualization)是另一种流行的虚拟化技术,它与彻底虚拟化有一些相似。这种方法使用了一个 hypervisor 来实现对底层硬件的共享访问,还将与虚拟化有关的代码集成到了操做系统自己中(参见图 3)。这种方法再也不须要从新编译或捕获特权指令,由于操做系统自己在虚拟化进程中会相互紧密协做。
正如前面介绍的同样,超虚拟化技术须要为 hypervisor 修改客户操做系统,这是它的一个缺点。可是超虚拟化提供了与未经虚拟化的系统相接近的性能。与彻底虚拟化相似,超虚拟化技术能够同时支持多个不一样的操做系统。
咱们要介绍的最后一种技术是操做系统级的虚拟化,它使用的技术与前面所介绍的有所不一样。这种技术在操做系统自己之上实现服务器的虚拟化。这种方法支持单个操做系统,并能够将独立的服务器相互简单地隔离开来(参见图 4)。
操做系统级的虚拟化要求对操做系统的内核进行一些修改,可是其优势是能够得到原始性能。
在了解目前 Linux 可使用的虚拟化方法以前,让咱们先来了解一下虚拟化的优势。
从商业角度来看,使用虚拟化技术有不少缘由。大部分缘由均可以归结于服务器的巩固(server consolidation)。简单来讲,若是您能够对一个服务器上多个未经充分利用的系统进行虚拟化,因为服务器的数量少了,显然能够节省大量电力、空间、制冷和管理成本。因为很难肯定服务器的利用状况,虚拟化技术支持称为动态迁移的技术。动态迁移(Live migration)容许操做系统及其应用程序迁移到新的服务器上,从而实现负载在可用硬件上的均衡。
虚拟化技术对于开发人员来讲也很是重要。Linux 内核占据了一个单一的地址空间,这意味着内核或任何驱动程序的故障都会致使整个操做系统的崩溃。虚拟化技术意味着您能够运行多个操做系统,若是其中一个系统因为某个 bug 而崩溃了,那么 hypervisor 和其余操做系统都依然能够继续运行。这可使内核的调试很是相似于用户空间应用程序的调试。
表 1 给出了几个 Linux 系统上的虚拟化项目,并着重介绍了其中的开源解决方案。
项目 | 类型 | 许可证 |
---|---|---|
Bochs | 仿真 | LGPL |
QEMU | 仿真 | LGPL/GPL |
VMware | 彻底虚拟化 | 私有 |
z/VM | 彻底虚拟化 | 私有 |
Xen | 超虚拟化 | GPL |
UML | 超虚拟化 | GPL |
Linux-VServer | 操做系统级虚拟化 | GPL |
OpenVZ | 操做系统级虚拟化 | GPL |
有关其余解决方案的信息,请参看 参考资料 部分。
Bochs 是一个 x86 计算机仿真器,它在不少平台上(包括 x8六、PowerPC、Alpha、SPARC 和 MIPS)均可以移植和运行。使 Bochs 更为有趣的是它不只能够对处理器进行仿真,还能够对整个计算机进行仿真,包括计算机的外围设备,好比键盘、鼠标、视频图像硬件、网卡(NIC)等。
Bochs 能够配置做为一个老式的 Intel® 386 或其后继处理器使用,例如 48六、Pentium、Pentium Pro 或 64 位处理器。它甚至还能够对一些可选的图形指令进行仿真,例如 MMX 和 3DNow。
使用 Bochs 仿真器,您能够运行任何 Linux 上的 Linux 发行版、Linux 上的 Microsoft® Windows® 95/98/NT/2000(以及各类应用程序),甚至 Linux 上的 BSD(Berkeley Software Distribution)操做系统(FreeBSD、OpenBSD 等)。
QEMU 是另一个仿真器,它与 Bochs 很是相似,不过也有一些值得一提的区别。QEMU 支持两种操做模式。第一种是 Full System Emulation(彻底系统仿真)模式。这种模式与 Bochs 很是相似,它能够对一个具备处理器和外围设备的完整我的计算机(PC)进行仿真。这种模式能够仿真不少处理器架构,例如 x8六、x86_6四、ARM、SPARC、PowerPC 和 MIPS,其动态转换的速度也比较理想。使用这种模式,您能够在 Linux、Solaris 和 FreeBSD 上仿真 Windows 操做系统(包括 XP)和 Linux。不少其余操做系统的组合也均可以获得支持(更多信息请参看 参考资料 部分)。
QEMU 还能够支持第二种模式,称为 User Mode Emulation(用户模式仿真)。这种模式只能宿主于 Linux,在这种模式下,能够启动不一样体系结构的二进制文件。例如,在 x86 平台上运行的 Linux 系统上能够执行为 MIPS 体系架构编译的二进制文件。这种模式支持的其余体系结构还包括 ARM、SPARC 和 PowerPC,并且还有不少尚在开发之中。
VMware 是彻底虚拟化的一个商业解决方案。在客户操做系统和裸硬件之间有一个 hypervisor 做为抽象层使用。这个抽象层容许任何操做系统在硬件上运行,而不须要了解任何其余客户操做系统。
VMware 也会对可用的 I/O 硬件进行虚拟化,并将一些高性能的设备驱动程序加入到 hypervisor 中。
整个虚拟化后的环境都做为一个文件保存,这意味着整个系统(包括客户操做系统、VM 和虚拟硬件)能够很容易地快速迁移到新宿主机器上进行负载均衡。
尽管 IBM System z™ 是一个新品牌,不过它实际上已经有很长的一段历史,能够一直追溯到 20 世纪 60 年代。System/360 在 1965 年就能够支持使用虚拟机进行虚拟化。有趣的是,System z 保留了对以前的 System/360 产品线的向后兼容性。
z/VM® 是 System z 上的操做系统 hypervisor。其核心是 Control Program(CP),它为客户操做系统,包括 Linux,提供了物理资源的虚拟化(参见图 5)。这样,多个处理器和其余资源就能够在多个客户操做系统上被虚拟化。
z/VM 也能够为想要相互通讯的客户操做系统仿真一个客户局域网(LAN)。仿真彻底是在 hypervisor 中进行的,所以至关安全。
Xen 是一个来自于 XenSource 的操做系统级超虚拟化的免费开源解决方案。回想一下在超虚拟化中,hypervisor 和操做系统会共同协做,虽然操做系统须要进行一些更改,但却能够带来接近于原始系统的性能。
就像 Xen 须要进行协做(对客户操做系统进行修改)同样,只有那些修补过的操做系统才能够经过 Xen 进行虚拟化。Linux 自己就是开源的,因此从 Linux 角度来看,这是一个很合理的折衷,由于最终能够得到比彻底虚拟化更好的性能。可是从普遍支持的角度来看(例如对其余非开源操做系统的支持),这显然是一个缺点。
Windows 能够在 Xen 上做为一个客户操做系统运行,可是它只能在运行 Intel Vanderpool 或 AMD Pacifica 的系统上使用。支持 Xen 的其余操做系统包括 Minix、Plan 九、NetBSD、FreeBSD 和 OpenSolaris。
User-mode Linux(UML)容许 Linux 操做系统在其余操做系统的用户空间中运行。每一个客户 Linux 操做系统都存在于宿主 Linux 操做系统中的一个进程中(参见图 6)。这就容许 Linux 内核(使用本身的相关用户空间)在单个 Linux 内核中运行。
在 2.6 版本的 Linux 内核中,UML 驻留于主内核树内,但它必须提早启用,而后再从新编译才能使用。这些变化除了常见的虚拟化功能以外,还能够提供设备的虚拟化。这样一来,客户操做系统就能够共享可用的物理设备,例如块设备(好比软盘、CD-ROM 和文件系统)、控制台、NIC 设备、声音硬件等。
注意因为客户内核是在应用程序空间中运行的,所以它们必须为这种用法而被特殊编译(不过它们能够是不一样的内核版本)。这样就产生了主机内核(硬件上的内核)和客户内核(在主机内核的用户空间中运行)。这些内核甚至能够是嵌套的,这样就容许一个客户内核在另一个运行于主机内核的客户内核上运行。
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,它能够运行于不少平台之上,包括 x8六、x86-6四、SPARC、MIPS、ARM 和 PowerPC。
OpenVZ 是另一个操做系统级的虚拟化解决方案,它与 Linux-VServer 相似,不过也有一些有趣的区别。OpenVZ 是一个支持虚拟化的内核(修改过的),能够支持用户空间隔离、VPS 和一组用户管理工具。例如,您能够简单地从命令行建立一个新的 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 支持不少硬件体系结构,包括 x8六、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 内核中(2.6.20)。KVM 是一种彻底虚拟化解决方案,它有一个方面很是独特:它将 Linux 内核转换为一个使用内核模块的 hypervisor。这个模块容许使用其余客户操做系统,而后在宿主 Linux 内核的用户空间中运行(参见图 7)。内核中的 KVM 经过 /dev/kvm
字符设备来公开虚拟化后的硬件。客户操做系统使用为 PC 硬件仿真修改过的 QEMU 进程与 KVM 模块接口。
KVM 模块向内核中引入了一个新的执行模块。普通内核支持内核 模式和用户 模式,而 KVM 则引入了一种客户 模式。客户模式用来执行全部非 I/O 客户代码,而普通用户模式支持客户 I/O。
KVM 的引入是 Linux 的一个有趣革新,由于它表明了做为主流 Linux 内核一部分的第一个虚拟化技术。它已经存在于 2.6.20 树中,不过也能够做为 2.6.19 内核的一个内核模块使用。当在支持虚拟化的硬件上运行时,KVM 支持 Linux(32 位和 64 位)和 Windows(32 位)客户机。有关 KVM 的更多信息,请参看 参考资料 部分。
若是 40 年前出现的技术还能够算是“新”技术的话,那么虚拟化就是一个重要的新技术领域。虚拟化技术已经在不少场合中应用过了,但如今主要的关注点是服务器和操做系统的虚拟化。与 Linux 很是相似,虚拟化为性能、可移植性和灵活性提供了不少选项。这意味着您能够选择最适合于您本身应用程序的虚拟化方法。