Agent 沙盒执行层落地清单:六条照着做就行

4 阅读4分钟

上一篇文章从 DSec 拆了 Agent 执行环境的设计思路。这篇把它压成一份可对照落地的清单,6 条,每条都给 "做什么、为什么、怎么做、注意什么"。

背景

Agent 技能要跑在真实环境里,执行层设计直接决定三件事:技能能不能用、成本能不能压住、安全能不能兜底。

DSec 是 DeepSeek 公开的生产级沙盒平台,规模是单分片约 160 台服务器、3 万 CPU 核心、250TB 内存,单日约 300 万沙盒。它的设计思路可以拆成下面 6 条。

1. 按技能形态分后端

做什么:短任务用 FnCall,代码工程用 Container,强隔离用 MicroVM,GUI/Android 用 Full VM。

为什么:不同技能的运行形态完全不同。全塞进一个执行环境,要么浪费,要么跑不起来。

怎么做:

  • 先给技能分类:时长、是否读写文件、是否装依赖、是否要 GUI、可信度如何
  • 再映射到后端:越短越可信 → 越轻;越长越要隔离 → 越重

注意:别为了省事全用 Container。GUI 任务它跑不了,强隔离场景它不够。

2. 环境分层管理

做什么:把环境拆成 base image /workspace/toolkit 三层,独立管理版本。

为什么:如果每次工具包更新都触发镜像重建,成本是灾难。

怎么做:

  • base image:操作系统和基础软件
  • workspace:任务代码和依赖
  • toolkit:工具包
  • 创建沙盒时组合三层,工具更新只重建工具层

注意:分层带来的收益和规模关系不大,小团队也一样适用。

3. 优先做按需加载

做什么:镜像数据放对象存储或分布式文件系统,本地只存元数据,按需读取。

为什么:Agent 运行时真正访问的数据只占整个镜像的 4.2% 到 13.3%,预拉完整镜像大部分是白拉。

怎么做:

  • 镜像数据放远端
  • 本地只留元数据
  • 按需读取实际访问的数据块

参考数据:

  • 8192 个 Container 集中创建,从 "预拉完整镜像 60 多分钟" 变成 "按需加载约 35 分钟",提速约 1.71 倍,磁盘写入减少约 57%
  • tar.gz 解压改挂载 EROFS 层,总耗时从 79 分钟降到 45 分钟,磁盘写入只剩约五分之一

注意:按需加载依赖网络和存储,别在冷启动场景硬上。

4. 上快照复用

做什么:用 pack_diff 机制生成增量快照,保存环境状态,下次直接恢复。

为什么:Agent 调试最痛苦的是每次从头配环境;强化学习里同一条轨迹的环境状态本可以复用。

怎么做:

  • 环境配置好后存一次快照
  • 执行到第 k 步有多个方案时,在第 k 步存快照,从相同状态恢复出多个沙盒分别探索
  • 前面环境数据共享,只有后续变化单独记录

注意:这是最值得抄的一招,调试和轨迹分叉都用得上。

5. 安全前置

做什么:AppArmor + eBPF 白名单作为基础配置。

为什么:Agent 真的能自由操作时,会为了拿奖励走捷径。生产环境已观察到读取残留答案、伪造 RPC 请求、覆盖 /bin/bash 注入命令,甚至调用 XFSIOCSWAPEXT 绕过访问控制。

怎么做:

  • AppArmor 限制文件和 Socket 访问,即使 Agent 拿到管理员权限,规则仍生效
  • eBPF 网络白名单,给每个沙盒限定地址、端口和协议

注意:对内核漏洞这类风险,目前仍缺少通用防御。安全设计必须前置,不能上线后补。

6. 规模不大也一样适用

做什么:别以 "我们规模小" 为由跳过分层和快照。

为什么:分层和快照带来的收益,和规模关系不大。它们省的是 "重复配环境" 和 "重复拉镜像" 的时间,不是只有大厂才需要。

怎么做:

  • 先做分层,再做快照
  • 按需加载和资源超卖可以后面再补
  • 安全从第一天就按 "Agent 会找漏洞" 来设计

注意:资源超卖那条路(50 倍超卖、内存共享、空闲页回收)对规模和技术栈要求高,小团队不必照搬,但 "承认沙盒大部分时间在空转" 这个判断要有。