静看光阴荏苒
不管不顾不问不说也不念

smolvm:为AI智能体打造、可分支的微型虚拟机

如果要运行未知的代码或者让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

赞(0)
未经允许不得转载:荒岛 » smolvm:为AI智能体打造、可分支的微型虚拟机
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

广告合作资源投稿