在Gondolin micro-VM中跑通Chromium浏览器:Browser Use Agent实战指南
【免费下载链接】gondolinExperimental Linux microvm setup with a TypeScript Control Plane as Agent Sandbox项目地址: https://gitcode.com/gh_mirrors/go/gondolin
Gondolin 是一个开源的 Agent 沙箱项目:它用 QEMU 在本地拉起轻量 Linux micro-VM,并用 TypeScript 实现可编程的网络与文件系统控制平面,让 AI Agent 生成的代码在隔离环境中安全运行。本文带你从零开始,在 Gondolin micro-VM 中跑通 Chromium 无头浏览器,再用 Browser Use Agent 从宿主机远程控制它,全程约 5 分钟。
为什么要在 micro-VM 里跑 Chromium?
AI Agent 操作浏览器时,页面里可能执行任意 JavaScript。如果浏览器直接跑在你的宿主机上,一个恶意的网页就拿到了你的整个环境。
Gondolin 的思路是:浏览器整个装进 micro-VM,宿主机只通过 ingress 网关访问 VM 内的 Chrome DevTools Protocol(CDP)端点。这样 Agent 拥有完整的浏览器能力,却被限制在一台秒级启动、用完即弃的微型虚拟机里。
相关设计理念可以在官方文档中了解更多:docs/workloads.md、docs/ingress.md。
环境准备:安装 Gondolin 与 QEMU
先确认宿主机满足以下要求:
| 平台 | 安装命令 |
|---|---|
| macOS | brew install qemu node |
| Linux (Debian/Ubuntu) | sudo apt install qemu-system-arm nodejs npm |
运行示例脚本还需要uv(Python 包管理器)。克隆仓库后即可在 host/examples/ 找到所有现成示例。
💡 当前运行时验证最完善的架构是 ARM64(Apple Silicon / Linux aarch64)。
一键构建 Chromium 镜像:自定义镜像实战
Gondolin 支持自定义镜像构建,把浏览器及其依赖一次性烤进 rootfs。仓库里已经提供了一个开箱即用的配置:host/examples/chromium.json。
关键内容一览:
- 基于 Alpine 3.23 +
linux-virt内核,架构aarch64 - 安装
chromium、uv、python3、dbus、font-noto等浏览器必需组件 - 通过
init.rootfsInitExtra指定启动脚本 host/examples/chromium-init-extra.sh
这个初始化脚本做了几件"无头环境下让 Chromium 跑起来"的关键事:
- 创建
messagebus系统用户并启动 D-Bus 系统总线(Chromium 依赖它) - 编译 GSettings schemas(APK 包安装时不会自动执行)
- 写入
/etc/chromium/zz-gondolin.conf,预置--headless --no-sandbox --disable-gpu等无头沙箱默认参数
执行构建命令,把镜像打成browser-use:latest标签:
node host/bin/gondolin.ts build \ --config host/examples/chromium.json \ --tag browser-use:latest构建原理(cpio、lz4、e2fsprogs 等依赖)可参考 docs/custom-images.md。
运行 Browser Use Agent:从启动到拿到结果
示例脚本 host/examples/browser-use.ts 完成了整条链路,流程如下:
VM.create()用browser-use:latest镜像启动一台 micro-VMvm.enableIngress()在宿主机开启 HTTP 网关,并把/路由到 VM 内9222端口(CDP)vm.exec()在 VM 内启动 Chromium:
/usr/bin/chromium --headless --no-sandbox \ --remote-debugging-address=127.0.0.1 \ --remote-debugging-port=9222- 宿主机轮询
CDP /json/version接口,等浏览器就绪 - 用
uv run --with browser-use --with openai启动 Agent,把 ingress URL 作为 CDP 地址传入
Agent 的任务很简单:打开 example.com 并返回页面标题,脚本会校验返回结果中是否包含 "Example Domain"。
带上前面的 API Key 即可运行:
OPENAI_API_KEY=... node host/examples/browser-use.ts成功后终端会打印Gondolin Chromium CDP: http://127.0.0.1:xxxxx和Browser Use result: Example Domain,随后 VM 自动关闭——这正是 Gondolin 推荐的"运行 → 持久化结果 → 丢弃 VM"生命周期。
原理解析:Ingress 网关如何安全暴露 CDP
这套方案的安全核心在于 ingress 网关(见 docs/ingress.md):
- 只代理 HTTP,且只连 VM 内回环地址。Chromium 的 CDP 绑定在
127.0.0.1:9222,VM 内的其他端口宿主机根本摸不到 - 网关监听在宿主机的
127.0.0.1随机端口,不对外暴露 - 路由表由宿主机控制(
/etc/gondolin/listeners或代码里的setIngressRoutes),暴露什么完全由你的代码决定 - 用完即关:
ingress.close()+vm.close(),浏览器进程随 VM 一起销毁
换句话说:宿主机拿到的是一个"受控的浏览器遥控器",而不是一个开放的端口转发。
常见问题与下一步
Q:构建镜像很慢/报mke2fs: command not found?缺少构建工具,macOS 执行brew install lz4 e2fsprogs,Linux 执行sudo apt install lz4 cpio e2fsprogs,详见 docs/custom-images.md 的故障排查章节。
Q:CDP 一直等不到就绪?通常是浏览器依赖缺失(如 D-Bus、字体)。检查自定义镜像是否正确执行了 host/examples/chromium-init-extra.sh 中的初始化步骤。
Q:可以换模型或镜像吗?可以。BROWSER_USE_IMAGE环境变量可切换镜像,OPENAI_MODEL可切换模型,见脚本头部注释。
延伸阅读:
- 可编程网络出口与密钥注入:docs/secrets.md
- 快照与磁盘检查点:docs/snapshots.md
- 更多端到端示例(SSH、uv、嵌套 VM):host/examples/
用 Gondolin,你可以把"浏览器 + Agent"这对黄金组合完整锁进一台秒级启动的 micro-VM 里——既能放手让 Agent 干活,又不必为它的不安分买单。
【免费下载链接】gondolinExperimental Linux microvm setup with a TypeScript Control Plane as Agent Sandbox项目地址: https://gitcode.com/gh_mirrors/go/gondolin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考