如果要运行未知的代码或者让Coding Agent做一些高风险的操作,怕污染宿主机、把宿主机搞坏,这个项目就非常适合了。你可以通过一段提示词或者skill让Coding Agent在smolvm虚拟机内操作。
让Coding Agent在smolvm虚拟机内操作,可以理解为两种食用方式:一种是直接将Coding Agent安装在smolvm虚拟机,还有一种是Coding Agent安装在宿主机,让它从宿主机控制虚拟机。我更倾向于后者这种方式。
安装smolvm:
echo 'deb [trusted=yes] https://smol-machines.github.io/smolvm/apt ./' \
| sudo tee /etc/apt/sources.list.d/smolvm.list
sudo apt update
sudo apt install smolvm
初次使用可能会遇到这个问题:start machine: kvm permission denied: Cannot access /dev/kvm (permission denied) 将当前用户添加到kvm组:
sudo usermod -aG kvm "$USER"
建议在执行usermod后,退出SSH重新登录,让组权限生效,如果你要让当前的shell立即生效:
newgrp kvm
用这个命令立即生效可能会有副作用:在这个shell中新建的文件会归kvm组。如果想保持原来的主组,同时获得KVM权限,退出SSH,再重新登录即可。
# 创建机器;sleep infinity让环境持续运行
smolvm machine create \
--name ubuntu \
--image ubuntu:24.04 \
--cpus 2 \
--mem 2048 \
--net \
-- sleep infinity
# 启动机器,首次需要下载镜像
smolvm machine start --name ubuntu
# 进入 Ubuntu 终端
smolvm machine exec --name ubuntu -it -- /bin/bash
#输入 exit 退出终端,机器仍会继续运行。以后重新进入
smolvm machine exec --name ubuntu -it -- /bin/bash
这里的ubuntu:24.04是精简的OCI镜像。smolvm启动自己的Linux内核和管理进程,再运行镜像里的工作负载;我们指定的工作负载是sleep infinity,用来保持环境运行,也就是说这个系统内没有systemd。
如果你需要使用支持systemd的系统,可以用这个第三方维护的镜像:
# 不要在创建命令后加-- sleep infinity让它使用镜像默认的systemd启动命令
smolvm machine create \
--name ubuntu-systemd \
--image docker.io/jrei/systemd-ubuntu:24.04 \
--cpus 2 \
--mem 2048 \
--net
# 启动机器,首次需要下载镜像
smolvm machine start --name ubuntu-systemd
# 进入 Ubuntu 终端
smolvm machine exec --name ubuntu-systemd -it -- /bin/bash
数据保存在宿主机磁盘上,可以用命令查询任意机器的数据目录:
smolvm machine data-dir --name ubuntu-systemd
配置端口转发。端口转发的格式是“宿主机端口:虚拟机端口”。例如:
8080:80:访问宿主机的8080,转到虚拟机的80端口。
2222:22:访问宿主机的2222,转到虚拟机的22端口。
具体配置:
# 停止虚拟机
smolvm machine stop --name ubuntu-systemd
# 添加端口转发:
smolvm machine update --name ubuntu-systemd \
-p 8080:80 \
-p 2222:22
# UDP映射加/udp即可,例如停机后添加:
smolvm machine update --name ubuntu-systemd -p 27015:27015/udp
# 删除端口转发:
smolvm machine update --name ubuntu-systemd --remove-port 8080:80
# 允许其他电脑通过宿主机IP访问映射端口
SMOLVM_PUBLISH_ADDR=0.0.0.0 \
smolvm machine start --name ubuntu-systemd
# 查看配置
smolvm machine status --name ubuntu-systemd
如果不配置SMOLVM_PUBLISH_ADDR=0.0.0.0则默认使用127.0.0.1,也就是说只有宿主机自己能访问虚拟机,如果你的宿主机是一台远程服务器,那么你本地是访问不了的,在这种情况下必须配置SMOLVM_PUBLISH_ADDR=0.0.0.0,你才可以通过宿主机的公网IP访问到虚拟机内的服务。
smolvm有两种主要网络方式:
TSI:不创建普通虚拟网卡,通过宿主机代为完成TCP/UDP通信。因此可以上网,但看不到eth0。也就是虚拟机内只有lo和dummy0。
virtio-net:提供虚拟网卡,流量经过宿主机上的smolvm网络栈转发,虚拟机内存在eth0。
未明确指定后端时,普通CLI创建的、只需要出站联网的机器通常选择TSI;设置了SMOLVM_PUBLISH_ADDR、配置了端口映射或加入命名网络等情况,会默认选择virtio-net。
如果你希望两台机器通过不同IP能够互相访问,则需要加入同一个命名网络。新建时这样配置:
smolvm machine create --name ubuntu-a \
--image docker.io/jrei/systemd-ubuntu:24.04 \
--cpus 2 --mem 2048 --network lab
smolvm machine create --name ubuntu-b \
--image docker.io/jrei/systemd-ubuntu:24.04 \
--cpus 2 --mem 2048 --network lab
smolvm machine start --name ubuntu-a
smolvm machine start --name ubuntu-b
同一命名网络内会分配不同的100.96.N.2地址,并支持按IP互通;地址可能随停止、启动变化,目前没有自动的机器名解析。
配置虚拟机的磁盘容量,这里要区分两个参数:
--storage:默认20GB,保存OCI镜像层、镜像工作负载的持久化修改以及/workspace等数据。
--overlay:默认10GB,用于smolvm基础系统根文件系统的持久化写入层。
对于用OCI镜像创建的Ubuntu,安装软件、写入/home、/var等普通目录所需的空间,主要看–storage。不要把两个容量简单相加,理解成一个 Ubuntu根分区。创建时,例如配置80GB存储:
smolvm machine create \
--name ubuntu-big \
--image docker.io/jrei/systemd-ubuntu:24.04 \
--cpus 2 \
--mem 2048 \
--storage 80 \
--overlay 10 \
--net
已有的虚拟机例如:ubuntu-systemd,是不需要重新创建的,可以直接扩容,虚拟机无需停机,使用:
smolvm machine resize --name ubuntu-systemd --storage 80
这里的80是扩容后的总容量,不是再增加80GB。在线扩容要求运行时支持,如果提示不支持可以停机扩容。
平时我们也不需要了解太多的东西,记住一些常用的操作命令就行了:
# 停止机器
smolvm machine stop --name ubuntu
# 再次启动
smolvm machine start --name ubuntu
# 删除机器
smolvm machine delete --name ubuntu
让Coding Agent把这些约定写进项目根目录的AGENTS.md:
本项目使用 smolvm 作为开发执行环境,请完成环境准备后再开始开发。
要求:
1. 先检查项目技术栈、现有 AGENTS.md 和宿主机 smolvm 的状态。
2. 为当前项目创建或复用专用虚拟机,不使用其他项目的机器。
3. 根据项目选择合适的镜像,配置合适的虚拟机磁盘容量。
4. 代码可以通过当前工作区直接修改;依赖安装、项目脚本、
格式检查、构建、测试及开发服务都在虚拟机内执行。
5. 宿主机仅执行项目文件操作、Git 和 smolvm 管理命令。
6. 需要预览时选择空闲的宿主机端口;服务在虚拟机内监听
0.0.0.0,映射端口默认只供宿主机本机访问。
7. 如果虚拟机执行遇到问题,先排查,不要自动退回宿主机
安装依赖或运行项目。
8. 将机器名称、镜像、挂载、端口和常用命令记录到项目中,
让后续会话可以继续使用。完成后保留开发环境和数据。
官方也提供了很多skill:https://github.com/smol-machines/smolvm/blob/main/docs/llms.txt
荒岛


















