Sandbox(共享内核)

定义

在 Box 的术语中,Sandbox 不是「任意沙箱」,而是 ExecutionIsolation::Sandbox:工作负载与宿主共享 Linux 内核,隔离由 namespace、cgroup 与 OCI Runtime 的进程策略提供。请求方式只有一种:--isolation sandbox。省略隔离标志表示 MicroVM,二者没有中间态。

Linux 上,未设置 A3S_BOX_OCI_MIGRATION 时,新的 Sandbox 记录默认路由到 SandboxViaOci,即通过 a3s-oci-sdk 交给固定版本的 A3S OCI Runtime。这是 v3.2.7 发布线的生产默认,而不是预览开关。

问题背景

并非所有工作负载都需要硬件虚拟化。受信工具、基准测试、以及已经运行在受控 CI 主机上的自动化,往往更需要快速启动与较低内存,而不是第二份内核。若产品只提供 MicroVM,这类场景会被不必要的虚拟化成本挡住。Sandbox 把共享内核路径保留为显式选项,同时禁止实现「MicroVM 失败就改走 Sandbox」。

机制说明

生产路径上的所有者

Sandbox GA 使用长期、身份围栏的 OCI 所有者进程(a3s-ocia3s-oci-agent):

  1. 启动前探测可执行文件能力并计算 SHA-256;
  2. 所有者根目录必须以模式 0700 创建,且属于同一 UID;
  3. 仅当 PID 启动身份、端点、路径与摘要匹配时才复用已有所有者;
  4. 未知套接字或产物漂移导致失败,而不是改连其他进程。

所有者被不干净地终止时,其父绑定的 Native Linux 进程树一并终止。下一次普通 Box 操作启动新的身份围栏所有者,将已认证的旧代际视为已停止,拒绝合成不可用的退出状态,并只删除该确切代际。

能力边界

Sandbox 路径拒绝仅 VM 功能:TEE、warm pool、snapshot-fork,以及(在 GA 证据中)命名桥与静态发布端口。文件系统、exec、PTY、pause/resume、快照恢复、重启与清理通过 OCI 契约提供;网络保持私有 netns 与 loopback 中继。完整威胁模型见 docs/host-sandbox-backend-design.md

与 a3s-sandbox 仓库的区别

GitHub 上的 A3S-Lab/Sandbox 是面向 Agent 的轻量跨平台命令沙箱。Box 的 --isolation sandbox 是本地 OCI 工作负载的共享内核隔离模式。名称相近,产品对象不同。需要「给模型跑一条命令」时应阅读 a3s-sandbox;需要「像 Docker 一样跑镜像」时应阅读 Box。

在 Box 中的位置

  • 枚举:src/core/src/config.rs
  • 后端:src/runtime/src/local_execution/oci_backend.rsoci_owner.rsoci_production.rs
  • 适配:src/runtime/src/sandbox/
  • 主机准备:scripts/prepare-linux-sandbox-host.shdocs/installation.md 中的 Linux Sandbox 一节。
  • 证据:docs/sandbox-ga-evidence.md。默认未覆盖:MicroVM 到 OCI 的全面切换、WHPX/KVM MicroVM 生产组合、HostRuntimeService 作为默认 create 路径。

验证命令

# 可选:固定产物路径;省略 A3S_BOX_OCI_MIGRATION 即使用 GA 默认
export A3S_BOX_OCI_RUNTIME_PATH=/absolute/path/to/a3s-oci
export A3S_BOX_OCI_AGENT_PATH=/absolute/path/to/a3s-oci-agent

a3s-box run --rm --isolation sandbox --cpus 2 --memory 512m \
alpine:3.20 -- sh -lc 'id; uname -r'

仅保留 MicroVM、禁用 Sandbox 路由时,设置 A3S_BOX_OCI_MIGRATION=off。显式 sandbox/on 在所有者未就绪时硬失败。

相关与易混

  • 相关:隔离级别对比OCI 标准与 bundleA3S 项目族谱
  • 易混:Sandbox 不是默认路径。也不要把「Linux Sandbox GA」理解成「所有隔离都已迁到 OCI Runtime」。省略 --isolation 的 MicroVM 拆分仍然有效,直到单独的 MicroVM cutover。