文档目录架构 · 18 篇

系统组件与职责

NVX 的宿主层、OpenVMM VMM 层和客户机层组件,以及每个组件承担的职责。

译自microsoft/nvx · doc/design/1.3-system-components-and-responsibilities.md。技术细节以英文原文为准。

架构文档 > 1. 架构总览

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 策略不拥有任何直接权限。