虚拟机

1.1.3 讲过操作系统的”虚拟”特征——把一个物理实体变为若干逻辑上的对应物。本章前面见到的虚拟都发生在操作系统内部:虚拟处理器、虚拟存储器。

这一节把”虚拟”这个动作用到了操作系统自己身上:把一台物理机器虚拟成多台,让每一台上面都能跑一个完整的操作系统。

机制

虚拟机的基本概念

虚拟机使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(VM),每个虚拟机器都可以独立运行一个操作系统。

实现这件事的软件称为虚拟机管理程序(VMM,也称 Hypervisor),它负责把物理的 CPU、内存、I/O 设备分配并映射给各台虚拟机,同时保证各台虚拟机之间互相隔离。

关键难点在于特权指令:虚拟机里运行的操作系统自认为自己在内核态,会去执行关中断、改页表这类特权指令。但它实际上并不能真的执行——若真让它关了物理机的中断,其余虚拟机就全完了。VMM 必须把这些指令截获下来,用软件模拟出”好像执行成功了”的效果。

两类虚拟机管理程序

划分依据是:VMM 直接运行在硬件上,还是运行在一个宿主操作系统之上。

第一类 VMM——直接运行在硬件上,它自己就承担着物理资源管理的职责,相当于一个专门为虚拟化定制的操作系统。

第二类 VMM——运行在宿主操作系统之上,它对物理资源的访问必须通过宿主操作系统的服务来完成。

两类的全部差异都可以从这一条推出来:

对物理资源的控制权:第一类直接控制;第二类需要通过宿主操作系统获得。

资源分配方式:第一类下虚拟机可以独占物理资源;第二类下必须与宿主操作系统共享。

性能:第一类高(少了一层转发);第二类低(每次都要过宿主操作系统)。

可支持的虚拟机数量:第一类多;第二类少(宿主操作系统自己也要占资源)。

可迁移性:第一类低;第二类高——第二类的虚拟机就是宿主系统上的一组文件,复制走就能在另一台机器上跑。

运行模式(教材的简化模型):第一类 VMM 掌握最高控制权限,客户操作系统受到 VMM 的控制;第二类 VMM 部分运行在用户态、部分运行在内核态(它通常需要装一个内核模块来获得必要的特权)。现代硬件虚拟化不能简单套成“VMM 在 Ring 0、客户 OS 一律降到 Ring 3”;408 区分两类时,优先看是否建立在宿主操作系统之上。

拓展:常见产品与普通 OS 的区别

这部分用来帮助理解,做题仍以“直接建立在硬件上 / 建立在宿主 OS 上”为首要判据。 分类的是 VMM,不是把“虚拟机”本身分成两种。

产品通常归类记忆理由
VMware ESXi第一类 VMM直接安装在裸机硬件上
VMware Workstation / Fusion第二类 VMM运行在 Windows、Linux 或 macOS 等宿主 OS 之上
VirtualBox第二类 VMM依赖宿主 OS;有内核驱动,不等于纯用户态程序
KVM通常归为第一类 VMM让 Linux 内核本身承担 Hypervisor 的功能,不能只因“有 Linux”就判为第二类

“VMware”是产品家族名称,不能不看具体产品就一概分类。 KVM 常与 QEMU 配合使用,知道“内核中的 KVM 负责核心虚拟化、用户态 QEMU 提供设备模拟等功能”即可,不必展开实现细节。产品分类参考:VMware:Hypervisor 分类、Red Hat:KVM。

第一类 VMM 与普通操作系统都能直接管理硬件,但主要服务对象不同:

  • 普通 OS:硬件 → OS → 应用程序,主要为进程/应用提供运行环境。
  • 第一类 VMM:硬件 → VMM → 多个客户 OS → 各自的应用,主要为虚拟机提供虚拟硬件并实现隔离。

408 记住边界即可:运行位置决定分类,不是“用户态还是内核态”决定分类。 “第一类掌握最高控制权限”是教材层面的概括;第二类也可以含内核态组件。硬件虚拟化的具体执行模式不在这里展开。

边界

系统虚拟机与进程虚拟机

除了按 VMM 位置分类,还可以按”虚拟出来的是什么”来分:

系统虚拟机虚拟出一台完整的计算机硬件环境,上面可以运行一个完整的客户操作系统。VMware、VirtualBox、KVM 属于这一类。

进程虚拟机只为单个程序提供运行环境,它虚拟的不是硬件,而是一套指令集与运行时。JVM 是最典型的例子——Java 程序运行在 JVM 之上,而 JVM 本身只是宿主操作系统上的一个普通进程。

判据:上面能不能跑一个完整的操作系统。

虚拟机不等于仿真器

两者都能让”本来跑不了的东西跑起来”,但代价和原理不同。

虚拟化的前提是客户机与宿主机的指令集相同——绝大多数指令由物理 CPU 直接执行,只有少数特权指令需要 VMM 截获处理。因此性能损失有限,且通常依赖硬件的虚拟化支持。

仿真(emulation)则是逐条翻译不同体系结构的指令——在 x86 机器上模拟 ARM,每一条 ARM 指令都要用若干条 x86 指令去模拟。它能跨体系结构,但开销大得多。

判据:指令是”直接执行”还是”被翻译”。

虚拟化与操作系统的”虚拟”是同一个思想的两个层次

这一条能把本章前后串起来:

操作系统的虚拟是”把一台机器虚拟给多个进程”——每个进程都以为自己独占了 CPU(虚拟处理器)和一大片内存(虚拟存储器)。

虚拟机的虚拟是”把一台机器虚拟给多个操作系统”——每个操作系统都以为自己独占了整台物理机。

两者的手段也是同构的:操作系统靠特权级拦住用户程序的越权操作;VMM 靠更高一级的特权拦住客户操作系统的越权操作。 本质上是同一招用了两次。

虚拟机的代价

隔离和复用不是免费的:需要虚拟化 CPU、内存和 I/O 资源,其中 I/O 虚拟化是最常见的性能瓶颈——每一次 I/O 都要经过 VMM 的转发。

因此实际系统中常用”设备直通”把某个物理设备整个交给一台虚拟机,绕开转发。这实际上是放弃了这台设备的复用,换取性能——又一次是”共享与效率”的权衡。

对照速查

第一类 VMM第二类 VMM
位置直接运行在硬件上运行在宿主操作系统之上
对物理资源的控制权直接控制通过宿主操作系统获得
资源分配虚拟机可独占物理资源与宿主操作系统共享
性能高低
可支持的虚拟机数量多少
可迁移性低高
运行模式(教材概括)掌握最高控制权限,控制客户 OS部分用户态、部分内核态
系统虚拟机进程虚拟机
虚拟出什么完整的硬件环境单个程序的运行环境
能否跑完整 OS能不能
例子VMware、VirtualBox、KVMJVM
虚拟化仿真
指令绝大多数由物理 CPU 直接执行逐条翻译
能否跨体系结构不能能
开销小大

考点

  • 第一类 VMM 直接运行在硬件上,第二类运行在宿主操作系统之上——所有差异由此推出
  • 六项对比中最易错的是可迁移性:第一类低、第二类高(与性能恰好相反)
  • 系统虚拟机 vs 进程虚拟机:判据是能否运行完整的客户操作系统;JVM 是进程虚拟机
  • 虚拟化 ≠ 仿真:判据是指令直接执行还是被翻译
  • VMM 必须截获客户操作系统的特权指令,这是虚拟化的核心难点
  • I/O 虚拟化是常见的性能瓶颈,设备直通以放弃复用换性能

链接