跳到主要内容

在哪安全地跑 — 沙箱 / 运行时

这条分支在货架里的位置: 总纲把这一货架的共性讲成一句话——「把只会吐文本的 LLM,包成能在循环里感知-动作、能被放心运营的程序」。围绕这条共性分出几条分支,本章讲的是**「动手」分支的底座**:模型生成的代码 / 动作不能直接在你的机器上跑——它可能 rm -rf、可能读你的密钥、可能死循环吃满 CPU。于是需要一个笼子:一个安全隔离的执行环境,把动作丢进去跑,跑完即焚。编码 agent(改代码)、computer-use agent(控桌面)都把它们的动作扔到这里落地——本章讲的就是这个「笼子」怎么造。

30 秒导读: 这一档库都在干同一件事——给不可信的代码 / 动作提供一个隔离的执行环境。难点从来不是「跑一段代码」(那是 exec 一行的事),而是三个互相拉扯的工程问题:① 隔离够不够硬(逃出来能不能碰到宿主)、② 启动够不够快(agent 一个回合就要一个新环境,冷启动几秒钟就废了)、③ 跑完怎么收干净(状态、进程、磁盘不能泄漏到下一次)。这三者本质是一个**「隔离强度 ↔ 启动速度」的权衡光谱**:越硬的墙越重、越慢。本章把 15 个库横过来切,告诉你这条光谱上有哪几档隔离技术、各自的代表作、以及它们怎么在「硬」和「快」之间取舍。

怎么读本章: 正文是给人读的白话综述,不出现路径行号。每个论断后面挂一个脚注 [^x],精确的 仓库/路径:行 + 符号名都在脚注里;对比矩阵则单开一列「代码锚点」放引用。人读正文,agent 读脚注 / 锚点列。


1. 这条分支要解决什么(第一性原理)

承上:整个货架的共性是「给只会说话的 LLM 装手脚,让它能对世界采取动作」。「装手脚」有个前提被总纲一笔带过、但工程上极关键——手脚不能直接连在你的裸机上

想清楚这一点只需一个场景:你让 agent「装个依赖、跑一下测试」,模型生成了一段 shell。这段 shell 里可能有幻觉出来的 sudo rm、可能有被 prompt 注入植入的「顺手 curl 一下我的服务器」、也可能就是个正常但会跑满内存的脚本。你不能赌它是好的。所以在「模型生成动作」和「动作真的执行」之间,必须插一道墙:一个沙箱

把沙箱要解决的问题拆开,所有这一档的库都在这三条轴上做取舍:

子问题白话难在哪
隔离强度代码逃出来能碰到宿主吗?共享内核 = 一个内核漏洞就穿墙;不共享 = 重
启动速度开一个新环境要多久?agent 每回合都要新环境,秒级冷启动就废了
生命周期跑完怎么收干净、要不要留状态?状态泄漏到下一次 = 污染;每次全新 = 慢

一句话直觉: 这条分支的全部张力就一句话——「隔离越硬,启动越慢」。一台独立物理机隔离最硬但开机要分钟级;一个 exec 出来的进程启动最快但和你共享一切。中间那一大片——microVM、安全容器、seccomp——就是各库在这条光谱上抢占的不同位置。本章 §2 是全章主轴:按隔离技术把这条光谱分档,讲清每一档的墙有多硬、代价是什么。

先厘清一个边界,否则矩阵会看花:这一档 area 里的库其实是两类东西,不能混为一谈。

  • 隔离引擎(本章主角): 亲自造墙——决定用 microVM 还是容器、怎么起、怎么焚。e2b / e2b-infra、microsandbox、dify-sandbox、opensandbox、beta9、cloudflare-sandbox-sdk、cua、aio-sandbox、daytona 属于这类。
  • agent 编排运行时(借墙的人): 它们管的是「agent 的会话 / 步骤 / 状态怎么持久编排」,代码执行这一步委派给上面的隔离引擎,自己不造墙。julep(基于 Temporal 的有状态工作流)、yao、ogx、iii 属于这类。1

本章 §2–§4 只深挖第一类(造墙的),§5 再把第二类归位。


2. 流派:按「墙用什么造」分档(本分支的灵魂)

这是分化最剧烈的一条主轴。「给不可信代码一堵墙」——按墙的材质,从最硬最重最轻最快,长出五档。

