smolvm:一次秒冷的微 VM 运行器,比容器更隔离、比 QEMU 更轻

2026/06/29 tool open-source · microvm · virtualization · sandbox · CLI 4414 字 · 约 13 分钟 阅读 ...
smolvm 是一个 CLI 工具,跨平台运行微 VM。基于 libkrun VMM,冷启动 <200ms,兼容 OCI 容器镜像,支持 macOS/Linux/Windows,产出 .smolmachine 便携包。面向沙箱执行、开发隔离和可移植工作负载

更新日志:本文基于 smolvm v1.3.1(2026 年 6 月),数据和命令已验证。

smolvm 是什么

smolvm 是一个跨平台的 CLI 工具,让你从终端直接运行轻量级 Linux 虚拟机——冷启动不到 200 毫秒,内存弹性分配,可打包为单一 .smolmachine 文件随身携带。

一句话:比 Docker 容器隔离更强(独立内核),比 QEMU 虚拟机启动更快(<200ms),比 Firecracker 支持更多平台(macOS/Windows)。

项目信息数据
GitHub 仓库https://github.com/smol-machines/smolvm
Stars~4,000
语言Rust(工作空间多 crate 结构)
许可证Apache-2.0
当前版本v1.3.1
平台支持macOS(Apple Silicon + Intel)、Linux x86_64/aarch64、Windows x86_64

安装非常简单:

# macOS + Linux
curl -sSL https://smolmachines.com/install.sh | bash

# Windows:从 GitHub Releases 下载 windows-x86_64 包
# 解压后运行 smolvm.exe,需启用 Windows Hypervisor Platform

解决什么问题

容器不够隔离了

容器共享宿主内核,虽然轻量,但内核漏洞(如 Dirty Pipe、Dirty COW)可以突破 namespace 隔离。smolvm 给每个工作负载一个独立内核,硬件隔离由 Hypervisor.framework(macOS)、KVM(Linux)或 Windows Hypervisor Platform(Windows)保证。

QEMU 太重了

QEMU 启动 15-30 秒,镜像管理复杂,不适合”临时跑一个命令就跑完”的场景。smolvm 冷启动 <200ms,用完即焚,体验像运行本地命令行一样自然。

跨平台便携难

你开发时在 macOS,CI 在 Linux,部署在 Windows——每个平台的虚拟化方案都不一样。smolvm 统一抽象为 smolvm machine run,而且可以把一台完整 VM 打包成 .smolmachine 在任意支持的平台上恢复。

核心工作流

1. 临时代码沙箱

运行一个不可信脚本——默认无网络,隔离在独立 VM 中,执行完自动清理:

smolvm machine run --image alpine -- sh -c "curl --version"
# 网络默认关闭——出站失败

smolvm machine run --net --image alpine -- sh -c "curl --version"
# 有网络就能正常工作

细粒度网络控制:只允许特定出站地址:

smolvm machine run --net --image alpine \
  --allow-host registry.npmjs.org \
  -- wget -q -O /dev/null https://registry.npmjs.org
# 可行——在白名单中

smolvm machine run --net --image alpine \
  --allow-host registry.npmjs.org \
  -- wget -q -O /dev/null https://google.com
# 被拦截——不在白名单中

2. 便携可执行包

把任意工作负载打包为单一可执行文件:

smolvm pack create --image python:3.12-alpine -o ./python312
./python312 run -- python3 --version
# Python 3.12.x — 无需 pyenv/venv/conda,一个二进制搞定

打包后的 .smolmachine 文件包含完整的 VM 状态,在任何支持的平台上重新水合即可运行。这对 CI 环境、离线部署、演示场景特别有用。

3. 传统容器镜像直接启动

smolvm 原生兼容 OCI 容器镜像。--image 可以接受:

  • Docker Hub / ghcr.io 镜像名(拉取直接启动)
  • docker savepodman save 的 tar 归档
  • 本地已经解压的 rootfs 目录
# 从本地构建镜像直接启动——无需 push
docker build -t myapp .
docker save myapp | smolvm machine run --image - -- ./app

# 从归档文件启动——无网络环境也 OK
smolvm machine run --image ./myapp.tar -- ./app

# 从已有 rootfs 目录启动
smolvm machine run --image ./rootfs/ -- ./app

4. 持久化开发 VM

创建、启动、停止、重新启动——已安装的软件包在重启后保留:

smolvm machine create --net --name myvm
smolvm machine start --name myvm
smolvm machine exec --name myvm -- apk add sl
smolvm machine exec --name myvm -it -- /bin/sh
# 在 VM 内:安装的 sl 仍然在
smolvm machine stop --name myvm

5. SSH Agent 转发

把宿主机的 SSH 密钥转发到 VM 内部,但私钥永不进入客户机——超管理器强制隔离:

