更新日志:本文基于 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 save或podman 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 的工作方式:
- 硬件虚拟化层——使用平台原生虚拟化后端:macOS 的 Hypervisor.framework、Linux 的 KVM、Windows 的 Windows Hypervisor Platform(WHP)
- VMM(Virtual Machine Monitor)——基于 libkrun,一个库形式的轻量 VMM,无需 QEMU 那样的独立守护进程
- 自定义内核——使用 libkrunfw 提供微 VM 专用内核,只包含运行容器化工作负载所需的最小内核模块
- 镜像格式——OCI 兼容,可以直接使用 Docker Hub / ghcr.io 上的任何容器镜像,无需额外转换
- 弹性内存——通过 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 自带了一张对比表,非常清晰:
| 维度 | smolvm | Docker 容器 | Colima | QEMU | Firecracker | Kata |
|---|---|---|---|---|---|---|
| 隔离性 | 每工作负载独立 VM | namespace(共享内核) | 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
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/tool/smolvm.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)