Firecracker 的诞生故事 - 支撑 Lambda 和 Fargate 的微型 VM 为何被创造

介绍 AWS 为 Lambda 和 Fargate 自主开发的微型 VM 监控器 Firecracker 的设计理念、与传统虚拟化技术的区别、125ms 启动的轻量化秘密以及开源化的战略意图。

Lambda 早期架构面临的问题

2014 年 Lambda 发布之初,函数的执行环境使用了容器技术。这是一种利用 Linux 的 cgroups 和 namespaces 隔离函数的方式。这种方式启动快速且高效,但存在安全隐患。由于容器共享内核,如果内核漏洞被利用,就可能从一个函数访问其他客户的函数。对于在同一物理主机上运行数百万客户函数的多租户环境 Lambda 而言,这种隔离的薄弱是根本性风险。使用传统虚拟机 (VM) 可以获得硬件级别的隔离,但 VM 启动需要数十秒,内存开销也很大,不适合 Lambda 这种毫秒级计费模型。AWS 需要的是同时实现「VM 级别的安全隔离」和「容器级别的启动速度和轻量性」的技术。由于市场上不存在满足此要求的产品,AWS 决定自行开发。

Firecracker 的设计理念 - 极简之美

Firecracker 是 2018 年发布的基于 KVM (Kernel-based Virtual Machine) 的微型 VM 监控器 (VMM)。使用 Rust 编写,由约 5 万行代码组成。与拥有数百万行代码的 QEMU(传统通用 VMM)相比,Firecracker 的代码库小了几个数量级。这种小巧是有意为之的设计决策。Firecracker 按照「仅提供运行无服务器工作负载所需的最少功能」的方针设计。GPU 直通、USB 设备支持、图形控制台、实时迁移等通用 VM 所需的功能全部被省略。模拟的设备仅有 virtio-net(网络)、virtio-block(块存储)、串行控制台和最小限度的 i8042 键盘控制器。这种彻底的精简使攻击面 (Attack Surface) 极小,提高了安全性。代码越少,Bug 越少,审计也更容易。

125ms 启动的秘密

Firecracker 的微型 VM 可在 125ms 以内启动。实现这一速度的因素有多个。第一,最小限度的设备模拟。QEMU 模拟 BIOS、PCI 总线、USB 控制器等众多设备,而 Firecracker 全部省略了这些。Guest OS 的内核只需识别 Firecracker 提供的最少设备,因此内核初始化非常快速。第二,使用定制内核。Lambda 的执行环境使用的不是通用 Linux 内核,而是去除了不必要驱动和子系统的定制内核。内核本身的启动时间得到缩短。第三,最小化内存开销。Firecracker 进程本身的内存使用量约为 5MB,与 QEMU 的数十到数百 MB 相比小了几个数量级。这使得在一台物理主机上可同时运行数千个微型 VM。当 Lambda 为一个函数分配 128MB 内存时,如果 VMM 开销为 5MB 则约为 4% 的开销,而 QEMU 的 100MB 则约为 44% 的开销。在大规模多租户环境中,这一差异直接转化为巨大的成本差异。

jailer - 安全的纵深防御

Firecracker 的安全模型不仅依赖微型 VM 的隔离。名为 jailer 的组件进一步隔离 Firecracker 进程本身。jailer 将 Firecracker 进程限制在 chroot 环境中,通过 seccomp-bpf 过滤系统调用,通过 cgroups 限制资源使用量。也就是说,即使成功从微型 VM 逃逸(从 Guest OS 逃到 Host OS),攻击者仍被限制在 jailer 的约束内。这种纵深防御 (Defense in Depth) 设计保证了即使单一防御层被突破,整体安全性仍然得以维持。Firecracker 允许的系统调用被限制在约 30 个,Linux 内核提供的 300 多个系统调用的大部分被阻止。这种严格的过滤使利用内核漏洞的大部分攻击失效。AWS 以「不信任 Guest OS」为前提设计 Firecracker 的安全模型,目标是即使恶意代码在 Guest OS 内执行,也不会影响 Host OS 或其他微型 VM。

开源化的战略意图

AWS 于 2018 年以 Apache 2.0 许可证将 Firecracker 开源。将 AWS 核心技术开源的这一决定有多重战略意图。第一,安全透明性。Firecracker 是安全关键组件,公开代码可接受外部研究人员的安全审计。实际上,开源后收到了外部研究人员的多项安全改进建议。第二,生态系统扩展。Firecracker 可在 AWS 以外的环境使用,Fly.io、Koyeb 等云平台已采用 Firecracker。Firecracker 生态系统的扩大意味着在 Firecracker 上运行的工作负载增加,最终使向 AWS 的迁移更加容易。第三,人才招聘。将 Firecracker 这样的前沿技术以开源形式公开,是吸引优秀系统程序员的强大招聘工具。Firecracker 使用 Rust 编写,在 Rust 社区中也备受关注。Firecracker 的 GitHub 仓库获得了超过 2 万颗星,是 AWS 开源项目中最成功的案例之一。 如需深入理解虚拟化技术的设计理念,可参考专业书籍 (Amazon)