《现代操作系统》-读书笔记-第七章-虚拟化和云

《现代操作系统》-读书笔记-第七章-虚拟化和云

恶意入侵者即使攻陷了 Web 服务器,也不能立印看到敏感的电子邮件。这个性质有时被称作沙盒(sandboxing)。虽然多计算机系统实现了隔离和容错,但是这种解决方案昂贵且难以管理,因为涉及的机器太多。

虚拟化的主要思想是虚拟机监控程序(Virtual Machine Monitor, VMM)在同一物理硬件上创建出有多台虚拟机器的假象。VMM 又称作虚拟机管理程序(hypervisor)。虚拟机分为,第一类虛拟机管理程序和第二类虚拟机管理程序。前者运行在裸机上,而后者依赖于底层操作系统提供的服务和抽象。无论是哪一类,虚拟化技术都允许单一计算机上运行多个虛拟机,各虛拟机能运行不同的操作系统。

这种方法的好处是一台虚拟机的故障不会影响其他虚拟机。缺点是:当然,这样整合不同服务器就相当于把鸡蛋放到同一个篮子里。如果运行虚拟机的机器本身出现故障,后果将比单个专用服务器的崩溃更具有灾难性。不过,虚拟化技术有效的前提是绝大多数服务中断不是硬件缺陷造成的,而是由于软件设计不周、不可靠、有缺陷、配置不当造成的,特别是操作系统。使用虚拟化技术时,只有虚拟机管理程序在最高特权级下运行,而虚拟机管理程序的代码行数比一个完整的操作系统少两个数量级,因而缺陷数量也少两个数量级。虚拟机管理程序比操作系统简单,因为它只做模拟裸机(通常是 Intel xt86 体系结构)的多个拷贝这一件事。

除了强隔离性之外,在虚拟机上运行软件还有其他好处。其中之一是物理机数量的减少节省了硬件和电力开销以及机架空间的占用。

虚拟机的另一个优势是设置检查点和虚拟机迁移(例如跨多台服务器进行负载均衡)比在普通操作系统上运行的迁移要容易得多。

虚拟机的另一个用途是在已停止支持或无法工作于当前硬件的操作系统(或操作系统版本)上运行遗留应用程序。遗留应用程序可以与当前应用程序同时运行在相同硬件上。事实上,能同时运行不同操作系统中的应用程序是虚拟机受欢迎的重要理由。

虚拟机还有一个重要用途是协助软件开发。程序员不需要在多台机器上安装不同操作系统来保证软件能在 Windows 7、Windows8、不同版本的 Linux、FreeBSD、OpenBSD、NetBSD、OS X 及其他操作系统上运行。相反,他只需在一台机器上创建一-些虚拟机来安装不同的操作系统。当然,他也可以对磁盘进行分区,在每个分区上安装不同的操作系统,但这种方法更加困难。首先,普通 PC 不管磁盘空间有多大,都只支持四个主分区。其次,虽然可以在引导块上安装多引导程序,但是不同操作系统之间的切换需要重启计算机。虚拟机使所有的操作系统都能同时运行,因为这些虚拟机实际上只是一些进程。

虚拟化技术目前最重要、最时髦的用途是云(cloud)。云的核心思想很直接:将你的计算或存储需求外包给一个管理良好的数据中心。领域专家组成的公司专门运营这个数据中心。由于数据中心通常是他人所有,因此你需要为使用的资源付费,但是你不用考虑机器、供电、冷却和维护问题。由于虚拟化技术提供了隔离性,因此云提供商可以允许多个客户甚至商业竞争对手共享单一物理机,每个客户分享一部分资源。早期有人认为这些资源是虚无缥缈的,现实中不会有机构愿意将敏感的数据和计算放到他人的资源上完成。然而,目前不计其数的机构在云上的虚拟机中运行着自己的应用程序。虽然并非适用于所有机构和所有数据,但云计算毫无疑问已取得了成功。

历史

