MicroVM
定义
MicroVM(微型虚拟机)是虚拟机的一个子集:它仍然由 hypervisor 运行一份独立的客户机内核,因此与宿主内核分离;但它只模拟少量 virtio 设备,不提供完整 PC 硬件兼容性。目标是在保留硬件隔离的前提下,把冷启动和内存开销降到接近容器的量级。
Firecracker 与 libkrun 是这一类实现的代表。Box 的默认执行路径通过 libkrun 管理专用内核 MicroVM。
问题背景
共享内核容器无法回答「内核被攻破之后怎么办」。完整虚拟机可以回答,但为了兼容任意客户机操作系统,往往模拟大量设备,启动慢、攻击面也大。MicroVM 把问题收窄为:客户机是已知的 Linux,设备只需要网卡、块设备、串口与少量文件系统通道。于是可以用硬件虚拟化换隔离,用裁剪换速度。
机制说明
启动时发生的事情
一次 Box MicroVM 启动可以抽象为:
- 产品层准备 rootfs 与
InstanceSpec(vCPU、内存、根设备、共享目录); LocalExecutionManager选择BoxVm路由,调用vm_backend;- 运行时拉起独立进程
a3s-box-shim; - shim 调用 libkrun,进入客户机;
- 客户机 PID
1(
a3s-box-guest-init)挂载必要文件系统、配置网络、启动入口进程; - 宿主通过 vsock 与 init 提供的 exec / PTY / 证明 / 端口转发服务通信。
第 3 步必须是独立进程:libkrun 的 krun_start_enter()
会接管当前进程。若在 CLI 进程内直接调用,CLI 将被客户机替换。
与「普通容器」的观察差异
在 MicroVM 内执行
uname -r,得到的是客户机内核版本,不是宿主的。/proc、/sys
也来自客户机内核。宿主上的进程列表看不到客户机内部的 PID,只能看到 shim
与 hypervisor 相关进程。这些都是「独立内核」的直接后果。
仅 VM 拥有的能力
Box 将下列能力标为仅 VM:TEE、warm pool、在合格 Linux/KVM 上的 snapshot-fork。Sandbox 路径对这些请求直接拒绝。原因是它们依赖虚拟机监视器或客户机内存快照,无法在共享内核模型中保持相同语义。
在 Box 中的位置
- 规格类型:
src/core/src/vmm.rs。 - 后端与启动:
src/runtime/src/local_execution/vm_backend.rs、src/runtime/src/vm/。 - shim:
src/shim/。 - 客户机 init:
src/guest/init/。 - 平台:Linux/KVM 为主要路径;Apple Silicon/HVF 已具备打包与恢复门;Windows x86_64/WHPX 有 soak 证据,但限制为一 vCPU,且无交互 PTY、桥接网络、TEE、snapshot-fork 或 CRI。
验证命令
a3s-box run --rm alpine:3.20 -- sh -lc 'uname -r; cat /proc/1/comm' |
/proc/1/comm 在客户机内应指向 guest init
或入口进程管理链,而不是宿主的 systemd。对比
--isolation sandbox 下的同一检查,差别即隔离级别。
相关与易混
- 相关:KVM / HVF / WHPX 与 libkrun、vsock 与 virtio-fs、隔离级别对比
- 易混:MicroVM 不是「加了更多 namespace 的容器」。没有第二份内核,就不能称为 MicroVM。它也不是完整桌面虚拟机:没有虚拟显卡与完整 BIOS 兼容并不是缺陷,而是设计范围。