
smolvm v1.15.0
一个可嵌入、可移植、可分支的虚拟机,用于在本地安全运行 Agents。
smolvm
面向 AI 智能体的可分支 microVM。 将轻量级虚拟机嵌入你的软件、便携式开发环境和本地沙箱中。
安装
curl -sSL https://smolmachines.com/install.sh | bash # macOS + Linux
Windows:解压 windows-x86_64 release 并运行 smolvm.exe(需要 Windows Hypervisor Platform)。编码智能体:安装后运行 smolvm --help 以了解所有命令。
快速开始
smolvm machine run --net --image alpine -- uname -a # 一次性 VM,退出时删除
smolvm machine run --net -it --image alpine -- /bin/sh # 交互式 shell
本地
真正的虚拟机,拥有自己的内核,在你的笔记本电脑或你自己的服务器上免费使用。它们在一秒内启动,内存是弹性的,因此宿主机只提交客户机实际使用的部分。机器在重启后仍然存在,任何 OCI 镜像都可以使用,包括你本地构建的镜像。
smolvm machine create --net --name dev && smolvm machine start --name dev
smolvm machine exec --name dev -- apk add git
docker save myapp | smolvm machine run --image - -- ./app # 本地镜像,无需 registry
在 Smolfile 中声明机器:镜像、资源、端口、挂载和网络策略都在一个签入的文件中。
可嵌入
使用一个 Machine API 从你自己的代码中驱动机器。SDK 在你的进程中运行,无需守护进程,可在本地或 smol cloud 上运行。
npm install smolmachines # Node / TypeScript
pip install smolmachines # Python
cargo add smolmachines # Rust
import { Machine } from 'smolmachines';
const m = await Machine.create({ image: 'python:3.12-alpine', network: true });
const r = await m.exec(['python3', '-c', 'print(2 ** 10)']);
console.log(r.stdout); // 1024
await m.delete();
源码和文档:smol-machines/smol · smolmachines.com/docs/sdk
可分支
在执行过程中保存正在运行的机器,将其回退,或将其分支为从同一点继续运行的副本。检查点捕获 RAM、CPU 状态和磁盘;分支是活动机器的写时复制子级。
smolvm machine create --net --name agent --image alpine
smolvm machine start --name agent --branchable
smolvm machine branch --from agent --name try-1 # 活动写时复制子级
smolvm machine checkpoint --name agent -o agent.checkpoint # 保存它,包括进程等所有内容
smolvm machine create --name agent2 --from agent.checkpoint # 稍后或在其他地方恢复
使用 --from <checkpoint> --at '~N' 回退到更早的世代(参见 machine checkpoint-log),并使用暂停和恢复在不丢失执行的情况下停止。更多内容见分支和增量检查点。
可移植
将机器(无论你如何设置)打包成一个 .smolmachine 文件。将其推送到任何 OCI registry,或将其作为自包含可执行文件运行,在 200 毫秒内启动,无需安装任何东西。
smolvm machine stop --name dev && smolvm pack create --from-vm dev -o dev
smolvm pack push --file dev.smolmachine ghcr.io/you/dev:v1
smolvm pack create --image python:3.12-alpine -o ./python312
./python312 run -- python3 --version
检查点也是可移植的:在另一台主机或 smol cloud 上恢复一个检查点。
安全
每个工作负载都获得一个硬件隔离的 VM,拥有自己的内核。网络默认关闭,出口可以限制为指定的主机,代码可以使用凭据而无需读取它。
安全是共同的责任。smolvm 提供边界:每个工作负载都有独立的 VM 和内核,除非你允许,否则没有任何东西能到达宿主机。你决定什么可以跨越这个边界。你挂载的每个文件夹、打开的每个端口、允许的每个主机,以及转发的每个密钥或 SSH 代理,都会成为工作负载可以使用的东西,因此只给不受信任的工作负载它需要的东西。
smolvm machine run --net --image alpine --allow-host registry.npmjs.org -- wget -qO- https://google.com # 被阻止
smolvm machine run --net --image alpine --allow-host-pattern registry.npmjs.org -- wget -qO- https://registry.npmjs.org # 仅精确主机
NOTION_API_KEY=secret_… smolvm machine run --net --image alpine \
--credential [email protected] -- sh -c 'echo $NOTION_API_KEY' # 一个占位符
参见凭据替换和安全模型。
使用 --allow-host-pattern '*.example.com' 仅允许子域名。较旧的
--allow-host example.com 继续允许顶级域名和子域名。
已停止机器的允许列表可以通过 smolvm machine update 更改
(--allow-host、--allow-host-pattern、--allow-cidr 及其 --remove- 形式)。
工作原理
每个工作负载都在一个硬件虚拟化的 VM 中运行,拥有自己的客户机内核,基于 Hypervisor.framework(macOS)、KVM(Linux)或 Windows Hypervisor Platform(Windows)。libkrun 是 VMM,libkrunfw 提供客户机内核。镜像使用 OCI 格式,因此 Docker Hub、ghcr.io 或其他 registry 上的任何内容都可以作为 microVM 启动,无需 Docker 守护进程。
默认值:4 个 vCPU,8 GiB RAM。内存通过 virtio balloon 弹性伸缩,空闲 vCPU 在 hypervisor 中休眠,因此过度配置几乎没有成本。使用 --cpus 和 --mem 覆盖。
对比
| smolvm | 容器 | Colima | QEMU | Firecracker | Kata | |
|---|---|---|---|---|---|---|
| 工作负载边界 | VM + 客户机内核 | 命名空间 + 共享内核 | 共享 VM 内的命名空间 | VM + 客户机内核 | VM + 客户机内核 | 每个容器一个 VM |
| 启动时间 | <200ms | ~100ms | ~秒 | ~15-30s | <125ms | ~500ms |
| 架构 | 库 (libkrun) | 守护进程 | 守护进程(在 VM 中) | 进程 | 进程 | 运行时栈 |
| 每个工作负载的 VM | 是 | 否 | 否(共享) | 是 | 是 | 是 |
| macOS 原生 | 是 | 通过 Docker VM | 是(krunkit) | 是 | 否 | 否 |
| 可嵌入 SDK | 是 | 否 | 否 | 否 | 否 | 否 |
| 可移植产物 | .smolmachine | 镜像(需要守护进程) | 否 | 否 | 否 | 否 |
平台支持
| 宿主机 | 客户机 | 要求 |
|---|---|---|
| macOS Apple Silicon | arm64 Linux | macOS 11+ |
| macOS Intel | x86_64 Linux | macOS 11+(未测试) |
| Linux x86_64 | x86_64 Linux | KVM (/dev/kvm) |
| Linux aarch64 | aarch64 Linux | KVM (/dev/kvm) |
| Windows x86_64 | x86_64 Linux | 启用 Windows Hypervisor Platform (WHP) |
Windows 支持可移植检查点、暂停/恢复,以及使用 --freeze-source 的分支。GPU 加速仍然不可用;参见已知限制。
更多
- Kubernetes:通过
RuntimeClass将 pod 作为 microVM 运行。 - GPU 和 CUDA:通过 virtio-gpu / Venus 使用 Vulkan,以及 CUDA API 远程调用。
- 示例:python、node、docker-in-vm、local-llm、headless-browser、doom。
- 开发 · 用户文档位于 smolmachines.com/docs,用 smol-machines/docs 编写(欢迎在那里提出更正;运行时 bug 留在这里)。
Apache-2.0 · 由 @binsquare 制作 · twitter · github