伴随着近年来围绕虚拟化的大肆宣传,人们有时会忘记相对于互联网的出现,虚拟机是相当古老的技术。早在 20 世纪 60 年代,IBM 就试验了两个独立开发的虚拟机管理程序 SIMMON 和 CP-40。虽然 CP- 40只是一个研究项目,但它被重新实现为CP-67,构成了CP/CMS的控制程序。CP/CMS 是IBM System/360 Model 67的虚拟机操作系统。1972年,它又被重新实现为VM/370,用在System/370 系列上。 IBM在20世纪90年代将System/370产品线替换为System/390。这些更新基本上只有名字发生了变化,底层体系结构出于向后兼容性的原因保持不变。当然,硬件技术的改进使得新机器比老机器更大更快了。但就虚拟化而言,没有任何改变。2000 年,IBM 发布了 z 系列,支持 64 位地址空间,但仍向后兼容 System/360。在x86上的虚拟化技术流行起来的几十年前,这些系统就开始支持虚拟化技术了。

1974 年,加州大学洛杉矶分校(UCLA)的两位计算机科学家 Gerald Popek 和 Robert Goldberg 发表了一篇题为“Formal Requirements for Virtualizable Third Generation Architectures”的开创性论文。论文中列出了一个计算机体系结构有效支持虚拟化所需满足的条件(Popek 和 Goldberg, 1974)。任何关于虚拟化的书籍都会引用他们的工作和术语。同样起源于 20 世纪 70 年代的 x86 体系结构数十年来一直不满足论文中列出的条件。此外,自大型机以来几乎所有体系结构也不满足这些条件。20 世纪 70 年代是一个多产的年代,同时诞生的还有 UNIX、以太网、Cray-1、Microsoft 和 Apple。因此,无论你的父母说什么,20 世纪 70 年代绝不仅仅是迪斯科的年代!

事实上,真正的“迪斯科”变革起源于 20 世纪 90 年代,斯坦福大学的研究人员开发了一种名为 Disco 的新型虚拟机管理程序,接下来成立了 VMware. VMware 是虚拟化领域的巨头,提供第一类和第二类虚拟机管理程序,年收入数十亿美元(Bugnion 等人,1997; Bugnion 等人,2012)。巧合的是第一类和第二类虚拟机管理程序的区别也是 20 世纪 70 年代提出的(Goldberg, 1972)。VMware 在 1999 年推出了第一个虚拟化解决方案。接下来,更多虚拟化产品陆续涌现,如 Xen、KVM、VirtualBox、Hyper-V、Parallels 等。看起来此时才是推广虚拟化技术的合适时机,虽然理论早在 1974 年就明确了,IBM 也已销售了支持并广泛使用虚拟化技术的计算机长达几十年之久。尽管 1999 年虚拟化技术突然间受到了广泛关注,然而它并不是一项新技术。

虚拟化的必要条件

对于虚拟机来讲,非常重要的一点是要像真实的机器那样运转。例如,虚拟机要能像真实的机器那样启动,支持安装任意操作系统。虚拟机管理程序的任务就是提供这种幻象,并高效地实现。虚拟机管

虚拟化和云程序需要在以下三个维度上有良好的表现:

1) 安全性:虚拟机管理程序应完全掌控虚拟资源。

2) 保真性:程序在虚拟机上执行的行为应与在裸机上相同。

3) 高效性:虚拟机中运行的大部分代码应不受虚拟机管理程序的干涉。

毫无疑问,在解释器(例如 Bochs)中逐条考虑指令并准确执行其行为是一种安全执行指令的方式。

第一类和第二类虚拟机管理程序

Goldberg (1972) 区分了两类虚拟化方法。图 7-1 a 展示了第一类虚拟机管理程序。从技术上讲,第一类虚拟机管理程序就像一个操作系统,因为它是唯一一个运行在最高特权级的程序。它的工作是支持真实硬件的多个虚拟机(virtual machine)拷贝,类似于普通操作系统支持的进程。

运行在两类虚拟机管理程序上的操作系统都称作客户操作系统(guest operating system)。对于第类虚拟机管理程序,运行在底层硬件上的操作系统称作宿主操作系统(host operating system)。VMware Workstation 是首个 x86 平台的第类虚拟机管理程序(Bugnion 等人,2012)。

