# 💡 Summary [[多租户]] 一段 AI 生成的 Python 代码运行时: [[Namespace]] → 看不见宿主机进程,看不见其他沙箱的文件 [[cgroup]] → 最多用 2 核 CPU 和 4GB 内存,超了就被杀 [[seccomp]] → 不能调 ptrace/mount/kexec 等危险系统调用 这是典型的「**一个技术名词到底是哪家在提供/托管**」问题的变体。 **E2B 云端沙箱不是阿里云的产品**,而是 **E2B(e2b.dev / e2b-dev)这家公司/开源项目**提供的“云端隔离执行环境(sandbox)”服务与基础设施。官方主页与文档都把它描述为:在云里启动隔离沙箱来运行 AI 生成代码,并通过它们的 SDK/控制台来管理。([E2B](https://e2b.dev/?utm_source=chatgpt.com "E2B | The Enterprise AI Agent Cloud")) 从公开信息看,E2B 公司总部在旧金山一带、规模 11–50 人。([LinkedIn](https://www.linkedin.com/company/e2b-dev?utm_source=chatgpt.com "E2B")) 另外,它并不是只能跑在“E2B 自己的云”: - **BYOC(Bring Your Own Cloud)**:官方文档写的是 _把 E2B 部署进你自己的云和 VPC_,但**当前只支持 AWS**(并表示在做 GCP/Azure),文档里**没有**写阿里云。([E2B](https://e2b.dev/docs/byoc?utm_source=chatgpt.com "BYOC (Bring Your Own Cloud)")) - **自托管/开源**:E2B 也强调自己是开源基础设施,你可以自己部署(是否上阿里云取决于你自建/适配能力,而不是“官方托管就是阿里云”)。([GitHub](https://github.com/e2b-dev/E2B?utm_source=chatgpt.com "e2b-dev/E2B: Open-source, secure environment with real- ...")) 如果你说一下你在哪个产品/框架里看到 “E2B”(比如某个 agent 模板、LangChain 集成、Docker MCP 之类),我可以更精确告诉你:你用到的是 **E2B 官方托管**,还是 **BYOC/自建** 的那一种路径。 # 🧩 Cues # 🪞Notes 这是个很好的问题,"沙箱"在这里其实是**多层嵌套**的概念,不同层用了不同的隔离机制: --- ## 第一层:整个 AIO Sandbox = **一个 Docker 容器** 这是最外层的隔离边界。AIO Sandbox 通过 Docker 镜像集成所有能力,提供统一的文件系统和认证。 所以你运行: ```bash docker run --security-opt seccomp=unconfined -p 8080:8080 ghcr.io/agent-infra/sandbox:latest ``` 此时整个环境(浏览器、终端、文件、代码执行、VSCode)全在**这一个容器**里跑。注意 `--security-opt seccomp=unconfined` 这个参数——它主动**关闭了** seccomp 系统调用过滤,因为内层还有更细的隔离机制需要用到某些特权系统调用。 --- ## 第二层:代码执行 = **Sandbox Fusion(进程级隔离)** 这是最关键的内层隔离。代码执行部分使用了字节跳动开源的 **Sandbox Fusion** 的 Python 3.10/3.11/3.12 和 Node.js 22 运行时,提供集成的安全隔离环境。 Sandbox Fusion 是字节跳动专门为代码执行安全设计的隔离方案,底层利用 Linux 的 **namespace + cgroup + seccomp** 实现进程级沙箱——相当于在 Docker 容器内部再套一层进程隔离。这就是为什么外层 Docker 必须 `seccomp=unconfined`:把 seccomp 控制权让给内层的 Sandbox Fusion 来管。 --- ## 第三层:Shell 终端 = **tmux session 隔离** Shell 模块使用了 OpenHands 的 CmdRunAction 作为执行引擎,结合 tmux 实现多会话执行能力。 这层不是强安全隔离,而是**会话隔离**——不同的 Agent 任务跑在不同的 tmux session 里,互不干扰,但本质上还是同一个 Linux 进程空间。 --- ## 第四层:浏览器 = **Chromium 进程 + X11** 浏览器跑的是容器内的 Chromium 进程,通过 X11 显示服务提供 GUI,再用 noVNC 把画面串流到 Web 端。Chromium 本身也有自己的沙箱机制(renderer 进程隔离),但在这里主要是靠容器边界保护。 --- ## 整体隔离架构图 ``` ┌──────────────────────────────────────────────────────┐ │ 宿主机 Host OS │ │ ┌────────────────────────────────────────────────┐ │ │ │ Docker 容器(第一层隔离) │ │ │ │ ┌─────────────────┐ ┌────────────────────┐ │ │ │ │ │ Chromium+X11 │ │ tmux sessions │ │ │ │ │ │ (浏览器进程) │ │ (Shell 会话隔离) │ │ │ │ │ └─────────────────┘ └────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ │ │ Sandbox Fusion(第二层,进程级隔离) │ │ │ │ │ │ namespace + cgroup + seccomp │ │ │ │ │ │ Python 3.10/3.11/3.12 / Node.js 22 │ │ │ │ │ └──────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────┘ ``` --- ## 一句话总结 AIO Sandbox 的"沙箱"是**双层结构**:外层用 **Docker** 隔离整个运行环境,内层用字节跳动的 **Sandbox Fusion**(基于 Linux namespace/cgroup/seccomp)对代码执行做进程级安全隔离。Shell 只是 tmux 会话隔离,并非强安全边界。所以它不是独立 OS,不是独立文件夹,而是**容器 + 进程沙箱的组合**。