feat: Cloud Hypervisor 执行器生产级 v1(cloud-hypervisor)
单任务单 VM:API 唤醒(preflight→vmm.ping→vm.create→vm.boot→SSH 就绪)、 暂停/快照/休眠等价/关闭/回收、预热快照池、每任务磁盘 copy、容量与磁盘配额门、 受控 egress fail-closed、VM 事件审计与分类失败;worker/server/autoscaler 接线 (executor=cloud-hypervisor,任务内 LLM 不可自选);默认关闭,不进生产路由。 未做真实 VM 验证:生产主机与本 VM 均无 /dev/kvm、无嵌套虚拟化,验证为 mock + 干跑命令 + 单元测试;真 VM、快照恢复、压测、安全审计见 docs/chv-production-readiness.md。CI 账单故障仍是硬门禁,本提交只到 PR OPEN。
This commit is contained in:
1 parent
aebc6238a6
commit
c371bbdf1e
9 files changed
+2364
-11
No files matched your search
@@ -0,0 +1,71 @@
|
||||
# Cloud Hypervisor 客机镜像(chv-guest)——内容清单与版本化构建说明
|
||||
|
||||
> 本目录只有清单与构建脚本骨架,镜像本身不在本轨内实际构建
|
||||
> 发布。原因写在前面,不藏着:当前没有带 /dev/kvm 的宿主
|
||||
> 可以构建并实测 VM 镜像(生产主机是 CVM、无嵌套虚拟化;
|
||||
> 本 VM 容器内同样无 /dev/kvm)。构建与实测见
|
||||
> `docs/chv-production-readiness.md` 的“需镜像构建 / 需 KVM
|
||||
> 宿主实测”项,绝不在本轨声称镜像已建成、已发布、已跑通。
|
||||
|
||||
## 1. 镜像定位
|
||||
|
||||
- 基础:Ubuntu 云镜像(与 `cloud/docker/Dockerfile` 的任务镜像
|
||||
对齐能力,不是另起一套环境口径)。
|
||||
- 载体:Cloud Hypervisor 直接内核启动(vmlinux)+ raw 磁盘
|
||||
镜像,执行器用 `CHV_KERNEL` / `CHV_ROOTFS` 指向它们。
|
||||
- 客内 host.py 位置:`/app/host.py`(与 Docker 的 `/app:ro`
|
||||
同款约定,只是载体从容器只读挂载换成 VM 镜像内置代码;
|
||||
代码版本 = 构建时仓库 commit,见 §3 版本化)。
|
||||
- 绝不进镜像的东西:任何模型 key、系统 key、用户账号数据、
|
||||
生产凭证。模型 key 由客机 cloud-init 预置的运行环境变量名
|
||||
注入(与 Docker 的 `-e <名>` 同款惯例),不写进镜像层。
|
||||
|
||||
## 2. 内容清单(按现有 Docker 任务镜像能力对齐)
|
||||
|
||||
| 类别 | 内容 | 来源/版本口径 |
|
||||
| --- | --- | --- |
|
||||
| 语言与工具链 | Python 3.12、git、Node.js(Playwright 驱动用) | 与任务镜像同款大版本,构建时钉小版本并记入构建日志 |
|
||||
| 文档/图片工具 | pandoc、poppler-utils(pdftotext)、latexmk、texlive-latex-base、python-docx、openpyxl、python-pptx、PyMuPDF、Pillow | 逐项照抄 `cloud/docker/Dockerfile` 的 apt/pip 清单,不擅自加减 |
|
||||
| agent 引擎 | codex、codex-code-mode-host、codex-resources/bwrap(成套,约 367M,缺 sibling 直接构建失败) | codex 0.164.0-alpha.9(与生产任务镜像一致);`CODEX_BIN_DIR` 由构建方提供,bin/ 不进仓库 |
|
||||
| 浏览器 | Playwright + Chromium(浏览器自动化 MCP 用) | 与生产 playwright 镜像同款:浏览器装在固定路径、供租户用户可读;本骨架只列清单,浏览器版本在构建时钉死 |
|
||||
| 客机基础 | openssh-server(SSH 通道用)、cloud-init、qemu-guest-agent(可选,宿主信息用) | sshd 默认只允许 key 登录,禁止密码登录 |
|
||||
| 任务代码 | codex-app-server 仓库代码置于 `/app`(host.py 入口) | 版本见 §3,不挂载宿主代码目录(VM 与宿主无共享路径) |
|
||||
|
||||
中文 LaTeX 说明:与 Docker 镜像同款口径——xelatex + CJK
|
||||
字体会再增数百 MB,本清单不默认包含;需要时单独一版镜像,
|
||||
不在本轨悄悄加。
|
||||
|
||||
## 3. 版本化
|
||||
|
||||
镜像 tag 格式(构建时三项缺一即失败,不生成无版本镜像):
|
||||
|
||||
```
|
||||
chv-guest-<ubuntu 版本>-<codex 版本>-<仓库 commit 短 hash>
|
||||
```
|
||||
|
||||
例如(示例格式,非已建成):`chv-guest-24.04-0.164.0-alpha.9-aebc623`。
|
||||
|
||||
构建产物清单(构建方必须输出,执行器用它做 preflight 之外的
|
||||
版本核对,v1 执行器暂不校验 tag,见就绪清单):
|
||||
|
||||
- `vmlinux`(与 Ubuntu 云镜像配套的内核)
|
||||
- `disk.raw`(根文件系统镜像)
|
||||
- `BUILDINFO.json`:`{ubuntu, codex_version, repo_commit, built_at,
|
||||
contents: [清单逐项版本]}`
|
||||
|
||||
## 4. 构建脚本骨架
|
||||
|
||||
见 `build.sh`:只做参数校验、产物路径与版本 tag 计算、以及
|
||||
“需要 KVM 宿主 / virt-customize 才能执行的步骤”占位。脚本在
|
||||
无 KVM 的机器上运行时应在第一步就明确退出(`CHV_GUEST_BUILD
|
||||
needs a KVM host`),绝不假装构建成功。
|
||||
|
||||
## 5. 与执行器的对接
|
||||
|
||||
- 执行器 preflight 只校验内核/镜像文件存在且可读,不校验镜像
|
||||
内容版本——内容版本核对(BUILDINFO)是镜像发布流程的责任,
|
||||
在就绪清单里标为“需镜像构建”项,不在本轨假装已做。
|
||||
- 每任务磁盘:执行器 copy 模式下把 `disk.raw` 复制为每任务
|
||||
磁盘,任务之间文件系统独立;reuse 模式仅单租户实验,生产禁用。
|
||||
- 快照基准:`CHV_SNAPSHOT_URL` 指向的快照必须由本镜像的干净
|
||||
启动状态制成(pause 后 snapshot),预热池用它做干净 VM 来源。
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
#!/bin/bash
|
||||
# chv-guest 镜像构建脚本骨架(未在无 KVM 机器上实际执行过)。
|
||||
#
|
||||
# 用法(需要带 /dev/kvm 的宿主,见 README):
|
||||
# CODEX_BIN_DIR=bin UBUNTU_VERSION=24.04 CODEX_VERSION=0.164.0-alpha.9 \
|
||||
# REPO_COMMIT=$(git rev-parse --short HEAD) ./build.sh out/
|
||||
#
|
||||
# 本脚本只做三件事,绝不假装已建成镜像:
|
||||
# 1. 参数校验(缺 CODEX_BIN_DIR 成套二进制、缺版本、缺 /dev/kvm
|
||||
# 即退出,退出码非 0);
|
||||
# 2. 算出版本 tag(chv-guest-<ubuntu>-<codex>-<commit>);
|
||||
# 3. 列出仍需在 KVM 宿主上执行的步骤(下载 Ubuntu 云镜像、
|
||||
# virt-customize 装清单软件、拷入 /app 代码、生成 vmlinux /
|
||||
# disk.raw / BUILDINFO.json),每一步在骨架里以 TODO 标记,
|
||||
# 不在本轨内静默跳过或谎称完成。
|
||||
set -eu
|
||||
|
||||
OUT="${1:-out}"
|
||||
: "${CODEX_BIN_DIR:?CODEX_BIN_DIR 未设:需 npm 安装 @openai/codex 后的配对二进制目录}"
|
||||
: "${UBUNTU_VERSION:?UBUNTU_VERSION 未设}"
|
||||
: "${CODEX_VERSION:?CODEX_VERSION 未设}"
|
||||
: "${REPO_COMMIT:?REPO_COMMIT 未设:构建时仓库 commit 短 hash}"
|
||||
|
||||
for bin in codex codex-code-mode-host; do
|
||||
if [ ! -x "$CODEX_BIN_DIR/$bin" ]; then
|
||||
echo "缺少配对二进制:$CODEX_BIN_DIR/$bin,构建失败" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
if [ ! -d "$CODEX_BIN_DIR/codex-resources" ]; then
|
||||
echo "缺少 codex-resources(bwrap 载体),构建失败" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -e /dev/kvm ]; then
|
||||
echo "CHV_GUEST_BUILD needs a KVM host: /dev/kvm 不存在" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TAG="chv-guest-${UBUNTU_VERSION}-${CODEX_VERSION}-${REPO_COMMIT}"
|
||||
mkdir -p "$OUT"
|
||||
echo "tag=$TAG"
|
||||
echo "out=$OUT"
|
||||
echo "TODO(KVM host): 下载 Ubuntu ${UBUNTU_VERSION} 云镜像并转 raw"
|
||||
echo "TODO(KVM host): virt-customize 装 README §2 清单(git/python/pandoc/poppler/latex/codex/playwright/openssh)"
|
||||
echo "TODO(KVM host): 拷入仓库代码到 /app(版本 $REPO_COMMIT),绝不拷入任何 key"
|
||||
echo "TODO(KVM host): 生成 vmlinux + disk.raw + BUILDINFO.json,校验 tag 与清单版本"
|
||||
echo "构建骨架结束:以上 TODO 步骤未执行,镜像未建成(见 README 与生产就绪清单)"
|
||||
Reference in new issue
Block a user