第二类虚拟机管理程序有时又称作托管型虚拟机管理程序,依赖 Windows、Linux、OS X 等宿主操作系统提供的大量功能。首次启动时,第二类虚拟机管理程序像一个刚启动的计算机那样运转,期望找到一个包含操作系统的 DVD、U 盘或 CD-ROM。这些驱动器可以是虚拟设备,例如,可以将包含操作系统的镜像保存为宿主机硬盘上的 ISO 文件,让虚拟机管理程序伪装成从正常 DVD 驱动器中读取。接下来,虚拟机管理程序运行 DVD 上的安装程序,将操作系统安装到虚拟磁盘(virtual disk,其实只是宿主操作系统中的一个文件)上。客户操作系统安装完成后,就能启动并运行了。

图 7-2 总结了目前为止讨论过的虚拟化技术类别,包括第-类和第二类虚拟机管理程序,并举例说明了每种技术类别和虚拟机管理程序的组合。

高效虚拟化技术

本节将详细研究可虚拟化与性能这两个重要问题。假设目前有一个支持一台虚拟机的第类虚拟机管理程序,如图 7-3 所示。与其他第一类虚拟机管理程序一样,它也运行在裸机上。虚拟机作为用户态的一个进程运行,不允许执行(Popek Goldberg 意义上的)敏感指令。然而,虚拟机上的操作系统认为自己运行在内核态(实际上不是)。我们称之为虚拟内核态(virtual kernel mode)。虚拟机中也运行用户进程,这些用户进程认为自己运行在用户态(实际上确实是的)。

在不支持虚拟化的平台上实现虚拟化

为什么虚拟机管理程序能在不支持虚拟化的硬件上工作:客户机内核的敏感指令被替换为对模拟这些指令的例程的调用。真实硬件不会直接执行客户操作系统中的敏感指令。这些敏感指令被转为对虚拟机管理程序的调用,虚拟机管理程序模拟了这些指令的功能。

虚拟化的开销

人们可能会天真地期望支持 VT 的 CPU 在虚拟化上比软件翻译方法性能更好,但实验结果显示两者各有优劣(Adams 和 Agesen, 2006)。VT 硬件使用的陷人并模拟方法会产生大量陷人,而陷入在现代硬件上开销很大,因为 CPU 高速缓存、TLB、转移预测都会受到不利影响。当敏感指令被替换为(宿主机进程内部)对虚拟机管理程序例程的调用后,就不用承担这些上下文切换的开销。按 Adams 和 Agesen 的实验所示,根据工作负载的不同,软件方法有时优于硬件方法。基于这一原因,某些第一类(和第二类)虚拟机管理程序为了性能而进行一进制翻译,虽然无须二进制翻译虚拟机也能正确运行。

使用二进制翻译后,代码既有可能变快,也有可能变慢。例如,假设客户操作系统使用 CLI (clear interrupt)指令禁用硬件中断。根据体系结构的不同,这条指令执行可能很慢,在具有深度流水和乱序执行技术的特定 CPU 上会占用数十个时钟周期。我们已经知道,客户操作系统希望关闭中断并不意味着虚拟机管理程序需要真的关闭它们并影响整个机器。因而,虚拟机管理程序必须让客户机认为中断已经关闭,但并未真的关闭物理机器的中断。要实现这一点,虚拟机管理程序可以在为每个客户机维护的虚拟 CPU 数据结构中记录一个专门】的 IF (Interrupt Flag)位,以确保虚拟机在中断打开前不会收到任何中断。客户机执行的每条 CLI 指令都会替换成类似 VirtualCPU. IF = 0 的指令,数据传送指令的开销很小,只需 1~ 3 个时钟周期。因而,翻译后的代码执行更快。不过,现代的 VT 硬件通常情况下仍比软件性能好。

另一方面,如果客户操作系统修改页表,则开销会很大。每个客户操作系统都认为自己“拥有”整个机器,可以将任意虚拟页自由映射到任意物理页。可是,如果一个虚拟机希望使用的物理页已被另一个虚拟机(或虚拟机管理程序)使用,就必须采取一定对策。在 7.6 节可以看到,解决方案是增加一层页表,将“客户机物理页”映射到宿主机上的实际物理页。毫无疑问,操纵多重页表的开销不小。