怎么读这张图: 从左到右是「隔离强度递减、启动速度递增」。最左边每个沙箱有自己的内核(microVM),一个宿主内核漏洞也穿不过去;越往右越共享宿主内核,靠拦截系统调用兜底,轻快但墙更薄。

隔离最硬 / 最重 ──────────────────────────────► 最轻 / 最快
独立内核 共享宿主内核

┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ ① microVM │ │ ② 安全容器 │ │ ③ 普通容器 │ │ ④ 进程内 │ │ ⑤ 托管/边缘 │
│ 独立内核 │ │ 拦截 syscall │ │ namespace │ │ seccomp │ │ 平台代管 │
│ Firecracker/ │ │ 的沙箱内核 │ │ + cgroup │ │ syscall │ │ 容器隔离由 │
│ libkrun │ │ gVisor/Kata │ │ (runc) │ │ 过滤 │ │ 平台负责 │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
e2b · micro- opensandbox · beta9(默认)· dify-sandbox cloudflare ·
sandbox beta9(可选) aio-sandbox daytona · cua(桌面VM)

下面逐档接地。关键洞察:①②的差别是「有没有自己的内核」,而不是「像不像虚拟机」——gVisor 看起来是容器,但它用一个用 Go 写的用户态内核去接管客户进程的系统调用,所以隔离比普通容器硬、比真 VM 轻。这是理解整条光谱的钥匙。

2.1 microVM:每个沙箱一个独立内核(最硬)

思路:用一个极度精简的虚拟机监控器(VMM)给每个沙箱开一台真 VM——有自己的 guest 内核、自己的虚拟设备,和宿主之间只隔着一层薄薄的 VMM。因为不共享内核,一个 guest 内核漏洞也碰不到宿主。代价是要装内核、要虚拟化,历史上「重」——microVM 的全部工程努力就是把这份重压到毫秒级

  • e2b / e2b-infra:E2B 是面向 agent 的 microVM 沙箱运行时,底座 e2b-infra 用 Firecracker 编排。每个沙箱是一个 Firecracker 进程,被起在独立的 Linux 网络命名空间里(ip netns exec … firecracker --api-sock),VM 内跑一个 envd 守护进程接管进程 / 文件系统 API。2 「快」靠内存快照:把预热好的 VM 内存做成 memfile,新沙箱直接从快照恢复,而不是冷启一个内核。3
  • microsandbox:本地优先的 microVM 运行时,底层是 libkrun——把 VMM 做成一个库直接链进进程,Sandbox::builder(...).create() 就地把一个 microVM 拉起来当子进程,无需外部基础设施。4 它主打亚百毫秒启动,并自带 MCP server,让 agent 直接把这个 microVN 当工具调。5

2.2 安全容器:共享内核但拦截系统调用(硬,但轻于真 VM)

思路:不给每个沙箱开真 VM,但也不信任宿主内核直接暴露给客户进程。在两者之间插一层沙箱化的运行时——要么是用户态内核(gVisor / runsc),要么是极简的 VM 化容器(Kata)。对上它伪装成一个标准 OCI 容器运行时,对下它把客户进程的系统调用统统截下来自己处理,不让它们直接打到宿主内核。硬度介于 microVM 和普通容器之间。

  • opensandbox(阿里):这是把「安全容器」抽象得最干净的一个。它有一个 runtime resolver,把配置里的 gvisor / kata / firecracker 翻译成后端要的运行时名——Docker 后端翻成 OCI 运行时(gvisor→runsckata→kata-runtime),Kubernetes 后端翻成 RuntimeClass(gvisor→gvisorkata→kata-qemufirecracker→kata-fc)。6 换句话说,同一套沙箱生命周期代码,底下的隔离档位是一个可配置项——这是这一档最清晰的教科书。7
  • beta9(Beam):自托管的 serverless 运行时,每个 pool 可配 runcgvisor 两种容器运行时,gVisor 走 runsc8 它还叠了一层冷启动加速:用 CRIU 做 checkpoint/restore,把跑起来的容器内存快照下来热恢复(是否启用由 pool 的 CRIUEnabled 决定,和用哪种运行时无关)。9

2.3 普通容器:namespace + cgroup(轻,但共享内核)

