控制台
说明启动控制台与控制控制台的分工:控制台的设备契约、宿主附件形态,以及控制会话的认证与流控规则。
译自microsoft/nvx · doc/design/3.3-consoles.md。技术细节以英文原文为准。
NVX 把面向人的启动通信与经过认证的工作负载控制区分开来。两者都使用带两个分离队列的单端口 virtio-console 设备,但它们是不同的设备,具有不同的附件种类、稳定身份、插槽、中断、端点、已保存状态和重连策略。
3.3.1 启动控制台
可选的启动控制台承载启动消息和普通字节流。内核控制台在其驱动就绪之后使用它,而字节通道仍然是早期控制台。设备接受的宿主 RX 以及客户机 TX 的部分进展都属于设备私有的已保存状态,因此恢复绝不会从第零字节重放描述符,也不会静默丢失 VMM 所拥有的数据。
宿主附件是以下之一:
- Unix 套接字、命名管道或使用固定非零端口的回环 TCP 上的监听器,它在客户端连接之前保留待处理的客户机输出。
- 客户端连接。
- 继承的终端。
- 显式断开的端点,它丢弃客户机输出。
快照记录附件的稳定 ID、规范化端点身份、重连策略、必要性和超时,绝不记录原生句柄。已保存的监听器可以在同类的一个全新私有端点上重建,但其稳定 ID、附件种类、后端种类、重连策略、必要标志、长度和超时保持精确不变。客户端附件保留其精确的已保存身份,并需要一个显式批准的恢复时附件,超时为五秒。继承的终端必须再次提供,而断开的附件保持断开。
3.3.2 控制控制台
控制控制台承载宿主与客户机代理之间的结构化操作。带有控制控制台的全新启动同时需要启动控制台,这使控制设备的客户机终端成为 hvc2。机器配置文件掌管标识它的令牌,而启动控制台仍然是唯一的内核控制台。当存在控制控制台时,机器配置文件拒绝调用方提供的控制终端、驱动探测顺序和设备发现令牌(包括内核等价的连字符写法),也拒绝引号和 -- 分隔符,因此命令行解析无法改变客户机的终端发现。
宿主端点要么是本地监听器,要么显式断开。存活端点由三层保护:
- 私有端点。 在 Linux 宿主上,它是一个 Unix 套接字,以
0600模式独占绑定在 VMM 用户拥有的一个已存在、仅所有者可访问、非符号链接的目录内。在 Windows 宿主上,它是一个命名管道,其受保护的 DACL 只允许 LocalSystem 和 VMM 的用户访问。其他所有后端种类都被拒绝,而且启动端点与控制端点必须不同。 - 对端身份。 broker 为操作系统身份与 VMM 用户相同的对端保留其唯一的宿主槽位:Unix 对端的有效 UID,或管道客户端的令牌用户 SID。任何其他对端都在其字节被读取之前断开。
- 能力。 启动器通过一个单向管道传递随机生成的 32 字节能力,该管道的写入端在 VMM 启动之前就已关闭。首条宿主记录必须在有界的认证超时内(默认五秒)出示它。断开的控制控制台使用任何客户端都无法出示的随机能力。
如图 3.2 所示,broker 在客户机与经过认证的宿主之间转发一条冻结的、带版本的记录流。每条记录都有一个固定大小的头部,其中包含魔数、协议版本、记录类型、broker 实例 ID、纪元、方向内局部序列号和负载长度。连接记录建立客户机侧与宿主侧;确认、数据、等待、就绪、重置、认证错误和信用记录承载会话。
图 3.2. 控制会话的建立与数据流。
图中的三个参与者为宿主客户端(Host client)、VMM broker 和客户机代理(Guest agents)。消息序列如下(→ 表示请求,⇢ 表示应答):
| 步骤 | 发送方 | 接收方 | 消息 |
|---|---|---|---|
| 1 | 宿主客户端 | VMM broker | 以 VMM 的用户身份连接 |
| 2 | 宿主客户端 | VMM broker | 出示能力(capability) |
| 3 | VMM broker | 客户机代理 | 连接宿主侧 |
| 4 | 客户机代理 | VMM broker | 确认并授予接收信用 |
| 5 | 宿主客户端 | VMM broker | 信用范围内的数据 |
| 6 | VMM broker | 客户机代理 | 数据 |
| 7 | 客户机代理 | VMM broker | 数据与更多信用 |
| 8 | VMM broker | 宿主客户端 | 数据 |
流控基于信用:客户机为宿主数据授予按字节计数的接收信用。当信用耗尽时,一条完整的宿主记录可以在一个有界的待处理槽位中等待,并且每个输出方向在记录数和字节数上都有界。格式错误的长度、状态错误的记录、错误的实例或纪元值,以及重复或乱序的序列号,都会失败关闭。能力错误或认证超时会在不推进纪元的情况下分离客户端。宿主断开会推进纪元,丢弃未开始的数据和未使用的信用,完成任何已部分传输的记录以使流保持对齐,并发出重置;下一个会话只有从一次全新的客户机确认处才能获得信用。
快照只记录端点身份和一项 broker 策略(要么是经过认证的监听器,要么是断开的控制台),绝不记录能力或对端身份。broker 的已保存状态省略排队记录、宿主输出和可用的接收信用;它只保留客户机侧的解析器、任何已部分传输的客户机记录以及错误计数器。要恢复一个经过认证的监听器,启动器必须提供一个已批准的端点和一份全新的能力。该端点可以迁移到一个全新的位置,使并发克隆不会冲突,但它必须满足上面的私有端点规则,而且附件的稳定 ID、附件种类、后端种类、重连策略、必要标志、长度和超时保持精确不变。断开的控制台保持断开。被恢复的 broker 获得一个全新的实例 ID,从第一个纪元重新开始并排队一个重置,在客户机确认新实例之前忽略旧实例的客户机记录。
客户机代理拥有 broker 流内承载的工作负载协议;参见宿主—客户机控制接口。