虚拟机管理程序是正确的微内核

客户操作系统的半虚拟化过程中会产生一-些问题。首先,如果敏感指令替换成对虚拟机管理程序的调用,那么操作系统如何在真实硬件上运行?毕竟硬件不理解这些虚拟化调用。其次,市场上有多种 API 不同的虚拟机管理程序怎么办?例如 VMware、剑桥大学开源的 Xen 和微软的 Hyper-V。怎样修改内核使之能运行在所有虚拟机管理程序上?

Amsden 等人于 2006 年提出了一个解决方案。在他们的模型中,只要内核需要执行敏感操作,就调用特殊的例程。这些例程称作虚拟机接口(Virtual Machine Interface, VMI),组成了硬件及虚拟机管理程序的底层接口。这些例程在设计上保持通用性,未绑定特定硬件平台或虚拟机管理程序。

图 7-6 展示了这项技术的一个例子是称作 VMI Linux (VMIL)的半虚拟化 Linux。当 VMI Linux 运行在裸机上时,链接到执行实际敏感指令的库,如图 7-6 a 所示。当运行在 VMware 或 Xen 等虚拟机管理程序上时,客户操作系统链接到相应的执行虚拟化调用的库。这种方式既实现了操作系统的核心部分具有可移植性,又对虚拟机管理程序友好,I 同时还保证了效率。

研究人员也提出了其他的虚拟机接口方案。半虚拟化操作(paravirt op)是比较流行的一个方案。此方案的思想在概念上与前面描述的相似,但细节有所不同。IBM、VMware、Xen 和 Red Hat 等 Linux 厂商提倡使用一个与虚拟机管理程序无关的接口,该接口从 2.6.23 版起包含在主线 Linux 内核中,让内核能与任意虚拟机管理程序(或裸机)交流。

内存虚拟化

I/O虚拟化

分为:

  1. I/O MMU
  2. 设备域
  3. 单根I/O虚拟化

虚拟装置

虚拟机能够解决一个困扰用户已久的问题:如何安装新的应用程序。解决这一-问题对开源软件的用户尤为重要。许多应用程序依赖大量其他应用程序和运行库,这些应用程序和运行库又会引人更多的依赖软件包。此外,还可能有对特定版本的编译器、脚本语言、操作系统的依赖。

有了虚拟机之后,软件开发人员可以精心构造一个虚拟机,装上需要的操作系统、编译器、运行库和应用程序代码,固定整个虚拟机使之可以随时运行。这个虚拟机镜像可以刻录到 CD-ROM 或发布到网站上让用户安装或下载。这种方法意味着只有软件开发人员需要知道所有的依赖关系。客户得到的是能实际运行的完整包,与他们使用的操作系统和安装的其他软件包、运行库完全无关。这类“盒装”的虚拟机通常称作虚拟装置(virtual appliance)。例如,亚马逊的 EC2 云为客户提供很多预先准备好的虚拟装置,提供方便的软件服务(软件即服务,Software As A Service)。

多核CPU上的虚拟化

虚拟机与多核 CPU 的结合创造了一个可用 CPU 数量能由软件设置的新世界。如果有 4 个 CPU 核心,每个核心最多可以运行 8 个虚拟机,则单个 CPU 可配置成 32 节点的多计算机系统。根据软件不同也可以配置成较少的 CPU(节点)数。应用程序设计人员可以首先选择需要的 CPU 数量再进行设计,这一前所未有的进步开启了计算机技术的新阶段。

