MicroVM

定义

MicroVM(微型虚拟机)是虚拟机的一个子集:它仍然由 hypervisor 运行一份独立的客户机内核,因此与宿主内核分离;但它只模拟少量 virtio 设备,不提供完整 PC 硬件兼容性。目标是在保留硬件隔离的前提下,把冷启动和内存开销降到接近容器的量级。

Firecracker 与 libkrun 是这一类实现的代表。Box 的默认执行路径通过 libkrun 管理专用内核 MicroVM。

问题背景

共享内核容器无法回答「内核被攻破之后怎么办」。完整虚拟机可以回答,但为了兼容任意客户机操作系统,往往模拟大量设备,启动慢、攻击面也大。MicroVM 把问题收窄为:客户机是已知的 Linux,设备只需要网卡、块设备、串口与少量文件系统通道。于是可以用硬件虚拟化换隔离,用裁剪换速度。

机制说明

启动时发生的事情

一次 Box MicroVM 启动可以抽象为:

  1. 产品层准备 rootfsInstanceSpec(vCPU、内存、根设备、共享目录);
  2. LocalExecutionManager 选择 BoxVm 路由,调用 vm_backend
  3. 运行时拉起独立进程 a3s-box-shim
  4. shim 调用 libkrun,进入客户机;
  5. 客户机 PID 1(a3s-box-guest-init)挂载必要文件系统、配置网络、启动入口进程;
  6. 宿主通过 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.rssrc/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 下的同一检查,差别即隔离级别。

相关与易混