思路:就用 Linux 原生的 namespace(隔视图)+ cgroup(限资源),即标准 runc。启动快、生态成熟,但客户进程和宿主共享同一个内核——一个内核提权漏洞就能穿墙。适合「代码来源相对可控、看重速度和便利」的场景。

  • beta9 默认档就是 runc(gVisor 是可选升级)。8
  • aio-sandbox(字节 agent-infra):把 Browser / Shell / File / MCP / VSCode Server / Jupyter 全塞进一个 Docker 容器,SDK 用一组子系统 namespace(shell / file / jupyter / mcp / browser…)去驱动它。10 它优化的是**「一个容器搞定一个 agent 需要的全套工具」**,隔离用的是普通容器这一档——胜在开箱即用,不是隔离最硬的那一挂。
  • daytona:面向「跑 AI 生成代码」的弹性基础设施,主打快速启动的沙箱 + SDK + 自托管,同属容器化弹性运行时这一路(仓库为多语言 monorepo,以 README 为总入口)。11

2.4 进程内 seccomp:不开容器,只锁系统调用(最轻)

思路:连容器都不开——就在当前进程里,用 seccomp 给内核装一张 BPF 过滤器,把这个进程能调的系统调用收窄成一张白名单,白名单外的直接杀进程 / 返错。极轻(没有容器启动开销),但隔离最薄(还是宿主内核、还是同一进程树)。适合「只跑一小段解释器代码、追求极致轻快」的场景。

  • dify-sandbox:这是这一档的代表。它给 Python / Node 解释器进程装 seccomp——默认动作是 ActKillProcess(白名单外直接杀),再逐一 AddRule 放行必需的系统调用,最后用 SYS_SECCOMP 把 BPF 过滤器载入。12 联网与否也做成 seccomp 层的开关:enable_network 决定网络相关系统调用是放行还是拒绝。13 轻到可以嵌进 Dify 的工具执行链里。

2.5 托管 / 边缘:隔离由平台负责,你只管调 API

思路:不自己造墙,而是把沙箱架在一个已经提供隔离的平台上,你拿到的是「一个能跑代码的对象」,墙由平台代管。对使用者最省心,代价是绑定平台。

  • cloudflare-sandbox-sdk:把沙箱做成 Cloudflare 的 Durable Object(Sandbox extends Container),getSandbox() 拿到一个绑定到某容器的有状态对象,exec / execStream 通过一条 WebSocket 上的 RPC 打到容器侧执行。14 隔离由 Cloudflare 边缘的容器平台负责,你写的只是 Workers 代码。
  • cua(trycua):面向 computer-use agent——它要的不是「跑一段代码」而是「控一整台桌面」,所以沙箱是整机 VM。它抽象出多个 VM provider(本地的 lume / qemu、云端的 cloud),支持 macOS / Linux / Windows 客户机,agent 通过 WebSocket 对这台 VM 做鼠标键盘截屏。15 隔离粒度是「一台完整虚拟桌面」,是这条光谱在 computer-use 场景的特化。
  • e2b-code-interpreter:严格说不是新造一档隔离,而是 E2B microVM 之上的一层「代码解释器」SDK——在沙箱里跑一个 Jupyter 内核,run_code 把代码丢给内核、拿回富输出(图表 / stdout)。16 它证明了一件事:隔离层稳定后,上面能长出「有状态 REPL」这种高层能力

3. 让沙箱「快」的两条暗线(跨档共通)

隔离档位定了「墙多硬」,但几乎每个认真的运行时都要额外解决「怎么快」——因为 agent 是高频开合沙箱的(每个任务、有时每个回合一个)。冷启一个内核 / 容器要几百毫秒到几秒,乘上高频就爆了。两条几乎人人都走的暗线:

加速手段白话代表做法代码锚点
快照恢复预热好一个环境,把内存冻成快照,新沙箱从快照恢复而非冷启e2b 的 memfile 快照;beta9 的 CRIU checkpoint/restore3 · 9
库化 VMM / 本地起把 VMM 做成库直接起子进程,省掉外部编排的往返microsandbox 的 libkrun 就地起 microVM4

领域智慧: 「隔离要硬」和「启动要快」看似矛盾,工程上却是用快照把它们解耦——墙的硬度由隔离技术决定(一次性成本),启动速度由「恢复而非冷启」决定(每次成本)。这就是为什么 microVM 这种「理论上重」的方案,配上内存快照后反而能做到毫秒级——e2b 从 Firecracker 快照恢复、microsandbox 亚百毫秒启动,靠的都是「预热 + 恢复」而不是「每次从零装内核」。