此外,虚拟机之间可以共享内存。这项技术的一个典型用例是在服务器上运行多个相同客户操作系统的实例。虚拟机内存共享只需将物理页映射到多个虚拟机的地址空间中,这项技术已经用于去重的解决方案中。去重技术避免了重复保存相同的数据,在存储系统中是相当常见的技术,现在也应用到了虚拟化里。去重在 Disco 中称作透明页共享(transparent page sharing,需要修改客户机),在 VMware 中称作基于内容的页共享(content-based page sharing,无须任何修改)。一般来说,这项技术反复扫描主机上每个虚拟机的内存并计算内存页的散列。如果某些页面散列值相同,那么系统首先检查它们的内容是否完全相同,相同的话就进行去重:创建一个包含实际内容的页面,其他页面引用此页面。虚拟机管理程序控制了嵌套(或影子)页表,因而这种映射并不复杂。当然,任意一个客户机修改共享页时,应当使修改操作对其他虚拟机不可见。这时可以使用写时复制技术让修改的页面为写者所私有。

如果虚拟机能共享内存,单个计算机就能成为虚拟的多处理器系统。由于多核芯片上的所有核心共享相同的 RAM,因此单一的四核芯片根据需要可以很容易地配置成 32 节点多处理器或多计算机系统。

多核、虚拟机、虚拟机管理程序、微内核的结合将彻底改变人们对计算机系统的认知。由程序员来确定需要多少 CPU,使用多处理器系统还是多计算机系统,以及各种不同的极小化内核如何融入整个系统,这些问题是当前软件无法解决的,而未来的软件必须面对这些问题。如果你是计算机科学技术专业的学生或专家,你可能就是解决这些问题的那个人。加油!

授权问题

某些情况下,软件生产商会在授权中显式加人禁止在(未授权)虚拟机上运行软件的条款。对于只在虚拟机上运行所有软件的企业而言,这是个现实的问题。这些限制在法庭上是否站得住脚以及用户会如何响应还有待观察。南什的的法

提到云,很少有人理解其确切含义。美国国家标准与技术研究院(National Institute of Standards and Technology)列出了云的五条必要特征:

1) 按需自助服务。无需人为操作就能自动为用户提供资源。

2) 普适的网络访问。所有资源都可以通过网络用标准化的机制访问,以支持各种异构设备。

3) 资源池。云提供商拥有的资源可以服务多个用户并动态再分配,用户通常不知道他们使用的资源的具体位置。

4) 快速可伸缩。能根据用户需求弹性甚至是自动地获取和释放资源。

5) 服务可计量。云提供商按服务类型计量用户使用的资源。

有关虚拟化的云的研究

虚拟化技术和云计算都是相当活跃的研究领域。这两个领域中的研究成果不胜枚举,每个领域都有许多学术会议。例如,Virtual Execution Environments (VEE)会议关注最广泛意义上的虚拟化,在会议上你可以找到迁移、去重、系统扩展等问题的相关论文。类似的,ACM Symposium on Cloud Computing (SOCC)是最知名的云计算会议之一,其中的论文包括对故障快速恢复、数据中心任务调度、云管理和调试等问题的研究工作。

老的研究主题从未真正凋零,例如 Penneman 等人(2013) 按照 Popek Goldberg 谁则审视了 ARM 虚拟化中的问题。安全(Beham 等人,2013; Mao, 2013; Pearce 等人,2013) 和节省能耗(Botero 和 Hesselbach, 2013; Yuan 等人,2013) 都是热门话题。由于目前相当多的数据中心使用虚拟化技术,数据中心的机器间的网络连接(Theodorou 等人,2013) 也是一个主要研究主题。此外,无线网络中的虚拟化(Wang 等人,2013 a)也日渐重要。

嵌套虚拟化(Ben- Yehuda 等人,2010; Zhang 等人,2011) 是一个包含众多有趣研究的领域。其基本想法是虚拟机本身可以继续虚拟化成多个更高层次的虚拟机,并继续嵌套虚拟化下去。其中一个项目名为 Turtles,因为嵌套虚拟化一旦开始,便将“龟龟相驮以至无穷”。

虚拟化硬件的一个好处是不可信代码能直接而安全地访问页表、TLB 等硬件功能。基于这一点,Dune 项目(Belay, 2012) 提供一个进程抽象而不是机器抽象。进程可以进入 Dune 模式,这一不可逆的转换给进程以访问底层硬件的权限。尽管如此,进程仍然是一个进程,依靠内核并与之交互,唯一的区别是改为使用 VMCALL 指令来进行系统调用。

说点什么

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
提醒