什么是 Sandbox
一句话定义
在 CubeSandbox 中,Sandbox 是面向用户交付的最小运行单元:一个可以执行代码、运行进程、持有文件系统状态、拥有网络身份,并且与其它工作负载隔离的独立计算环境。
如果说用户在 E2B SDK 或 CubeSandbox API 上看到的是“创建一个环境”,那么这个环境在 CubeSandbox 里的正式名字就是 Sandbox。
为什么 CubeSandbox 要把 Sandbox 作为一等概念
很多系统也能“跑一段代码”,但它们对“运行环境”的定义并不一样:
- 在普通 PaaS 里,运行单元可能是一个进程
- 在容器平台里,运行单元往往是一个容器
- 在虚拟化平台里,运行单元可能是一台虚拟机
- 在 CubeSandbox 里,运行单元是 具备微虚拟机隔离语义、模板复用语义和平台 API 语义的 Sandbox
CubeSandbox 必须单独引入 Sandbox 这个概念,是因为它需要同时满足三件事:
- 对用户像一个“现成环境”:能执行命令、跑代码、读写文件、暴露服务。
- 对平台像一个“可调度对象”:能被创建、销毁、暂停、恢复、回收。
- 对安全模型像一个“隔离边界”:它需要有自己的 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 时要抓住三点:
- 它是控制面的核心调度对象。
- 它是节点侧生命周期管理的核心对象。
- 它是所有模板、快照、网络、安全能力最终汇聚的交付对象。
如果你是运维或使用方,最该关心的是:
- 它来自哪个 Template。
- 它当前在哪个 Node 上。
- 它暴露了哪些服务和网络路径。
- 它当前处于哪个生命周期阶段。
- 它的隔离边界和资源边界是否符合你的预期。
下一步
理解了 Sandbox 之后,下一步最自然的问题是:
既然 Sandbox 是实例,那么这个实例是从哪里复制出来的?
这就进入下一个概念: 什么是 Template。