Daemon 运维¶
使用原生 VM 运行时、私有状态与显式资源容量运行单节点 sandbox 服务。直接调用 pvisor-daemon。它拥有 sandbox 服务及可选独立池组件;pvisor-cache 保持独立。
部署¶
要求 Linux x86_64、可用 /dev/kvm、可信绝对路径,以及可写、已委派且启用 CPU/memory/PID controller 与 cgroup.kill 的 cgroup v2 层级。前置检查验证真实 controller 写入和 KVM API;没有 host、OCI 命令或 registry-pull 降级。
将 OPEN_SANDBOX_API_KEY 设置为至少 32 字节的受保护随机秘密,不放入 argv。
serve 使用已实现且必需的 --images-dir 与 --cgroup-root 构造 NativeRuntime。Cargo 链接 pvisor 与 pvisor-core;同步 main 在参数解析或 Tokio 之前调用 pvisor::run_krun_internal_if_requested(),随后派发隐藏的 native-supervisor --sandbox-dir ABSOLUTE_PATH 命令。下方部署示例使用当前 CLI,但不提供或验证 guest bootstrap、SDK 兼容或密度。
pvisor-daemon protocol
pvisor-daemon serve \
--images-dir /srv/pvi \
--cgroup-root /sys/fs/cgroup/pvd \
--listen 127.0.0.1:8080 \
--state /run/user/1000/pvd \
--max-sandboxes 32 \
--cpu-millis 4000 \
--memory-bytes 8589934592
重启保持状态与运行时配置兼容。非 loopback 暴露前在可信反向代理终止 TLS。--public-endpoint 设置外部路由可达的 host:port authority;通配或临时端口监听必须提供它。自动端点发布未实现。
运行时路径使用绝对路径,daemon 重启时保持不变。状态路径保持短,例如 /run/user/1000/pvd:逐 sandbox 的 control.sock 必须短于 104 字节,vsock Unix socket 也有路径长度限制。保留状态;此 /run 示例不保证跨注销/重启持久化,VM 不能跨宿主重启存活。/sys/fs/cgroup/pvd 必须是真实委派层级,不能是普通目录。
版本 1 中已有记录的 sandboxes.json 若缺少原生 owner.json marker,会在既有 store 独占锁内被拒绝:它可能仍持有活动 Podman 容器。使用全新原生状态并保留/清理旧部署,或通过旧 Podman daemon 删除全部 sandbox、确认清理后,再用已清空的 registry 切换后端。不要删除 registry 条目、预留或所有权状态,也不要伪造原生 marker 绕过检查。原生 daemon 不会把这些容器接管为 Missing 或静默释放其预留。
v2 header 缺少 owner.json 时也会被拒绝,即使它按设计使用空 sandboxes map。原生 marker、header 与私有 records/ 树须一同保留;见存储迁移与激活。
预制镜像合同¶
镜像是可信本机 images_dir/<key>.json manifest,不是 registry reference。字段包括绝对路径的独立 Linux rootfs(不能是宿主 / 或与 daemon 状态重叠)、绝对路径的 guest bootstrap entrypoint argv、可选 cmd、可选 env 与可选绝对路径 firmware library_dir。请求的工作负载 argv(为空则使用 cmd)追加到 entrypoint,请求 env 覆盖 manifest env,不继承宿主环境,也不经 shell 插值。
长期运行的 guest bootstrap 必须监督工作负载、真实 OpenSandbox 1.1.0 execd 与 egress,自行初始化/鉴权服务、转发信号并回收子进程。它必须在 guest CID 3 的 44772/18080 端口提供字节透明的 AF_VSOCK listener,桥接真实服务。Supervisor 的 loopback TCP 发布经私有 Unix socket 与原生 vsock 转发连接 guest。普通 rootfs 或只运行 sleep 的进程不够。
Create、对 Running VM 的 Inspect 与 resume 就绪检查经 bridge 要求真实 HTTP 200 的 execd /ping、JSON initialized: true 的 /ready 和 egress /healthz,响应体有界。端点解析认证 live Running 状态并检查删除屏障,不为每次数据请求重复完整 health/cgroup 检查。daemon 不注入/初始化 execd,也不合成 command/SSE/file 响应。Python SDK 初始化即使没有网络策略也会解析两个端点。
Bootstrap 与镜像配方未提供,也未经端到端验证。旧容器的 cap-drop=ALL 限制不适用于此原生 VM 后端;upstream 镜像名称不是原生 bootstrap/vsock 适配器。不提供假就绪,也没有 SDK 兼容或密度证据。
部分协议 Profile¶
基线:OpenSandbox 1.1.0、release-1.1.0、commit b1a29cf93a823a95913f7943010febb3f29de05c;升级需显式审查 schema、SDK 与测试。
| 接口 | 当前行为 |
|---|---|
POST /v1/sandboxes |
镜像/argv/env/metadata、CPU/内存硬限制、可选 TTL;202 JSON |
GET /v1/sandboxes |
重复 states、SDK 编码 metadata、page/pageSize;最近持久观察 |
GET /v1/sandboxes/{id} |
对账原生状态;200 JSON |
DELETE /v1/sandboxes/{id} |
确认删除后释放;204 |
POST /v1/sandboxes/{id}/pause、/resume |
确认同一 Attempt 的 live vCPU pause/resume;202 空体 |
POST /v1/sandboxes/{id}/renew-expiration |
未来 RFC3339 截止时间,延长已有 TTL |
GET /v1/sandboxes/{id}/endpoints/{port} |
通过 daemon authority 发布实际 execd/egress |
| 数据面 | 流式转发预制服务,不重新实现其 API |
生命周期请求使用 OPEN-SANDBOX-API-KEY。响应含 X-Request-ID,错误为 {code, message}。Server-proxy 端点使用生命周期 key;默认端点提供 sandbox 范围的 X-PVISOR-SANDBOX-TOKEN headers,SDK 必须保留它们。Token 不能控制生命周期或访问另一个 sandbox。控制秘密向上游转发前被移除,但不替代调用方提供的 execd 访问凭据。
不支持 snapshot、template/pool、metadata 修改、hook、network policy、credential proxy、secure access、volumes、image auth、任意端口、signed endpoint、WebSocket 和 CONNECT。运行时已接入原生 VM 执行;stage/apply、checkpoint/fork 与 offload API 未实现。
信任边界¶
原生 OverlayNet 提供 VM 出口网络;OpenSandbox 网络策略请求仍不支持并被拒绝,不等于 deny-all egress。宿主账户、daemon/firmware 和预制镜像属于可信输入;私有状态与同 UID IPC 不防御敌对宿主 UID/root 代码。其他本机用户可能访问 loopback 发布,仍需真实服务鉴权与宿主控制。秘密不进入 supervisor argv 或宿主环境,但保存在私有记录中。不承诺安全审计或敌对多用户隔离。
故障处理¶
| 症状 | 操作 |
|---|---|
| 丢失创建/控制响应 | 检查已有记录/副作用;断连不取消已接受操作,创建没有重试幂等 key |
| 容量耗尽 | 检查保留记录;pause 或低 RSS 不释放预留 |
| Failed/原生 sandbox 缺失 | 保留记录,排查运行时,显式删除以释放资源 |
| 待删除/TTL 清理 | 恢复运行时访问;维护重试,但 TTL 不是硬截止 |
| 存储提交不确定/registry 损坏 | 保留目录,修复存储后重启,不以删除归属状态继续运行 |
| Daemon 关闭 | 独立原生 supervisor/VM 跨 daemon 重启保留;使用相同 owner/状态重启,或安排独立宿主清理 |
| 就绪/端点失败 | 检查真实服务与 guest bootstrap/vsock bridge,而非仅看 VM Running |
证据范围¶
源码测试覆盖 fake-runtime 准入/生命周期/重启/TTL、HTTP 鉴权/schema/过滤/端点及纯运行时解析/argv,不建立原生隔离、SDK 端到端兼容或密度收益。本次文档修改没有运行构建、测试、原生 sandbox 或 benchmark。旧分布式 Cluster gate 和测量不验证该 daemon。