返回资讯中心
外部精选
软件工程
#开发者实时流

FastVM 发布:空闲自动休眠、收包唤醒的微虚拟机沙箱运行时

来源标题:Show HN: FastVM – MicroVMs that sleep on idle and wake when packets arrive

基于 Firecracker/KVM 的 Go 微虚拟机沙箱运行时 FastVM 发布,沙箱约 100 毫秒启动,空闲时自动休眠并将内存换出到磁盘,收到网络包后自动唤醒。作者称 v0.1 核心功能已在 KVM 上端到端测试通过,eBPF L2 交换机后端已单独实现但尚未接入守护进程。

Hacker News 最新tuananh2026/11/7 · 5 天前13 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

一个单主机 micro-VM 沙箱运行时:沙箱约 100 ms 内启动,空闲时自行休眠,将内存页写入磁盘,并在数据包到达时自动唤醒——此时帧已经排入 guest 自己的 virtio-net 路径队列中。

fastvm 基于 Firecracker/KVM 用 Go 实现。设计文档见 GOAL.md;完整的逐步操作指南见 GETTING_STARTED.md。

状态:v0.1 核心功能已实现,并在 KVM 上完成端到端测试。已可用的功能包括:Dockerfile→ext4 基础磁盘、copy/reflink CoW 卷、通过 vsock 与 guest agent 通信的真实 Firecracker 启动、pause/dormant(内存文件)/wake、空闲判定与自动休眠、HTTP API + CLI,以及带网络唤醒的 Linux bridge L2 数据平面。eBPF L2 交换机后端已实现并单独测试通过,但尚未接入 daemon(见已知限制)。真实 VM 的 e2e 测试套件可在数秒内通过;见下方测试矩阵。

快速 VM——每个沙箱一个 Firecracker microVM。

Dockerfile 镜像——fastvm build 将 Dockerfile 转换为内容寻址的 ext4 基础磁盘(BuildKit/docker → rootfs → ext4)。

CoW 运行时卷——每个沙箱获得一个从基础盘克隆的可写卷,克隆在毫秒级完成(可用时使用 reflink,否则回退到复制)。

自管理生命周期——防抖的空闲判定(网络 + exec/API + 块 I/O + CPU)将沙箱从 Running → Idle → Paused → Dormant 迁移;无需手动停止。

暂停 / 恢复——暂停的 VM 保持其 virtio-net 队列活跃;休眠的 VM 将 guest RAM 交给 Firecracker 内存文件(mmap 恢复),并保持 VMM 和设备队列存活,因此传入的数据包会被排队并在唤醒时被消费。

L2 网络——每主机一个 Linux bridge,带 AF_PACKET 唤醒检测和 nftables DNAT。eBPF L2 交换机后端(tc、静态 MAC→端口转发、每端口隔离/防欺骗、计数器、ringbuf 唤醒事件)已实现并单独验证,但尚未接入 TAP/bridge 拓扑(见已知限制)。

需求

Linux x86_64,支持 KVM(可访问 /dev/kvm)。

Firecracker v1.10+(已测试 v1.17)。

构建需要 Go 1.24+。

TAP/bridge/nftables 需要 root / CAP_NET_ADMIN(启动沙箱和发布端口时必需)。daemon 始终使用 Linux bridge 作为数据平面和唤醒检测;CAP_BPF 仅在运行独立的 eBPF 后端测试时需要。

可选:docker/BuildKit 用于 fastvm build,clang/llc/bpftool 用于 eBPF 交换机,e2fsprogs 用于基础磁盘。

构建

make build # bin/fastvm, bin/fastvmd, bin/fastvm-agent make test # 单元测试(干净地跳过特权/门控测试) make test-race # 在竞态检测器下运行单元测试 make assets # 下载 e2e 测试所需的内核 + alpine rootfs make e2e # 真实 Firecracker 启动/暂停/休眠/唤醒 e2e

快速开始

完整操作指南(构建、配置、镜像、沙箱、网络唤醒):GETTING_STARTED.md。

最快演示——构建一个沙箱,让其自动休眠,用 curl 唤醒它(需要 root + docker + make assets):

make build && make assets sudo make demo # 等同于:sudo ./hack/demo-wake.sh

或者用已检入的演示配置启动 daemon,自行驱动:

sudo -s # 以 root 运行 daemon 和 CLI cd /path/to/fastvm bin/fastvmd -config hack/config.yaml & export FASTVM_SOCKET=/run/fastvm/fastvm.sock make image # 构建 hack/Dockerfile.example -> demo:latest bin/fastvm run --image demo:latest --name web --publish 8080:80 --
/bin/sh -c 'echo hello > /tmp/index.html; exec /bin/busybox httpd -f -p 0.0.0.0:80 -h /tmp' bin/fastvm ls bin/fastvm exec web -- /bin/sh -c 'echo hello' bin/fastvm sleep web --deep # 暂停并将 guest RAM 卸载到磁盘 bin/fastvm wake web bin/fastvm rm web

hack/config.yaml 使用 /tmp 状态和较短的空闲窗口用于演示;真实安装时将其复制到 /etc/fastvm/config.yaml 并使用 /var/lib/fastvm 路径。

daemon API 是基于 unix socket 的 HTTP/JSON(默认 /run/fastvm/fastvm.sock);fastvm 是一个轻量客户端。设置 FASTVM_SOCKET 或 -socket 可将 CLI 指向另一个 socket。

完整 schema 见 internal/config/config.go。默认值遵循 GOAL.md §5.4:

data_dir: /var/lib/fastvm kernel_path: /var/lib/fastvm/kernels/vmlinux agent_path: /var/lib/fastvm/agent/fastvm-agent lifecycle: idle_window: 30s pause_after: 2m offload_after: 10m destroy_after: 24h on_workload_exit: idle idle: cpu_threshold_pct: 1.0 cpu_wake_pct: 5.0 block_io_bytes: 65536 keepalive_aware: true memory: offload_mode: file # file | uffd | swap | never wake: max_wakes_per_minute: 6 coalesce_window: 100ms volume: cow: reflink # reflink | dm-thin | copy switch: mode: ebpf # ebpf | bridge

测试

make test # 单元测试(无需 KVM/root) make test-race # 竞态检测器 make assets # e2e 所需的内核 + alpine rootfs FASTVM_E2E=1 go test -count=1 ./test/e2e/... ./internal/vmm/firecracker/... FASTVM_NET_TESTS=1 go test -count=1 ./internal/network/... # TAP/bridge/nft FASTVM_DOCKER_TESTS=1 go test -count=1 ./internal/image/... # Dockerfile 构建

开发过程中如何验证 e2e 套件:

当 /dev/kvm、Firecracker、docker 或下载的资源缺失时,e2e 测试会干净地跳过。网络测试会建立自己的隔离命名空间,当主机不允许时跳过。eBPF 加载/挂载测试仅在拥有 CAP_BPF 时运行;否则 daemon 会记录回退日志并使用 Linux bridge。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →