只要读过任何关于安全运行 AI 生成代码的文章,你就一定见过 microVM 这个词,通常就在 Firecracker 旁边。它往往要么被解释成“轻量级虚拟机”(没错,但没用),要么配一张内核内部结构图。这里是介于两者之间的版本。
两个老方案,以及为什么都不合适
先看 microVM 夹在中间的那两样东西。
容器是你机器上的一组普通进程,内核同意对它们“撒谎”。namespaces 让它们看到自己的文件系统、进程列表和网络;cgroups 限制它们能用多少 CPU 和内存。它在毫秒级启动,因为没有启动任何新东西。但一台宿主机上的所有容器都在和同一个内核对话。只要某个容器内能触及一个内核漏洞,所有容器就都有了出口。
虚拟机自带内核。宿主机的 CPU 借助硬件虚拟化(Linux 上是 KVM),把客户机当作拥有自己电脑一样运行。边界是 hypervisor,它暴露的东西远少于内核的数百个系统调用。代价是笨重。传统虚拟机要模拟一整台 PC:固件、PCI 总线、USB 控制器、显卡,有时还有声卡。它要逐一经过这些才能启动,耗时几秒到几分钟,每个实例还要背负几十到几百 MB 的开销。
一个还算贴切的比喻:容器是同一栋楼里的公寓,共享地基、水管和电线。虚拟机是独栋房子。独栋房子是更安全的邻居,但没人会为一次 20 秒的拜访盖一栋房子。
Firecracker 去掉了什么
Firecracker 是一个 virtual machine monitor(在 KVM 之上创建并运行虚拟机的程序),用 Rust 编写,2018 年开源。它为一件事而生:在共享硬件上运行海量短生命周期、互不信任的工作负载。它主要靠“删东西”做到这一点:
- 没有固件,没有硬件探测。 内核被直接加载到内存并启动。不会有程序去探测并不存在的设备。
- 极小的设备模型。 一张网卡、一个块设备、一个串口控制台以及另外几个,全部是 virtio(专为虚拟机设计的设备,而不是对物理设备的模仿)。没有 USB,没有图形,没有 PCI。
- 小而内存安全的代码库。 模拟设备的代码越少,能让客户机触及宿主机的漏洞藏身之处就越少。
- 给 VMM 本身也加了一道牢笼。 每个 Firecracker 进程都运行在 chroot 中,用 seccomp 过滤器限制它自己的系统调用,用 cgroups 限制它的资源。即使真有东西突破了客户机,它也只会落进笼子里,而不是宿主机上。
项目官方公布的数字是:最快 125 毫秒进入用户空间,每个 microVM 内存开销不到 5 MiB。这些是最理想的实验室数据;一个真实的沙箱还需要准备好磁盘和网络,并让里面的代理就绪以接收命令,所以我们的沙箱大约一秒就绪。这仍然足够接近容器的速度,让你可以为每个任务创建一个,用完即丢。
容器与 microVM 的实际对比
| 容器 | Firecracker microVM | |
|---|---|---|
| 内核 | 与宿主机共享 | 独立内核 |
| 与宿主机的边界 | 对共享内核的系统调用 | hypervisor + 小型 VMM |
| 启动时间 | 毫秒级 | 约 0.1–1 秒 |
| 每个实例的开销 | 非常小 | 几 MiB |
| 设备 | 宿主机暴露什么就有什么 | 网络、磁盘、控制台 |
| GPU | 可以 | 不可以 |
| 适用于 | 可信代码、应用打包 | 不可信代码、多租户工作负载 |
关键的是第二行。对于容器,“这段代码能逃逸吗?”这个问题变成了“宿主机内核里是否存在可触及的漏洞?”。对于 microVM,它变成了“hypervisor 或少数几个虚拟设备里是否有漏洞?”。后者的攻击面小得多,而这正是云平台为自身多租户托管早已在防守的那一面。
你需要付出什么
microVM 并不是免费的升级。
- 没有 GPU,也没有显示器。 它用于运行代码,不适合桌面或图形工作负载。
- 设备更少,灵活性更低。 任何依赖真实硬件或一长串内核模块的东西,都不会用得顺手。
- 边界仍然需要策略。 出站流量不受限的 microVM 仍可能发出你不想要的流量;放了你 API 密钥的 microVM 仍可能把它们泄露出去。隔离保护的是宿主机不受客户机侵害,而不是保护你的密钥不被你交给它们的代码拿走。
我们的沙箱如何使用它
每个 EQVPS 沙箱都是一个拥有独立内核的 Firecracker microVM,规格从 0.25 vCPU、512 MB 到 8 vCPU、16 GB。它预装 Python 3.12、Node.js 22、bash、git 和 curl,可以访问出站互联网,没有入站端口。临时沙箱在你用完后被删除;persistent 沙箱保留磁盘,暂停时会把 microVM 的快照写入磁盘,因此在恢复之前不产生任何费用。暂停快照保留 14 天。 之后沙箱被删除,其 id 返回 410 sandbox_deleted。
我们选择 microVM 而不是容器,原因只有一个:在沙箱里运行的代码,按设计就是没人审查过的代码。AI 智能体的输出、陌生人的 pull request、一个包含上千个模型编写程序的基准测试。对于这些,独立内核才是值得付费的边界。我们在它周围搭建的细节——套餐、配额、同步命令 55 秒的限制——见沙箱文档。
如果你想更深入地把这种边界与其他方案比较,运行不可信代码的隔离级别把进程、容器、microVM 和完整虚拟机放在一起对比。如果吸引你的是按秒的价格,按秒计费到底如何计算给出了算术过程。
评论
暂无评论。来做第一个吧。