文档目录架构 · 18 篇

机器模型与配置

说明机器配置如何被显式选定、它所具有的架构不变量,以及每一类配置的所有者与生命周期。

译自microsoft/nvx · doc/design/2.1-machine-model-and-configuration.md。技术细节以英文原文为准。

架构文档 > 2. 虚拟机架构

机器配置是显式选定的,并拥有全部客户机可见配置。机器身份绝不由内核、设备或 hypervisor 选择推断而来:每个前端(包括命令行、管理 RPC 和快照配置)都把它传递给 VM worker。校验在打开宿主资源之前进行,并在 worker 边界处再次进行。

当前机器配置的架构不变量为:

  • 一个 x86-64 客户机,使用 Linux 直接启动和 Intel MP 1.4 表,不带固件。
  • 一个 NUMA 节点。
  • 一个 CPU 插槽、一个裸片、每个虚拟处理器一个核心,无 SMT,xAPIC 模式。
  • 1、2、4 或 8 个虚拟处理器,APIC ID 连续且从零开始。
  • 固定的低内存启动布局和固定的 3 至 4 GiB MMIO 窗口。
  • 时间 ABI 作为唯一时间通路,并且只有一个 CPU 配置。
  • 固定的芯片组和 virtio-mmio 设备拓扑。
  • 没有 VTL2、机密 VM 隔离或嵌套虚拟化。
  • 不使用后端 hypervisor 的半虚拟化特性,例如 Hyper-V enlightenment 或 KVM 半虚拟化时钟。时间 ABI 的最小 hypervisor 身份标识在每个后端上都相同,它是唯一的 hypervisor 接口。

2.1.1 允许列表平台

机器配置直接构建所需的机器,而不是创建一台标准 PC 再移除不需要的设备。

它拒绝固件和启动接口:UEFI、PCAT、IGVM,以及调用方提供的 ACPI、SMBIOS 和设备树。它同样拒绝 PCI 和 PCIe、vPCI、VMBus、旧版 ISA 扩展总线的 DMA 控制器(ISA DMA)、IDE、软盘、VMGS、图形设备、VGA 固件、调试器资源,以及机器配置之外的任何设备。机器配置自身会输出固定的 Linux 直接启动 MP 表元数据。

2.1.2 配置归属

表 2.1 列出了每一类配置的所有者与生命周期。生命周期分为以下几种:

  • 契约版本。 对同一机器契约版本的每个 VM 都相同。
  • VM。 在冷启动时固定,记录在每个快照中,并原样从中恢复。
  • VM 进程。 在冷启动时以及每次恢复时绑定,与 VM 记录的身份标识一致。
  • 恢复。 每次恢复时选择,且在快照所记录的范围内。

表 2.1. 配置归属与生命周期。

配置 所有者 生命周期
启动布局、设备位置、中断和特性掩码 机器配置 契约版本
处理器容量、基础 RAM 和可选 RAM 容量,以及 CPU 配置 宿主,由机器配置校验 VM
生效的内核命令行 机器配置,来自宿主策略和调用方参数 VM
工作负载身份标识与生命周期 宿主 VM
控制台、网络、块存储和宿主文件系统设备,以及它们的身份标识与策略 宿主 VM
宿主附件:控制台端点、网络端点、块文件和导出的宿主目录 宿主,与记录的身份标识匹配 VM 进程
在线处理器和 RAM 激活目标 宿主,在快照范围内 恢复

宿主为全新启动确定工作负载策略。可选的非零数字 UID 和 GID 成为固定的工作负载身份标识;可选的一次性或托管生命周期决定客户机代理是运行单个工作负载,还是通过控制台常驻以处理顺序请求。两者都是由机器配置拥有的命令行标记,调用方参数无法提供。托管生命周期要求具备固定的工作负载身份标识,以及实时、可认证的控制台。

2.1.3 存储配置

沙箱存储使用具有固定角色的块设备,而不是任意磁盘。这些角色就是沙箱根文件系统的各层:用于基础操作系统的只读 distro 下层,其下是一个可写的 scratch 层,用于保存沙箱的私有改动。块存储 描述了每一个角色。

没有角色的磁盘会被拒绝,基于磁盘的拓扑必须以可写 scratch 结束。唯一的例外是基于 RAM 的覆盖层布局,它要求恰好一个只读 distro 块且没有 scratch,把客户机的覆盖层上层保存在 RAM 中,并且既不支持捕获也不支持恢复。带块存储的快照捕获要求先有只读 distro 层、再有可写 scratch,两者都由带缓存的普通原始文件支撑,且几何尺寸非零并按 512 字节对齐。无块存储的机器同样支持快照,并且不携带任何沙箱层元数据。

宿主文件系统共享使用固定的文件系统插槽,而不是添加设备。该插槽在只读的合成根之下导出一个宿主目录,或一组具名目录/普通文件子项的聚合体,每个子项都有各自的访问模式。

2.1.4 恢复时配置

恢复比冷启动更严格。客户机可见的配置从快照的机器契约中读取。恢复时的输入只能:

  • 选择快照所记录的后端类型。
  • 提供必需的附件。
  • 当快照记录了该能力时,把新的目录导出绑定到已捕获的休眠文件系统插槽。
  • 选择契约所允许的处理器和 RAM 激活目标。

这些进程内的输入绝不会改变处理器容量、RAM 容量、命令行、设备位置、特性掩码,或文件系统与网络的身份标识。恢复始终使用快照的 CPU 配置,绝不回退。由于捕获的命令行固定了网络寻址、工作负载身份标识和生命周期,恢复会拒绝任何会改变它们的输入;所提供的处理器数量只能重复捕获时的容量。

2.1.5 执行后端

执行后端是宿主进程的属性,而不是客户机平台的属性。后端代码提供分区创建、虚拟处理器执行、内存注册和中断注入,同时保持相同的客户机可见契约。KVM 和 MSHV 运行在 Linux 宿主上,WHP 运行在 Windows 宿主上。