系统组件与职责
NVX 的宿主层、OpenVMM VMM 层和客户机层组件,以及每个组件承担的职责。
译自microsoft/nvx · doc/design/1.3-system-components-and-responsibilities.md。技术细节以英文原文为准。
NVX 横跨三个层(见图 1.2),它们的职责沿着策略与机制的界线划分。宿主软件拥有策略、编排、放置、身份和挂载授权。OpenVMM 虚拟机监控器(VMM)拥有虚拟平台和状态转换的安全性。客户机软件拥有工作负载的构建、监管和客户机可见的修复,而工作负载只拥有它在由此形成的沙箱内部的执行。
图 1.2。 主要的宿主、VMM 和客户机组件。
图中结构(整体自上而下,每层内部自左向右):
- 宿主(Host)层
- NVX 启动器(NVX launcher)
- 沙箱生命周期 API(Sandbox lifecycle API)
- 宿主控制库(Host control library)
- 快照存储(Snapshot storage)
- 外部挂载(External attachments)
- OpenVMM 层
- 命令行入口与管理 RPC(Command-line entry and management RPC)
- 机器配置文件(Machine profile)
- VM 工作线程(VM worker)
- 芯片组与平台设备(Chipset and platform devices)
- Virtio 设备(Virtio devices)
- 快照发布器(Snapshot publisher)
- hypervisor 后端(Hypervisor backends)
- 客户机(Guest)层
- Linux 内核(Linux kernel)
- 客户机代理(Guest agents)
- 工作负载(Workload)
组件之间的关系(→ 表示单向调用,↔ 表示双向交互,⇢ 表示带标注的虚线连接):
| 源组件 | 关系 | 目标组件 |
|---|---|---|
| NVX 启动器 | → | 命令行入口与管理 RPC |
| 沙箱生命周期 API | → | 宿主控制库 |
| 宿主控制库 | → | 命令行入口与管理 RPC |
| NVX 启动器 | ⇢(控制会话) | Virtio 设备 |
| 宿主控制库 | ⇢(控制会话) | Virtio 设备 |
| 命令行入口与管理 RPC | → | 机器配置文件 |
| 命令行入口与管理 RPC | → | VM 工作线程 |
| 机器配置文件 | → | VM 工作线程 |
| VM 工作线程 | → | 芯片组与平台设备 |
| VM 工作线程 | → | Virtio 设备 |
| VM 工作线程 | → | 快照发布器 |
| VM 工作线程 | → | hypervisor 后端 |
| 快照发布器 | → | 快照存储 |
| 外部挂载 | → | Virtio 设备 |
| 芯片组与平台设备 | ↔ | Linux 内核 |
| Virtio 设备 | ↔ | Linux 内核 |
| Linux 内核 | → | 客户机代理 |
| 客户机代理 | → | 工作负载 |
1.3.1 宿主组件
- NVX 启动器(NVX launcher)运行一次性微虚拟机并驱动托管沙箱的生命周期,保存按沙箱划分的状态,预检宿主共享并把它们放置到客户机中,并把结构化的出站策略文件编译为 VMM 出站规则。
- 沙箱生命周期 API(Sandbox lifecycle API)暴露 provision、start、exec、stop 和 deprovision 操作,并提供请求校验、后端能力、可序列化的契约模型、持久的沙箱记录和稳定的错误码。
- 宿主控制库(Host control library)实现控制协议的宿主侧、产物发现、无块设备的托管启动、VMM 进程监管、带访问策略的宿主路径导出、宿主映射表的传递,以及出站规则转换。
- 快照存储(Snapshot storage)保存不可变的机器状态、内存和可选的配对暂存盘,以及重建外部资源所需的身份信息。
- 外部挂载(External attachments)提供进程级资源,例如控制台端点、网络端点、宿主文件系统导出和块文件。
1.3.2 VMM 组件
- 命令行入口与管理 RPC(Command-line entry and management RPC)是 VMM 的前端。它们构造宿主挂载,创建、捕获和恢复微虚拟机,报告就绪状态和客户机退出,在退出时排空字节通道,并写出结果报告。
- 机器配置文件(Machine profile)选择并校验机器,定义其 ABI 常量,并掌管生效的内核命令行。它保存已固定的 CPU 配置文件,为每个 VM 选择或推导 CPU 配置文件,检查后端支持与恢复兼容性,并计算每个 VM 的生效 CPUID。
- VM 工作线程(VM worker)组装并运行机器。它创建分区及其虚拟处理器,预留 RAM 容量并以写时复制方式私有映射捕获的内存,通过 Linux 直接加载器加载客户机,并放置固定设备。它的状态单元框架按依赖顺序对有状态组件进行静默(quiesce)、启动、回滚和清点,而工作线程掌管快照边界、管理排除、时钟契约和恢复时序。
- 芯片组与平台设备(Chipset and platform devices)提供白名单内的芯片组:PIC、IOAPIC、PIT、RTC,以及字节通道端口、关机端口和快照请求端口。
- Virtio 设备(Virtio devices)由控制台、块存储、网络和宿主文件系统设备组成,共享中断状态并处理队列,同时保存设备私有的状态。它们的后端包括:控制台 broker,它认证本地宿主对端并为控制会话分帧;进程内网络端点,它强制执行出站策略;以及宿主文件系统服务器,它对每个导出强制执行其访问策略。
- 快照发布器(Snapshot publisher)定义快照格式与机器契约,发布产物,并在恢复时对其进行校验。
- hypervisor 后端(Hypervisor backends)为 KVM、MSHV 和 WHP 实现分区、处理器执行、中断注入、CPU 契约和快照时钟。
1.3.3 客户机组件
- Linux 内核(Linux kernel)从固定的 Linux 直接启动交接引导,驱动白名单内的虚拟设备,并提供运行时所用的命名空间、文件系统、cgroups 和进程原语。
- 客户机代理(Guest agents)挂载运行时文件系统,应用启动配置,挂载实时宿主共享,并组装工作负载文件系统。它们构建工作负载的根目录与凭据,并在分层沙箱中构建其命名空间与设备视图。它们在收到请求时创建工作负载账号,监管一次性或托管工作负载,准备快照,并在恢复之后修复处理器、内存、熵和身份。它们还会在宿主发布客户机监听器时予以通告,检查时间 ABI 一致性,监视时钟违规,校正墙上时钟,并执行快照的时间步骤。
- 工作负载(Workload)是微虚拟机的唯一租户:它掌管微虚拟机的生命周期、资源上限和网络身份,并且可以运行任意数量的进程——这些进程全部位于客户机代理所构建的隔离边界之内。它对宿主资源或 VMM 策略不拥有任何直接权限。