4. 对比矩阵(逐格接地)

维度:隔离档位(§2)、隔离技术启动加速(§3)、生命周期 / 状态定位。描述列写白话,精确 path:line+符号 全在最右「代码锚点」列。 表示该维度对此库不适用或未在克隆中体现。

库 (id)隔离档位隔离技术启动加速定位代码锚点
e2b① microVMFirecracker + 独立 netns,VM 内 envd内存 memfile 快照恢复面向 agent 的开源 microVM 沙箱运行时e2b-infra .../sandbox/fc/script_builder.go:53;fc/memory.go:80
e2b-infra① microVMFirecracker VMM 编排(自托管底座)快照恢复 + 池化E2B 云的自托管 Go 基础设施.../sandbox/fc/script_builder.go:53;fc/client.go:42 loadSnapshot
microsandbox① microVMlibkrun(VMM 作为库,子进程起 VM)本地起 + 亚百毫秒启动本地优先 microVM 运行时 + MCP servercrates/runtime/lib/vm.rs:1046 krunfw_path;README Instant Startup
opensandbox-alibaba②(可 ③/①)runtime resolver:gvisor→runsc / kata→kata-runtime / firecracker→kata-fcDocker/k8s 生命周期 + 快照阿里沙箱运行时,隔离档位可配services/runtime_resolver.py:51-60;config.py:733
beta9③ 默认 / ② 可选runc(默认)或 gvisor/runsc(pool 可配)CRIU checkpoint/restore 热恢复自托管 serverless 运行时(E2B 替代)pkg/types/runtime.go:6-7;pkg/worker/worker.go:304;CRIU worker.go:348
dify-sandbox④ 进程内seccomp BPF:ActKillProcess 默认 + 系统调用白名单—(本就轻,无需快照)多语言代码执行沙箱(Dify 用)internal/core/lib/seccomp.go:16;网络门控 runner/python/python.go:143
cloudflare-sandbox-sdk⑤ 托管/边缘Durable Object(Sandbox extends Container),RPC over WS平台代管在 Cloudflare 边缘跑沙箱的 TS SDKpackages/sandbox/src/sandbox.ts:947;exec/execStream :755/:776
cua⑤ 整机 VMVM provider(lume/qemu 本地、cloud 云),支持 mac/linux/win 客户机provider 各自快照/池化computer-use agent 的桌面 VM 基础设施libs/python/computer/computer/computer.py:104(provider);providers/
aio-sandbox③ 普通容器单 Docker 容器塞 Browser/Shell/File/MCP/VSCode/Jupyter—(常驻容器,重用)一站式 agent 沙箱(全套工具打包)sdk/python/agent_sandbox/client.py:86-98(子系统 namespace)
daytona③ 容器化弹性快速启动沙箱 + SDK + 自托管(多语言 monorepo)快速启动(fast-start)跑 AI 生成代码的弹性基础设施README.md(总入口;healthOnly,高频演进)
e2b-code-interpreter借 ①(E2B microVM)不新造墙:E2B 沙箱内跑 Jupyter 内核继承 E2B 快照E2B 之上的「代码解释器」SDKpython/.../code_interpreter_async.py:105 run_code;:63 jupyter url
julep编排层(委派隔离)Temporal 有状态工作流编排 agent 步骤,代码执行委派外部沙箱—(靠底层沙箱)有状态 agent 后端 / 运行时agents-api/.../workflows/task_execution/__init__.py:8(temporalio)
yao编排层Go 单二进制 agent/web 运行时 + 内建 DSL(非隔离引擎)构建 agent/web app 的 Go 运行时agent/(README 总入口)
ogx编排层标准化 agent/inference/safety API 的 GenAI 栈(原 llama-stack)Open GenAI Stacksrc/(README 总入口)
iii编排层把 agent/API/workflow 组合成带可观测性的 step 运行时(原 Motia)组合式后端运行时README.md(总入口)

矩阵里两个「家族」值得点名:E2B 家族(e2b 面向用户 / e2b-infra 是底座 / e2b-code-interpreter 是解释器 SDK,三者共用 Firecracker microVM 内核)和编排层家族(julep/yao/ogx/iii 都不亲自造墙,把隔离委派出去)。长尾库不必逐一拆解——它们要么落进上面某个隔离档位,要么属于「借墙」的编排层。


5. 模式与权衡(可带走的领域智慧)

读完矩阵,几条横跨全分支的规律浮出来:

  • 隔离强度是一条连续光谱,不是「安全 / 不安全」的二值。 从 microVM(独立内核)→ gVisor(用户态内核)→ Kata(极简 VM 化容器)→ runc(共享内核)→ 进程内 seccomp,墙一档比一档薄、启动一档比一档快。选型不是「要不要隔离」,而是**「你能容忍多薄的墙换多快的启动」**。

  • 「有没有自己的内核」是隔离硬度的分水岭。 microVM 和安全容器(gVisor/Kata)都不和宿主共享内核,所以能扛「客户内核漏洞」;普通容器共享内核,扛不住。opensandbox 把这做成一个可配置档位(改个 type 就换硬度),是理解这条分水岭的最佳样本。

  • 「快」和「硬」用快照解耦。 天真地看 microVM「重」,但配上内存快照 / CRIU 恢复,毫秒级启动 + 硬隔离可以兼得。启动慢的锅往往在「每次冷启」而不在「隔离技术本身」——这是这条分支最反直觉、也最值钱的一条智慧。

  • 「造墙的」和「借墙的」是两类库,别混。 隔离引擎(e2b/microsandbox/dify-sandbox/opensandbox…)亲自决定墙的材质;agent 编排运行时(julep/yao/ogx/iii)只管会话 / 步骤 / 状态,把执行委派下去。同一个 area 里两类共存,选型时先问「我要的是墙,还是编排」。

  • 粒度跟着场景走。 编码 agent 要的是「跑代码 / 装依赖」,沙箱粒度是一个文件系统 + shell(e2b/dify/opensandbox);computer-use agent 要的是「控整台桌面」,粒度就得是整机 VM(cua)。同一条隔离光谱,粒度按「动作是什么」拉伸。

  • 托管 vs 自托管的取舍。 cloudflare-sandbox-sdk / daytona 让平台代管隔离(省心、绑定平台);e2b-infra / microsandbox / beta9 让你自托管(可控、自己扛运维)。这是「造墙」层内部的第二条取舍轴。


6. 演化趋势(这条分支往哪走)

把时间轴拉出来,三条趋势很清楚:

  1. 「容器够用」→「microVM 成为不可信代码的默认」。 早期跑 AI 代码多用普通容器(runc);但「共享内核 = 一个漏洞穿墙」的风险,让面向不可信 LLM 代码的新一代(e2b、microsandbox)直接倒向 microVM,再用快照把它的「重」压掉。opensandbox 把 gVisor/Kata/Firecracker 并列成可配档位,正是这场迁移「进行中」的活化石。

  2. 「隔离引擎」→「隔离 + 高层能力」的分层。 隔离层稳定后,上面长出更高层的抽象:e2b-code-interpreter 在沙箱里包一个 Jupyter 内核变成「有状态 REPL」;aio-sandbox 把 Browser/MCP/VSCode 打包成「一站式工具箱」;microsandbox 自带 MCP server 让 agent 直接调。沙箱正从「一个能跑代码的盒子」长成「一个 agent 的完整工作台」

  3. 「自己运维一套 Firecracker」→「调一个 API 就有沙箱」。 cloudflare-sandbox-sdk 的 Durable Object、daytona 的托管弹性基础设施,都在把「造墙」这件重活变成一次 API 调用。自托管路线(e2b-infra/beta9)仍在,但默认心智正从「我搭一套」滑向「我调一个」

三条趋势同源:隔离这件事正在「下沉」成基础设施——就像早年数据库从「自己装 MySQL」下沉到「调一个托管库」。这也呼应总纲的共性:把 LLM 包成可信程序,关键不只在模型多聪明,更在于它动手时,底下那道墙够不够硬、起得够不够快、收得够不够干净


7. 代表作 + 深入读哪些

按隔离档位点名代表作,想深入就从这里下钻:

想学的东西代表作入口
microVM 编排(Firecracker + 快照,必修)e2b-infra克隆 packages/orchestrator/pkg/sandbox/fc/
库化 microVM(libkrun 本地起,亚百毫秒)microsandbox克隆 crates/runtime/lib/vm.rs
安全容器档位可配(gVisor/Kata/Firecracker 一键切)opensandbox-alibaba克隆 server/.../services/runtime_resolver.pyconfig.py
runc vs gVisor + CRIU 热恢复beta9克隆 pkg/worker/pkg/types/runtime.go
进程内 seccomp(最轻隔离,读懂 BPF 白名单)dify-sandbox克隆 internal/core/lib/seccomp.go
托管 / 边缘沙箱(Durable Object + RPC)cloudflare-sandbox-sdk克隆 packages/sandbox/src/sandbox.ts
整机桌面 VM(computer-use 场景)cua克隆 libs/python/computer/computer/providers/
隔离之上的「代码解释器」(Jupyter REPL)e2b-code-interpreter克隆 python/e2b_code_interpreter/
一站式工具沙箱(容器内塞全套工具)aio-sandbox克隆 sdk/python/agent_sandbox/client.py
agent 编排运行时(借墙,不造墙)julep · yao · ogx · iiijulep src/agents-api/;各库 README

给入门者的学习路径: 先读 dify-sandbox 的 seccomp(最短路径搞懂「隔离到底在拦什么」)→ 再读 opensandbox 的 runtime resolver(一处代码看全 gVisor/Kata/Firecracker 三档的取舍)→ 然后读 e2b-infra 的 Firecracker + 快照(理解 microVM 怎么又硬又快)→ 想看极简本地方案就读 microsandbox 的 libkrun。四步下来,你能自己回答「我这个 agent 的动作,该丢进哪一档墙里跑」。读完回总纲,你会发现:编码 / computer-use 分支讲的是「怎么想出动作」,而本章讲的是「动作落在哪里跑才安全」——它们是同一件事的两半。


8. 代码地图(导航索引)

给 agent 的精确入口表(库 / 路径 / 符号),按隔离档位排:

主题路径符号 / 说明
Firecracker VMM 启动脚本e2b-infra/packages/orchestrator/pkg/sandbox/fc/script_builder.go:53ip netns exec … firecracker --api-sock
Firecracker 快照加载e2b-infra/packages/orchestrator/pkg/sandbox/fc/client.go:42loadSnapshot
Firecracker 内存 memfilee2b-infra/packages/orchestrator/pkg/sandbox/fc/memory.go:80originalMemfile / dedup cache
libkrun microVM 构建microsandbox/crates/runtime/lib/vm.rs:1046krunfw_path(VmBuilder)
安全运行时解析(gvisor/kata/fc)opensandbox-alibaba/server/.../services/runtime_resolver.py:51DEFAULT_DOCKER_RUNTIMES / DEFAULT_K8S_RUNTIME_CLASSES
安全运行时配置模型opensandbox-alibaba/server/.../config.py:733type: Literal["","gvisor","kata","firecracker"]
runc / gvisor 运行时常量beta9/pkg/types/runtime.go:6ContainerRuntimeRunc / ContainerRuntimeGvisor
gVisor runsc 装配beta9/pkg/worker/worker.go:304RunscPath: "runsc"
CRIU checkpoint/restorebeta9/pkg/worker/worker.go:348CRIUEnabled / InitializeCRIUManager
seccomp BPF 白名单dify-sandbox/internal/core/lib/seccomp.go:16sg.NewFilter(sg.ActKillProcess)
seccomp 网络门控dify-sandbox/internal/core/runner/python/python.go:143{{enable_network}}
Cloudflare Sandbox DOcloudflare-sandbox-sdk/packages/sandbox/src/sandbox.ts:947class Sandbox extends Container
Cloudflare exec/execStreamcloudflare-sandbox-sdk/packages/sandbox/src/sandbox.ts:755stub.exec / execStream
cua VM provider 选择cua/libs/python/computer/computer/computer.py:104provider_type(lume/qemu/cloud)
Jupyter 代码解释器e2b-code-interpreter/python/e2b_code_interpreter/code_interpreter_async.py:105run_code
aio-sandbox 子系统 namespaceaio-sandbox/sdk/python/agent_sandbox/client.py:86_shell/_file/_jupyter/_mcp/_browser
julep Temporal 工作流julep/src/agents-api/agents_api/workflows/task_execution/__init__.py:8from temporalio import workflow

