Skip to content

什么是 Sandbox

一句话定义

在 CubeSandbox 中,Sandbox 是面向用户交付的最小运行单元:一个可以执行代码、运行进程、持有文件系统状态、拥有网络身份,并且与其它工作负载隔离的独立计算环境。

如果说用户在 E2B SDK 或 CubeSandbox API 上看到的是“创建一个环境”,那么这个环境在 CubeSandbox 里的正式名字就是 Sandbox。

为什么 CubeSandbox 要把 Sandbox 作为一等概念

很多系统也能“跑一段代码”,但它们对“运行环境”的定义并不一样:

  • 在普通 PaaS 里,运行单元可能是一个进程
  • 在容器平台里,运行单元往往是一个容器
  • 在虚拟化平台里,运行单元可能是一台虚拟机
  • 在 CubeSandbox 里,运行单元是 具备微虚拟机隔离语义、模板复用语义和平台 API 语义的 Sandbox

CubeSandbox 必须单独引入 Sandbox 这个概念,是因为它需要同时满足三件事:

  1. 对用户像一个“现成环境”:能执行命令、跑代码、读写文件、暴露服务。
  2. 对平台像一个“可调度对象”:能被创建、销毁、暂停、恢复、回收。
  3. 对安全模型像一个“隔离边界”:它需要有自己的 Guest 内核、自己的网络视角、自己的状态边界。

也就是说,Sandbox 不是一个“实现细节术语”,而是 CubeSandbox 整个产品模型的中心对象。

Sandbox 不是什么

理解一个概念最好的方式之一,是先知道它不是什么。

Sandbox 不是 Docker 容器

Docker 容器通常共享宿主机内核,依赖 namespace 和 cgroup 提供隔离。

CubeSandbox 虽然在外部接口上可以表现得像“创建一个会话环境”,但底层不是单纯容器隔离,而是把每个实例运行在独立 Guest 内核和 MicroVM 里。

所以“Sandbox = 容器”是错误的。

Sandbox 也不是传统意义上的完整虚拟机

传统 VM 的典型印象是:

  • 从 BIOS / bootloader 开始完整启动
  • 启动慢
  • 资源开销大
  • 更偏 IaaS 基础设施抽象

CubeSandbox 的 Sandbox 也有独立 Guest 内核,但它的目标不是提供通用基础设施 VM,而是交付一个 高密度、极低启动时延、可模板化复制的应用执行环境

所以“Sandbox = 普通虚拟机”也不准确。

Sandbox 不是 Template

Template 是母版,Sandbox 是实例。

Template 解决的是“如何定义与复用一个环境”;Sandbox 解决的是“如何把这个环境作为一个活的实例交付出去”。

这两个概念关系紧密,但绝对不能混用。

一个 Sandbox 到底包含什么

从概念上讲,一个 Sandbox 至少由五类状态组成。

1. 计算状态

计算状态指的是这个环境里正在发生的运行行为,例如:

  • 当前有哪些进程
  • 内存里加载了哪些程序和语言运行时
  • 内核与用户态当前处于什么执行状态
  • 某些服务是否已经完成初始化

这是 Sandbox 最“活”的一部分,也是为什么快照技术会如此关键。

2. 文件系统状态

Sandbox 要能执行代码,通常就要能看到文件系统:

  • 基础 rootfs 来自模板或镜像构建结果
  • 实例可以有自己的可写层
  • 运行过程中产生的文件、缓存、工作目录也属于这个实例的状态

这意味着一个 Sandbox 并不是“只有 CPU 和内存”,它还必须有自己的文件视角。

3. 网络状态

一个可服务的 Sandbox 通常需要网络能力:

  • 出站访问网络
  • 接收外界访问
  • 拥有自己的虚拟网络设备与地址视角
  • 受平台的网络策略控制

CubeSandbox 的网络不是“附带功能”,而是 Sandbox 能否真正承载 Agent 工作流的重要组成部分。

4. 生命周期状态

一个 Sandbox 并不总是“运行中”。

平台需要知道它目前处于哪种状态,例如:

  • 正在创建
  • 已就绪
  • 正在运行
  • 已暂停
  • 已销毁
  • 正在回收

这些状态决定控制面、节点侧和 API 层如何处理它。

5. 平台元数据

除了真正的运行资源,Sandbox 还有一层平台语义元数据,例如:

  • 它来自哪个 Template
  • 它属于哪个 Node
  • 它暴露了哪些端口
  • 它是否允许访问公网
  • 它的过期时间、标签、请求上下文

这些信息不一定属于 Guest 内部,但属于这个 Sandbox 在平台中的“身份”。

Sandbox 的边界在哪里

在 CubeSandbox 里,Sandbox 的边界不是单一维度,而是三层边界叠加:

1. 运行边界

Sandbox 拥有独立 Guest 内核和 MicroVM 运行上下文。

这意味着它与宿主机、与其它 Sandbox 的 CPU / 内存执行上下文并不是简单共享关系。

2. 状态边界

