就绪与运行时控制
说明就绪边界的含义、控制前端、就绪端点、管理排除、托管沙箱生命周期以及运行时控制的权限划分。
译自microsoft/nvx · doc/design/5.2-readiness-and-runtime-control.md。技术细节以英文原文为准。
就绪是一个显式的生命周期边界,而不是对任意控制台文本的观察。当客户机代理已经初始化了所需设备,并且要么准备好了一次性工作负载、要么建立起托管控制路径时,一次冷启动才可用。
5.2.1 控制前端
两个前端驱动 VM 工作线程:命令行启动与管理 RPC。二者构建相同的机器配置文件,工作线程对二者应用相同的校验、快照边界与管理排除。管理 RPC 创建、捕获和恢复不带沙箱块、网络设备或控制控制台的机器,挂接字节通道、启动控制台和一个宿主文件系统导出,发布就绪状态并报告客户机退出。通用宿主发起的保存以及脉冲式的保存与恢复操作对微虚拟机不可用:捕获始终由客户机发起。
5.2.2 就绪端点
编排器可以为一次恢复提供一个一次性使用的就绪端点:Linux 上是已存在的 Unix 套接字,Windows 上是已存在的命名管道。VMM 在工作线程启动之前连接到它。当被恢复的 VM 首次启动时,工作线程在每个状态单元都启动之后、在释放任何被恢复的处理器之前,写入一条固定的就绪记录。对于带门控的恢复,宿主输入此时仍处于门控状态,客户机修复及其确认随后发生。连接、写入或刷新失败都会中止启动,而且该端点绝不保存在快照中。
5.2.3 管理排除
当工作线程持有快照停止守卫时,它的中央调度器会立即拒绝可能扰动该边界的管理操作,包括内存写入、恢复运行或重置、设备变更和状态转储,而不是把它们排队。快照静默、回滚、边界释放和内存读取仍然可用。该排除作用于每个管理前端所共享的工作线程边界。
5.2.4 托管沙箱生命周期
如表 5.2 所示,宿主启动器呈现一个带有五个操作的持久沙箱。
表 5.2. 托管沙箱操作。
| 操作 | 效果 |
|---|---|
| Provision | 记录沙箱的配置,包括其宿主共享 |
| Start | 以新生成的控制能力启动 VMM,重新挂接已记录的共享,并等待客户机就绪 |
| Exec | 通过控制通道运行一个工作负载 |
| Stop | 关闭 VM 并释放其运行时资源 |
| Deprovision | 移除沙箱的状态 |
生命周期转换一律故障关闭(fail closed),并按沙箱逐一生效,而执行则在其旁边并行运行。宿主标识每个沙箱正在运行的 VMM 进程,用已记录的状态与 VMM 进程对账,并恢复被中断的启动。拆除之后不留下任何 VMM 进程、控制端点、能力或运行时记录,而提供的层与暂存盘仍然保留。
沙箱生命周期 API 暴露相同的操作,并附带请求校验、后端能力、持久记录和稳定错误码。其默认后端以托管生命周期和无块托管根直接启动 VMM。另一种后端则把生命周期委托给单独提供的原生库和一个基于镜像的客户机。
5.2.5 权限划分
运行时控制按权限划分:
- 宿主控制器可以请求受支持的 VM 生命周期转换。
- VMM 串行化影响机器状态的转换。
- 客户机代理掌管工作负载的启动、停止、监督和捕获准备。
- 工作负载不能直接调用宿主管理接口。
可能扰动捕获或恢复边界的操作,会在该边界处于活动状态时被拒绝,而不是排队等待稍后执行。