Footnotes

  1. julep/src/agents-api/agents_api/workflows/task_execution/init.py:8 from temporalio import workflow;:129 @workflow.defn —— julep 用 Temporal 编排 agent 任务步骤,代码执行委派外部,自身不是隔离引擎。yao(agent/)、ogx(src/)、iii(README)同属编排层。

  2. e2b-infra/packages/orchestrator/pkg/sandbox/fc/script_builder.go:53 ip netns exec {{ .NamespaceID }} {{ .FirecrackerPath }} --api-sock {{ .FirecrackerSocket }}(每沙箱一个 Firecracker 进程,起在独立 netns);VM 内 envd 守护进程见 e2b-infra/packages/envd/。

  3. e2b-infra/packages/orchestrator/pkg/sandbox/fc/memory.go:80 originalMemfile(内存快照 dedup cache);fc/client.go:42 loadSnapshot 2

  4. microsandbox/crates/runtime/lib/vm.rs:1046 k.krunfw_path(&vm.libkrunfw_path)(VmBuilder 用 libkrun 内核);libkrunfw 常量 crates/utils/lib/lib.rs:87 LIBKRUNFW_VERSION 2

  5. microsandbox/README.md「Instant Startup: Average boot times under 100 milliseconds」;README:129「boots a microVM as a child process. No infrastructure required.」;MCP server 见 microsandbox/mcp/。

  6. opensandbox-alibaba/server/opensandbox_server/services/runtime_resolver.py:51-54 DEFAULT_DOCKER_RUNTIMES = {"gvisor":"runsc","kata":"kata-runtime"};:56-60 DEFAULT_K8S_RUNTIME_CLASSES = {"gvisor":"gvisor","kata":"kata-qemu","firecracker":"kata-fc"};get_docker_runtime/get_k8s_runtime_class

  7. opensandbox-alibaba/server/opensandbox_server/config.py:733 type: Literal["","gvisor","kata","firecracker"];:737-739 注释「gVisor uses runsc OCI runtime / Kata uses kata-runtime / Firecracker uses kata-fc (Kubernetes only)」;:894 firecracker 仅兼容 k8s 的校验。

  8. beta9/pkg/types/runtime.go:6-7 ContainerRuntimeRunc = "runc" / ContainerRuntimeGvisor = "gvisor";pkg/types/config.go:448 pool containerRuntime「runc or gvisor」;pkg/worker/worker.go:304 RunscPath: "runsc" 2

  9. beta9/pkg/worker/worker.go:348 pool.CRIUEnabled → :352 InitializeCRIUManager;container_server.go:283 rt.Capabilities().CheckpointRestore(runc 与 gvisor 都声明 true,实际启用取决于 CRIUEnabled + cache)。 2

  10. aio-sandbox/sdk/python/agent_sandbox/client.py:86-98 _shell/_file/_jupyter/_mcp/_browser… 子系统 namespace(单容器内驱动 Shell/File/Jupyter/MCP/Browser);核心运行时为闭源 Docker 镜像,SDK/docs/examples 开源。

  11. daytona/README.md —— 面向「跑 AI 生成代码」的弹性基础设施,主打 fast-start 沙箱 + SDK + 自托管(多语言 monorepo,freshness=healthOnly,高频演进,以 README 为总入口)。

  12. dify-sandbox/internal/core/lib/seccomp.go:16 sg.NewFilter(sg.ActKillProcess)(默认杀);:28-29 AddRule(..., sg.ActAllow) 逐一放行白名单;:58 syscall.Syscall(SYS_SECCOMP, ...) 载入 BPF。安装点 internal/core/runner/python/python.go:73 注释「loads a Go c-shared library to install seccomp」。

  13. dify-sandbox/internal/core/runner/python/python.go:143/:148 {{enable_network}} 替换为 "1"/"0" —— 联网与否在 seccomp 层门控。

  14. cloudflare-sandbox-sdk/packages/sandbox/src/sandbox.ts:947 export class Sandbox<Env> extends Container<Env>;:7 from '@cloudflare/containers';:755 stub.exec(...)、:776 execStream;控制面 RPC 见 packages/sandbox/src/container-control/。

  15. cua/libs/python/computer/computer/computer.py:104 provider_type = VMProviderType.LUME(默认);:141 注释「lume, qemu, cloud」;:133 客户机 os_type「macos/linux/windows/android」;provider 实现见 libs/python/computer/computer/providers/(lume/qemu/cloud/docker/winsandbox)。

  16. e2b-code-interpreter/python/e2b_code_interpreter/code_interpreter_async.py:105 run_code;:63-64 _jupyter_url(沙箱内 Jupyter 内核);它是 E2B microVM 之上的解释器层,不新造隔离。