feat: CHV 执行器优化(拆模块/去重复/SSH 钉死/池持久化/中途死亡分类)
- 拆模块:CHV 从 cloud/sandbox.py 巨类拆到 cloud/chv/(executor/ pool/config/api_client/ssh_transport/disk/errors),sandbox 只留 兼容 re-export,旧导入路径与新路径是同一对象 - 去重复:goal 解析、host 顶层参数、runner 超时抽成共享 helper, Local 与 CHV 在矩阵输入下结论全等(Docker goal-resume 变体 有意保留内联版,见 PR 描述) - 安全:SSH host key 按 VM 钉死(state_dir/<vm>/known_hosts, ssh-keyscan 首次捕获 TOFU),废除 no + /dev/null;CHV_SSH_USER 空串与 CHV_SSH_PORT 越界直接拒绝,不静默 fallback - execute 语义:只读已运行 VM,未运行报 vm_not_running,不为 status 起 VM - 预热池:registry 落盘、重启载入只当孤儿、reconcile 清理、 损坏 quarantine;条目仍一次性,绝不复用脏 VM - 长任务:VM 中途死亡判 interrupted(断点可续跑);中途心跳 经评估不做(无客内进度信号可采) - #215 未合并:只列复用清单,不复制模块 测试:原 42 项 + 新 24 项全过;相关旧套件与 cloud 全量 1496 项 全过(skipped=4)。验证仍是 mock + 干跑 + 单元测试,未做真机、 压测、安全审计;堆叠于 #216 之上,base 为 feat-cloud-hypervisor。
This commit is contained in:
1 parent
c371bbdf1e
commit
fde7bf4c3e
14 files changed
+2706
-1408
No files matched your search
@@ -42,6 +42,17 @@
|
||||
- ✅🧪 密钥不进镜像/代码/prompt:SSH argv 只有 key 文件路径;
|
||||
模型 key 由客机 cloud-init 预置的环境变量名注入;测试断言
|
||||
命令中不含哨兵密钥值。
|
||||
- ✅🧪 SSH host key 按 VM 钉死(优化轨,#216 的 no + /dev/null
|
||||
已废除):每 VM 在 state_dir/<vm>/known_hosts 有独立文件,
|
||||
首次启动经 ssh-keyscan 在本机回环端口捕获 key 写入该文件,
|
||||
此后 SSH 一律 StrictHostKeyChecking=yes + 该文件校验;
|
||||
非 root 客机用户(CHV_SSH_USER,显式空串直接拒绝)与端口
|
||||
(CHV_SSH_PORT,1-65535)为显式配置。mock 只验证捕获→
|
||||
写文件→钉死选项的管线,不验证首次密钥真实性。
|
||||
- 🔒 首次信任边界未闭合:首次捕获是 TOFU,只防首次之后的
|
||||
替换,不验证首次本身;更强的方案是镜像构建/cloud-init 时
|
||||
把客机 host key 预置进 known_hosts,仍是待办,安全审计时
|
||||
须单独立项确认。
|
||||
- 🔒 需安全审计:VM 逃逸面(virtio 设备、tap 桥接、SSH 配置)、
|
||||
客机 root 提权面、租户间东西向隔离的宿主网络配置,须由
|
||||
安全审计逐项确认,代码自查不能代替审计。
|
||||
@@ -55,6 +66,12 @@
|
||||
冷启动,绝不降级 Docker/Local。
|
||||
- ✅🧪 预热条目一次性:acquire 消耗、release 一律销毁,绝不跨
|
||||
任务复用脏 VM。
|
||||
- ✅🧪 预热池 registry 与孤儿清理(优化轨):池状态落
|
||||
state_dir/warm-pool.json(原子写),worker 重启后载入的
|
||||
条目一律当孤儿、只能 reconcile_orphans() 清理,绝不重新
|
||||
发给任务;registry 损坏时 quarantine 成 .corrupt 并从空池
|
||||
开始;registry 之外的残留 socket 仍由 cleanup_stale_vms()
|
||||
扫描处理。
|
||||
- ⏳ 需 KVM 宿主实测:预热池的真实冷启动耗时、resume 耗时、
|
||||
池大小与命中率、快照来源一致性,均需真机数据,mock 数字
|
||||
不能当性能结论。
|
||||
@@ -75,6 +92,17 @@
|
||||
shutdown + 杀进程 + 删 socket)、recycle_vm(保留
|
||||
task_checkpoints/task_attempts,丢失 guest /tmp 与未拷出
|
||||
的 worktree 临时物,绝不声称恢复临时文件)。
|
||||
- ✅🧪 execute 只读已运行 VM(优化轨):execute() 先查 VM
|
||||
是否在运行(登记活进程或 api-socket 存在),未运行报
|
||||
ChvFailure(kind=vm_not_running),不为一次 status 起 VM,
|
||||
也不向不存在的端口发 SSH 再拿连接失败冒充任务状态。
|
||||
- ✅🧪 长任务中途死亡判 interrupted(优化轨):客内命令抛
|
||||
传输异常、或非 goal 结果已 failed 且登记 VMM 进程已死时,
|
||||
_run_with_vm 改判 interrupted(断点可续跑)而非笼统
|
||||
failed;VM 还活着时的异常/失败原样处理。中途心跳未做:
|
||||
host.py 单次 SSH 长回合没有客内进度信号可采,另起一路
|
||||
SSH 轮询只能证明 VM 活着、不能证明任务在进展,评估后
|
||||
认为风险大于收益,宁可只做死亡分类。
|
||||
- ⏳ 需 KVM 宿主实测:上述全部生命周期在真机上的状态转换、
|
||||
快照恢复后 guest 状态一致性、休眠后文件/worktree 保留,
|
||||
均未在真机验证。
|
||||
|
||||
Reference in new issue
Block a user