虚拟机
1. 虚拟机概述
1.1. 定义与历史
- 历史: 20世纪60年代中期出现,长期作为大型机的重要组成部分。
- 近期关注原因:
- 隔离与安全需求增长: 现代计算机系统中对隔离和安全性的要求日益提高。
- 标准OS的缺陷: 传统操作系统在安全性和可靠性方面存在不足。
- 资源共享趋势: 尤其在云计算场景下,多个不相关的用户需要共享一台计算机。
- 性能提升: 过去十年处理器速度大幅增长,使得虚拟机带来的性能开销降至可接受范围。
1.2. 系统虚拟机核心概念
- 用户体验: 用户感觉像在使用一台完整的计算机,包括独立的操作系统副本。
- 多操作系统支持: 一台物理计算机可以同时运行多个不同的操作系统实例。
- 资源共享机制: 传统模式下单个操作系统独占所有硬件资源;通过虚拟机,多个操作系统可以共享这些硬件资源。
- 虚拟机监视器 (Virtual Machine Monitor, VMM) / 管理程序 (Hypervisor):
- 核心地位: 支持虚拟机运行的核心软件。
- 主机 (Host): 底层的物理硬件平台。
- 客户机 (Guest): 在VMM上运行的虚拟机实例,共享主机资源。
- VMM职责: 决定如何将虚拟资源(客户机看到的)映射到物理资源(实际硬件)。物理资源可以被分时共享、静态划分,甚至通过软件模拟。
- 特性: VMM通常比传统的操作系统小得多(例如,一个VMM的隔离区可能只需要10000行代码),这有助于其自身的安全性和可靠性。
2. 虚拟机的优势
2.1. 保护功能
- VMM提供强大的隔离机制,有效保护各个虚拟机之间以及虚拟机与主机之间的安全,防止恶意干扰或数据泄露。
2.2. 软件管理
- 运行完整软件栈的抽象: 虚拟机提供了一个可以运行完整软件堆栈(包括操作系统、库、应用程序)的环境。
- 支持旧版操作系统: 能够运行像DOS这样的旧操作系统,满足遗留应用的需求。
- 多版本操作系统共存: 典型的虚拟机调度场景包括:
- 一些虚拟机运行旧的操作系统。
- 多数虚拟机运行当前的操作系统。
- 少数虚拟机用于测试下一代操作系统版本。
2.3. 硬件管理
- 服务器整合 (Server Consolidation):
- 传统上,为了可靠性和兼容性,每个应用程序可能需要运行在独立的物理服务器上。
- 虚拟机允许这些独立的软件堆栈在共享硬件上独立运行,从而显著减少物理服务器的数量,降低成本和能耗。
- 动态迁移与负载均衡 (Live Migration):
- 一些VMM支持将正在运行的虚拟机从一台物理计算机迁移到另一台,而服务不中断或中断时间极短。
- 用途: 平衡服务器负载、进行硬件维护、实现硬件故障时的快速恢复。
3. 虚拟机在云计算中的应用 (以AWS EC2为例)
亚马逊Web服务 (AWS) 在其云计算平台中使用虚拟机提供EC2(Elastic Compute Cloud)服务,主要基于以下5个原因:
- 用户间保护与隔离: 当多个用户共享同一个物理服务器时,AWS通过虚拟机为用户提供相互间的保护。
- 简化软件分发与部署:
- 用户只需准备一个虚拟机映象(包含操作系统和所需软件)。
- AWS负责在基础设施上实例化这个镜像,并为用户分配其所需的所有服务。
- 资源控制与生命周期管理: 当用户完成工作时,用户(和AWS)可以“杀死”一个VM来回收资源,从而精确控制资源的使用和计费。
- 硬件抽象与兼容性:
- 虚拟机隐藏了运行用户应用软件的具体硬件特性。
- 这意味着AWS可以在不影响现有用户应用的情况下,引入新的、更高效的服务器,同时继续利用旧的、成本已摊销的服务器。
- EC2计算单元 (ECU): AWS定义了一个标准化的CPU能力单位(例如,提供与1.0-1.2 GHz 2007 AMD Opteron或Intel Xeon处理器相等的CPU能力)。用户根据ECU选择实例,新服务器能提供更多ECU,但AWS仍可基于ECU出租旧服务器的算力。
- 资源使用率控制与灵活定价:
- VMM可以精细控制一个VM对处理器、网络和磁盘资源的使用比率。
- 这使得AWS能够在相同的底层硬件上提供多种不同价格和性能配置的节点类型,满足不同用户的需求(例如,从低成本的小标准节点到高I/O性能节点)。
4. 虚拟机性能开销
- 开销取决于工作负载类型:
- 用户级处理器限制型程序: 虚拟化开销极小,因为这类程序很少调用操作系统,大部分指令可以直接在CPU上以本地速度运行。
- I/O密集型负载 (通常也是操作系统密集型):
- 这类负载会执行大量的系统调用和特权指令,这些操作通常需要VMM介入模拟,从而导致较高的虚拟化开销。
- 特例: 如果I/O密集型负载同时也是I/O限制型(即CPU大部分时间在等待I/O完成),那么处理器虚拟化的开销在很大程度上可以被I/O等待时间所掩藏,对整体性能影响较小。
- 开销的核心因素:
- 需要由VMM进行模拟的指令数目。
- VMM模拟这些指令的速度快慢。
- 优化目标: 假设客户虚拟机和主机运行相同的ISA时,理想的系统结构和VMM设计目标是尽可能让客户机指令在本地硬件上直接运行,最大限度地减少VMM的介入和模拟。
5. VMM 的必备条件与职责
5.1. 定性需求 (对客户软件而言)
- 行为一致性 (Fidelity): 除了因多虚拟机共享而造成的固定资源限制或与性能相关的细微行为差异外,客户软件在虚拟机上的运行体验应该和它在本地裸金属硬件上的运行完全相同。
- 资源隔离与控制 (Control/Isolation): 客户软件不能直接改变实际物理系统中的资源分配,所有资源访问都应受VMM控制。
5.2. VMM核心职责 (处理器虚拟化)
- 完全控制硬件: VMM必须能够控制对所有特权状态、I/O操作、异常和中断的访问,即使客户虚拟机及其内部运行的操作系统临时“拥有”这些虚拟资源。
- 示例 (定时器中断处理):
- VMM需要挂起当前正在运行的客户虚拟机。
- 保存该客户虚拟机的完整状态。
- 处理物理定时器中断。
- 根据调度策略决定接下来应该运行哪个客户虚拟机。
- 恢复被选中客户虚拟机的状态并使其运行。
- 对于依赖定时器中断的客户虚拟机,VMM需要提供一个虚拟的定时器,并模拟定时器中断的发生。
- 特权级要求: VMM必须运行在一个比客户虚拟机更高的特权级别下。客户虚拟机(包括其操作系统内核)通常运行在较低的特权级(例如物理CPU的用户模式,或者特殊的非root模式下的内核模式)。
- 确保: 任何由客户机尝试执行的特权指令都需要被VMM捕获(trap)并处理。
5.3. 系统级虚拟机基本必备条件
- 至少两种处理器模式: 例如,系统模式(或内核模式、超级用户模式)和用户模式。
- 特权指令集:
- 一部分指令被定义为特权指令,它们只能在系统模式下成功执行。
- 如果在用户模式下尝试执行特权指令,将会产生一个trap中断,将控制权交给更高权限的软件(即VMM)。
- 所有对系统关键资源的控制(如内存管理、I/O设备访问、中断控制等)都必须通过这些特权指令进行。
6. 指令集系统结构 (ISA) 对虚拟机的支持
6.1. 可虚拟化 (Virtualized) ISA
- 定义: 指那些在设计时就充分考虑了虚拟机需求的ISA。这样的ISA允许虚拟机的大部分指令直接在硬件上安全高效地执行,无需VMM介入。
- 优点: 由VMM执行的指令数目和模拟这些指令所花费的时间会相对减少,从而显著提升虚拟机性能。
- 例子: IBM 370架构。
6.2. 缺乏原生虚拟化支持的 ISA
- 背景: 大多数早期的指令集(包括x86的早期版本以及大部分RISC系统结构,如ARMv7和MIPS)在创建时并没有为虚拟化进行优化。
- VMM面临的挑战:
- 确保客户机与虚拟资源交互: 客户操作系统认为自己在直接操作硬件,但实际上它运行在VMM之上,VMM必须确保客户机只能与其分配到的虚拟资源交互。
- 正确截获特权操作: 如果客户操作系统试图通过执行一条它认为是特权指令来访问或修改硬件资源信息(例如,读/写一个状态位来启用或禁用中断),这条指令必须能够正确地trap到VMM。
- 模拟与虚拟化敏感操作: VMM捕获到trap后,会进行适当的调整以反映客户机在其虚拟环境中的操作,并可能需要模拟硬件行为,向客户机提供其期望看到的虚拟版本的敏感信息。
- 关键问题点:
- 理想情况: 所有敏感指令(访问或修改特权状态的指令)都应该是特权指令(在用户模式执行会trap)。
- 现实问题 (如早期x86): 存在一些敏感指令但非特权的情况,即这些指令在用户模式下执行时不产生trap,但其行为与在特权模式下不同,或者会暴露底层物理机的信息。
- 例如
POPF
指令(从堆栈加载标志寄存器):- 标志寄存器中有一个关键的中断使能标记位 (IE/IF)。
- 在用户模式下运行
POPF
:- 它可以改变除了IE位以外的其他大部分标志位。
- 对于IE位的修改会静默失败(即IE位保持不变),并且不会发生trap中断。
- 在系统模式下运行
POPF
:- 它确实可以成功改变IE位。
- 虚拟化中的困境: 运行在虚拟机(从物理机角度看,客户机内核可能运行在用户模式或一个受限的内核模式)内的客户操作系统内核,执行
POPF
并期望IE位被改变。但由于物理CPU的上述行为,IE位未按预期改变,且VMM无法通过trap感知到客户机的这一意图,导致客户机中断处理异常。
- 例如
- VMM的应对措施 (对于不完善的ISA):
- VMM必须使用特殊的预防措施(如二进制翻译、影子页表等复杂技术)来定位所有存在虚拟化问题的指令。
- 确保这些指令能够被客户操作系统“正确地”执行(即,客户机看到的是它期望的虚拟化行为)。
- 后果: 这些额外的处理显著增加了VMM的复杂度,同时也降低了虚拟机的运行性能。
6.3. 保护与指令集系统结构
- 系统的保护机制依赖于体系结构(硬件提供的特性)和操作系统(如何使用这些特性)的协同工作。
- 随着虚拟存储器的广泛使用,体系结构设计者需要对ISA中一些不利于高效、安全虚拟化的细节进行修改和增强。
7. 提升虚拟机性能的努力与展望
7.1. IBM 大型机硬件和 VMM 的历史改进步骤
IBM在大型机虚拟化方面积累了丰富经验,其改进虚拟化性能的典型步骤包括: 1. 降低处理器虚拟化的开销: 通过硬件支持,让更多客户机指令能直接执行。 2. 降低由虚拟化引起的中断开销: 优化VMM处理中断的路径,减少VMM介入的频率和时间。 3. 中断直接投递 (Interrupt Direct Delivery): 在某些情况下,允许中断直接传递给相应的虚拟机处理,而无需首先调用VMM,从而进一步降低中断处理开销。
7.2. x86 架构的改进 (硬件辅助虚拟化)
- 背景: 认识到纯软件虚拟化在x86上的局限性,AMD和Intel分别在2006年左右推出了硬件辅助虚拟化技术。
- AMD: AMD-V (代号 Pacifica)
- Intel: VT-x (Virtualization Technology)
- 主要目标: 致力于满足上述第一点,即降低处理器虚拟化的开销。
- Intel VT-x 提供的特性示例:
- 引入了新的CPU执行模式(VMX root operation 和 VMX non-root operation)。
- 定义了虚拟机控制结构 (VMCS),用于保存和管理虚拟机状态。
- 提供了快速的虚拟机进入 (VM Entry) 和退出 (VM Exit) 指令。
- 提供了一大组参数,用于精细控制哪些事件会导致VM Exit(即从客户机切换到VMM)。
- VT-x 在x86中增加了大约11条新指令。
- Intel VT-x 提供的特性示例: