docs(chv): L4/M6 取舍定案 + 部署核对清单

- L4:保持警告不改硬拒(CHV_NET 是手动直接启动命令透传值,
  与 API 的 CHV_NET_JSON 是两条路径;硬拒会断手动运维,
  误配代价只是 API 模式忽略 CHV_NET);写清兼容影响与
  将来改硬拒的前置条件;部署核对只设 CHV_NET_JSON
- M6:确认声明 + 审计就是本项机制,不假装已校验;部署核对
  加人工项(部署记录写明已核对租户数 = 1 与项目名一致,
  并复核 disk_reuse_experiment_allowed 审计)
- §11.4 加环境变量核对与残留尾巴审计抽查项
  (net_registry_write_failed / dirty_marker_write_failed /
  vm_net_registry_delete_failed 任一出现即先修宿主再启用)
This commit is contained in:
host committed 2026-11-06 18:41:56 +00:00
1 parent 2ad29eeb1f
commit f448ecb74b
1 file changed
+43 -9
+43 -9
View File
@@ -342,11 +342,20 @@
- M4 供应链版本钉死:已钉死——云镜像 SHA256 必填(干跑验 - M4 供应链版本钉死:已钉死——云镜像 SHA256 必填(干跑验
“已设”、全量验哈希)、Ubuntu 版本与 codex 版本均为必填 “已设”、全量验哈希)、Ubuntu 版本与 codex 版本均为必填
环境变量;BUILDINFO 新增 versions(构建时从客机读回的 环境变量;BUILDINFO 新增 versions(构建时从客机读回的
dpkg + pip freeze 实际版本,可审计、可复现比对)。未钉死 dpkg + pip freeze 实际版本,可审计、可复现比对)。
的清单:apt/pip 事前精确版本 lockfile(须在构建宿主上 generate_lockfile.py 已改写(to10 轨,本轮干跑复核):
生成一次、再固化进脚本,本轨无构建宿主、未编造版本号); 只读 BUILDINFO.versions 生成 lockfile,不再查构建宿主
Playwright Chromium 二进制版本同样只随 playwright pip 的 dpkg/pip,codex 三件套与 /app/host.py、gt、chv-sync
版本记录,未单独钉死。 走 BUILDINFO 声明字段;check_lockfile.py 已补强(条目
格式、contents 全覆盖、冻结清单双向比对)。
Chromium 已可单独钉死(本轮):CHROMIUM_HEADLESS_SHELL_REV
设为纯数字修订号时 buildinfo.py 校验读回的缓存目录名
须恰好是该修订号,否则构建失败,generate/check 的
--verify 也复核;未设时只记录、不强制,构建输出明说
“未钉死”。/app 已收紧为最小集(本轮):build.sh 只拷
host.py(只用标准库,不依赖 cloud/),不再把整个 cloud/
拷进客机。仍待真机:真实 lockfile 产出须等 V-9 真机
构建(本机无 /dev/kvm,版本号绝不编造)。
- M5 审计补齐:host_key_generated/host_key_captured/ - M5 审计补齐:host_key_generated/host_key_captured/
host_key_mismatch(stderr 含钉死拒绝标记时立即 fail-fast, host_key_mismatch(stderr 含钉死拒绝标记时立即 fail-fast,
不轮询成普通超时)、preflight_failed、wake 前置失败 不轮询成普通超时)、preflight_failed、wake 前置失败
@@ -357,7 +366,12 @@
实验放行须同时声明 CHV_SINGLE_TENANT_PROJECT,否则 实验放行须同时声明 CHV_SINGLE_TENANT_PROJECT,否则
preflight 拒绝(reuse_tenant_undeclared);不能校验的 preflight 拒绝(reuse_tenant_undeclared);不能校验的
部分明写:代码无法验证数据库里是否真的只有一个租户, 部分明写:代码无法验证数据库里是否真的只有一个租户,
声明 + 审计就是本项的机制,不假装已校验。 声明 + 审计就是本项的机制,不假装已校验。部署核对
(人工,见 §11.4):启用 reuse 前,部署人须在部署记录
里写明“已核对数据库租户数 = 1、项目名与
CHV_SINGLE_TENANT_PROJECT 一致”,并复核放行审计事件
disk_reuse_experiment_allowed;多租户部署上误设该标志
仍可能发生,代码拦不住,只能靠这道人工核对 + 审计告警。
- M7 容量计数残留 socket 误伤:只有真能连通的 socket 才 - M7 容量计数残留 socket 误伤:只有真能连通的 socket 才
计数,空文件/死 socket 不计入 CHV_MAX_VMS;竞态窗口 计数,空文件/死 socket 不计入 CHV_MAX_VMS;竞态窗口
写清(刚启动未 listen 的 VMM 会被判死,容量门是护栏 写清(刚启动未 listen 的 VMM 会被判死,容量门是护栏
@@ -380,9 +394,18 @@
- L3 失败审计:preflight/容量/配额/net 冲突失败均发 - L3 失败审计:preflight/容量/配额/net 冲突失败均发
vm_failed 审计(见 M5)。 vm_failed 审计(见 M5)。
- L4 CHV_NET 与 CHV_NET_JSON 双变量:双设时发 - L4 CHV_NET 与 CHV_NET_JSON 双变量:双设时发
net_config_dual 警告审计(不硬拒,CHV_NET 是手动直接 net_config_dual 警告审计(不硬拒,取舍已定,见下);
启动命令的透传值);NET_JSON 条目字段白名单 NET_JSON 条目字段白名单(tap/mac/ip/mask),未知字段
(tap/mac/ip/mask),未知字段直接拒绝。 直接拒绝。取舍定案(feat-chv-closeup 复核):保持警告、
不改硬拒。理由:CHV_NET 是手动直接启动命令的透传值,
与 API 模式的 CHV_NET_JSON 是两条不同的使用路径,双设
不一定是误配;硬拒会断掉手动运维路径,而误配的代价
只是“API 模式忽略 CHV_NET”,已有警告审计 + 本条文档
写清。兼容影响评估:现存手动运维用法不受影响;若将来
改硬拒,须先全量核查现存部署的 env 是否双设,并给手动
路径留显式放行开关,不可直接改。部署核对(见 §11.4):
生产 API 部署只设 CHV_NET_JSON,不设 CHV_NET;双设时
net_config_dual 审计须在部署记录里复核。
- L5 WarmPool 预热盘与任务盘对应关系:定义已写进 - L5 WarmPool 预热盘与任务盘对应关系:定义已写进
pool.acquire 文档——预热盘是干净快照盘,不是任务盘; pool.acquire 文档——预热盘是干净快照盘,不是任务盘;
本轨定案为实验性(ADR-5),不再作为接线待办。 本轨定案为实验性(ADR-5),不再作为接线待办。
@@ -402,6 +425,17 @@
收紧 /proc 可见性、进程表采集不记录完整 cmdline; 收紧 /proc 可见性、进程表采集不记录完整 cmdline;
- 部署后核对:state_dir 权限、socket 实际权限、 - 部署后核对:state_dir 权限、socket 实际权限、
tap 规则实测(见 §11.5 否定测试)。 tap 规则实测(见 §11.5 否定测试)。
- 环境变量核对(L4/M6,人工):生产 API 部署只设
CHV_NET_JSON,不设 CHV_NET;双设时 net_config_dual
审计须在部署记录里复核;启用 reuse 前部署人须在部署
记录里写明“已核对数据库租户数 = 1、项目名与
CHV_SINGLE_TENANT_PROJECT 一致”,并复核放行审计事件
disk_reuse_experiment_allowed。
- 残留尾巴审计核对(P2-17/18/19/20,feat-chv-closeup
已修):部署后抽查审计里有无 net_registry_write_failed、
dirty_marker_write_failed、vm_net_registry_delete_failed
事件——任一出现即说明 state_dir 写路径或登记路径有
故障,须先修宿主再启用。
### 11.5 仍需真机验证的清单(本轨一律未做,不声称已验) ### 11.5 仍需真机验证的清单(本轨一律未做,不声称已验)