每个 Sandbox 都有自己的运行时状态、可写状态和网络状态。

即便多个 Sandbox 来自同一个 Template,它们共享的是“母版基础”,不是“实例状态”。

3. 管理边界

控制面和节点侧会把 Sandbox 作为单独对象管理:

  • 单独创建
  • 单独回收
  • 单独路由请求
  • 单独施加网络与资源策略

这层边界让 Sandbox 成为“可被平台精确控制的单位”。

Sandbox 的生命周期

从用户视角看,创建 Sandbox 只是一个 API 动作;从系统视角看,它通常经历完整生命周期。

1. 定义阶段

用户请求并不会直接生成一个任意环境,而是通常基于某个 Template 来定义要创建什么样的 Sandbox。

这一阶段确定的是:

  • 基础环境来自哪里
  • 实例规格是什么
  • 需要哪些端口或探针
  • 是否启用某些网络或安全策略

2. 实例化阶段

节点侧收到调度结果后,开始把“模板化环境”变成一个真实的 Sandbox:

  • 准备 runtime 所需资产
  • 建立实例级文件系统视图
  • 启动或恢复 Guest
  • 连接控制与网络路径
  • 等待达到可服务状态

这是“概念变对象”的关键一步。

3. 服务阶段

Sandbox 开始真正承载工作负载:

  • 执行用户代码
  • 跑 shell / agent / 服务进程
  • 读写文件
  • 提供对外端口
  • 参与平台请求转发

此时它已经不是一个静态镜像,而是一个活跃环境。

4. 回收阶段

当超时、主动删除或系统回收发生时,Sandbox 会被销毁:

  • 进程与 Guest 状态被终止
  • 网络映射被释放
  • 临时状态被清理
  • 元数据被删除或归档

CubeSandbox 的高密度能力,很大程度上取决于平台是否能高效地完成这一步。

为什么说 Sandbox 是“产品对象”,不是“实现细节”

如果只从底层看,Sandbox 好像只是很多技术拼起来的结果:

  • 一个 MicroVM
  • 一套 rootfs
  • 一个 shim
  • 一段网络配置
  • 一些平台元数据

但对 CubeSandbox 来说,这些都只是实现手段。真正对外成立的对象,是 Sandbox 这个可交付、可调度、可隔离、可回收的统一对象

这非常像 Kubernetes 里的 Pod:它不是某一个 Linux 原语,而是平台自己定义出来的、比底层原语更接近用户意图的对象。

CubeSandbox 里的 Sandbox 也扮演着类似角色。

Sandbox 与其它核心概念的关系

和 Template 的关系

  • Template 是“母版”
  • Sandbox 是“实例”

Template 决定创建起点,Sandbox 决定运行结果。

和 MicroVM 的关系

  • MicroVM 是隔离载体
  • Sandbox 是交付对象

可以说 Sandbox 运行在 MicroVM 之上,但不能简单说两者等价。

和 Snapshot 的关系

  • Snapshot 是状态复用机制
  • Sandbox 是状态被交付后的实例

Snapshot 让 Sandbox 能快,但 Snapshot 本身不是 Sandbox。

和 Node / Cluster 的关系

  • Sandbox 被调度到某个 Node
  • 多个 Node 共同组成 Cluster

Sandbox 是被调度的对象,Node 是承载它的地方。

常见误解

误解一:创建 Sandbox 就等于“启动一台全新虚拟机”

不完全对。

CubeSandbox 虽然使用虚拟化隔离,但通过模板与快照复用,把很多原本要在“实例创建时现场完成”的事情提前做掉了。

所以创建 Sandbox 更接近“恢复一个准备好的隔离环境”,而不是“从零启动一台传统虚机”。

误解二:Sandbox 是临时 shell,会话结束就什么都没了

不完全对。

Sandbox 的持久性和寿命由平台策略决定。它可以是短生命周期,也可以承载更丰富的执行与服务状态。

关键不是“它短不短”,而是“它是一个实例级环境”。

误解三:只要有容器,就不需要 Sandbox 这个概念

不对。

容器强调的是进程封装;CubeSandbox 的 Sandbox 强调的是 不可信代码执行场景下的独立安全边界与极速交付能力。两者解决的问题不同。

运维和开发最应该关心什么

如果你是平台开发者,理解 Sandbox 时要抓住三点:

  1. 它是控制面的核心调度对象。
  2. 它是节点侧生命周期管理的核心对象。
  3. 它是所有模板、快照、网络、安全能力最终汇聚的交付对象。

如果你是运维或使用方,最该关心的是:

  1. 它来自哪个 Template。
  2. 它当前在哪个 Node 上。
  3. 它暴露了哪些服务和网络路径。
  4. 它当前处于哪个生命周期阶段。
  5. 它的隔离边界和资源边界是否符合你的预期。

下一步

理解了 Sandbox 之后,下一步最自然的问题是:

既然 Sandbox 是实例,那么这个实例是从哪里复制出来的?

这就进入下一个概念: 什么是 Template