机器模型与配置
说明机器配置如何被显式选定、它所具有的架构不变量,以及每一类配置的所有者与生命周期。
译自microsoft/nvx · doc/design/2.1-machine-model-and-configuration.md。技术细节以英文原文为准。
机器配置是显式选定的,并拥有全部客户机可见配置。机器身份绝不由内核、设备或 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 宿主上。