smolvm machine run --ssh-agent --net --image alpine \
  -- sh -c "apk add -q openssh-client && ssh-add -l"
# 列出宿主机密钥,但无法从 VM 内提取

6. Smolfile 声明环境

用 TOML 文件声明 VM 配置,可复现、可版本控制:

image = "python:3.12-alpine"
net = true

[network]
allow_hosts = ["api.stripe.com", "db.example.com"]

[dev]
init = ["pip install -r requirements.txt"]
volumes = ["./src:/app"]

[auth]
ssh_agent = true
smolvm machine create --name myvm -s Smolfile
smolvm machine start --name myvm

技术架构

smolvm 的工作方式:

  1. 硬件虚拟化层——使用平台原生虚拟化后端:macOS 的 Hypervisor.framework、Linux 的 KVM、Windows 的 Windows Hypervisor Platform(WHP)
  2. VMM(Virtual Machine Monitor)——基于 libkrun,一个库形式的轻量 VMM,无需 QEMU 那样的独立守护进程
  3. 自定义内核——使用 libkrunfw 提供微 VM 专用内核,只包含运行容器化工作负载所需的最小内核模块
  4. 镜像格式——OCI 兼容,可以直接使用 Docker Hub / ghcr.io 上的任何容器镜像,无需额外转换
  5. 弹性内存——通过 virtio balloon 实现内存弹性分配,宿主机只提交 VM 实际使用的内存量,空闲时自动回收

默认配置:4 vCPU、8 GiB 内存,可通过 --cpus--mem 自定义。vCPU 线程在空闲时由超管理器挂起,所以超额分配几乎零开销。

项目结构

smolvm/
├── src/              # 主 CLI 入口
├── crates/
│   ├── smolvm-agent      # VM 内部代理
│   ├── smolvm-network    # 网络层
│   ├── smolvm-pack       # 打包子系统
│   ├── smolvm-protocol   # 宿主机-客户机协议
│   ├── smolvm-registry   # OCI 镜像注册表交互
│   └── smolvm-smolfile   # Smolfile 解析器
└── docs/

与其他方案的对比

smolvm 的 README 自带了一张对比表,非常清晰:

维度smolvmDocker 容器ColimaQEMUFirecrackerKata
隔离性每工作负载独立 VMnamespace(共享内核)namespace(1 个 VM)独立 VM独立 VM每容器 VM
冷启动<200ms~100ms~秒级~15-30s<125ms~500ms
架构库(libkrun)守护进程守护进程(在 VM 中)进程进程运行时栈
每工作负载 VM✗(共享)
macOS native需 Docker VM✔(krunkit)
可嵌入 SDK
便携制品.smolmachine镜像(需守护进程)

这张表揭示的核心差异:

  • Docker——启动最快,但隔离最弱(共享内核)
  • QEMU——功能最全,但启动最慢(15-30 秒)
  • Firecracker——启动最快(<125ms),但只支持 Linux,不适合 macOS 开发机
  • smolvm——在启动速度(200ms)和平台覆盖(三大桌面系统)之间取了最实用的平衡点

适用场景

场景为什么用 smolvm
临时运行不可信代码硬件隔离 + 默认无网络 + 细粒度出站控制
构建便携开发环境.smolmachine 文件跨平台运行,无依赖
CI/CD 任务隔离次秒启动,用完即焚,不污染 CI 宿主机
本地开发与 CI 保持环境一致同一 Smolfile 声明即可复现
短时容器化工作负载比 Docker 隔离更强,比 QEMU 轻,代价适中
无 root 权限的场景OCI 镜像拉取 + libkrun VMM,无需 Docker 守护进程

已知局限

  • 网络默认关闭:需显式 --net 启用,只支持 TCP/UDP,不支持 ICMP
  • 卷挂载:只支持目录,不支持单个文件挂载
  • Windows 功能不全:GPU 加速和 machine fork / 快照尚未支持;pack create 需要宿主机有 mkfs.ext4
  • macOS 签名要求:二进制必须带有 Hypervisor.framework 授权签名
  • GPU 加速复杂:需 libkrun 以 GPU=1 构建,宿主机需安装 virglrenderer + Vulkan 驱动

项目地址

资源链接
GitHub 仓库https://github.com/smol-machines/smolvm
安装脚本https://smolmachines.com/install.sh
开发者文档https://github.com/smol-machines/smolvm/blob/main/docs/DEVELOPMENT.md
Discord 社区https://discord.gg/E5r8rEWY9J
作者@binsquare / @binsquares

参考资料

  • smolvm README:完整文档和示例。→ https://github.com/smol-machines/smolvm
  • libkrun:smolvm 使用的轻量 VMM。→ https://github.com/containers/libkrun
  • libkrunfw:微 VM 自定义内核。→ https://github.com/smol-machines/libkrunfw

文档信息