兼容性与版本模型
定义 NVX 兼容性的显式契约、恢复与模板兼容性条件,以及快照的持久化状态规则。
译自microsoft/nvx · doc/design/1.5-compatibility-and-versioning-model.md。技术细节以英文原文为准。
表 1.1 列出了定义 NVX 兼容性的显式契约。每个契约都带有自己的版本或身份,彼此独立。
表 1.1。 兼容性契约。
| 契约 | 管辖内容 |
|---|---|
| 机器 ABI(Machine ABI) | CPU 拓扑、内存布局、设备拓扑、地址、中断、传输方式和客户机可见的策略。 |
| 启动布局(Boot layout) | Linux 直接启动结构的位置与格式:MP 表、引导用的 GDT 和页表、Linux 启动参数块(零页),以及内核命令行。 |
| CPU 配置文件(CPU profile) | 某一厂商和 CPU 世代的客户机可见 CPU 界面,由厂商、世代和修订号标识,并由其规范化编码的摘要标识。 |
| 时间 ABI(Time ABI) | hypervisor 身份、频率接口、时钟源、定时器、停机时间语义和恢复时的修复。客户机从为 hypervisor 信息保留的 CPUID 功能(hypervisor identity 叶)中读取其版本。 |
| 设备私有模式(Device-private schemas) | 设备恢复运行之前必须理解的已保存队列状态与设备状态。 |
| 快照格式(Snapshot format) | 持久化的机器契约、清单、状态清点、内存几何、挂载要求和产物身份。 |
| RAM 扩展能力(RAM expansion capability) | 已记录的 RAM 容量、内存块大小,以及恢复时可以激活的扩展范围。 |
| 恢复包(Restore packet) | 一次性记录的布局与含义,它向被恢复的客户机提供世代、停机时间、速率偏差、激活目标和全新熵。 |
| 控制协议(Control protocol) | 宿主与客户机代理之间的经认证会话、请求分帧、操作语义和生命周期纪元。 |
| 管理 RPC 机器配置文件(Management RPC machine profile) | 管理 RPC 中微虚拟机机器配置文件的身份。 |
对客户机可见的地址、中断、命令行标记、特性掩码、队列形态、时间规则或设备行为的更改,都需要新的契约版本。后端特有的差异只有在带版本的契约明确声明时才有效,virtio-net 中断就是这种情况。
客户机可见的配置在快照所代表的生命周期内保持不可变。恢复从快照清单推导出机器;调用方输入可以重建被允许的外部资源,但不能静默改变已捕获的 CPU 界面、内存容量、命令行、设备布局、特性掩码或网络身份。
兼容性要求精确匹配,而不是尽力而为。未知版本、缺失或多出的设备、发生变化的队列形态、不兼容的 CPU 界面、格式错误的状态或不匹配的挂载,都会在客户机执行之前被拒绝。清单版本不受支持的快照必须重新捕获。
1.5.1 恢复兼容性
快照只能在以下条件下恢复:
- 在捕获它的那个后端上。
- 在 CPU 属于该快照 CPU 配置文件所属世代的宿主上。
- 在原生 TSC 速率与快照的声明速率相差在 250 ppm 以内的宿主上。
- 使用固定了相同 CPU 配置文件修订的 VMM 构建。没有任何构建会固定宿主 CPU 配置文件,因此它的快照改为携带唯一副本,该副本必须是带有记录摘要的有效规范化文档。
- 使用为该 CPU 配置文件和拓扑计算出相同生效 CPUID 的 VMM 构建。
- 使用能够复现所记录挂载身份的外部资源。
已发布的 CPU 配置文件修订是不可变的,且永不删除,因此已有快照始终可以恢复;规范性的更改会创建新的修订。
1.5.2 模板兼容性
可复用的模板代表一个兼容性类别,而不是任意的机群镜像。该类别包括后端、CPU 配置文件及其世代、生效的 CPUID、客户机内核与客户机代理构建、生效的命令行、设备角色与几何、网络身份与策略,以及所消费的层身份。恢复客户机内存恢复的是被捕获的客户机代理构建,而不是新部署的 initramfs,因此部署方需要在相关的发布中重建或重新认证模板。
处理器容量和 RAM 几何是不可变的,但恢复时的激活让同一个模板可以服务于若干在线处理器数量和 RAM 尺寸。因此,模板以容量、基础状态和支持的激活范围为键。层角色的存在性和设备几何保持固定:平台模板只有在替换层具有相同的记录逻辑长度和块大小时才接受它。
1.5.3 持久化状态
快照清单是被恢复进程的权威依据。原生文件描述符、套接字、命名管道句柄和 hypervisor 对象从来都不是可移植状态的一部分。它们根据稳定的身份和声明的重建策略重新创建。