文章

AI - OpenClaw-隔离部署练习

AI - OpenClaw-隔离部署练习

使用 Firecracker 实现 OpenClaw 的微虚拟机(MicroVM)级别隔离

假设10个,100个,,,无数个claw(类似OpenClaw)应用互相隔离要怎么合理利用资源。

设备支持检查

  • 系统
1
2
uname -a
Linux raha-0001 6.1.0-35-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.137-1 (2025-05-07) x86_64 GNU/Linux
  • 虚拟化检查
1
2
3
4
5
6
7
8
9
10
11
12
13
egrep -c '(vmx|svm)' /proc/cpuinfo
#输出 数字

# 其他
# lsmod | grep kvm
# zgrep -i kvm /boot/config-$(uname -r)
# modprobe kvm
# modprobe kvm-intel
# ls /dev/kvm
#
# 安装虚拟化工具
# apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
# apt install -y libguestfs-tools

构建 MicroVM 镜像

1
2
3
4
5
6
#获取一个最小化的 Ubuntu 服务器镜像。

mkdir -p ~/openclaw-vm-images
cd ~/openclaw-vm-images
curl -O https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
1
2
3
4
5
6
7
8
9
10
11
#创建并扩容镜像副本
# 创建三个副本
for i in 1 2 3; do 
  cp jammy-server-cloudimg-amd64.img openclaw-rootfs-$i.ext4;
done

# 将每个镜像扩容到 5GB (可根据需要调整)
for i in 1 2 3; do 
  qemu-img resize openclaw-rootfs-$i.ext4 5G;
done

“注入”一个能自动启动 OpenClaw 的环境。由于无法直接挂载 .img 文件进行修改,标准做法是使用 cloud-init

打包成iso

cloud-localds seed.iso user-data

现在,你有了 seed.iso 文件和三个 openclaw-rootfs-*.ext4 文件。

user-data:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#cloud-config
hostname: openclaw-node

users:
  - name: openclaw
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    groups: sudo, docker
    lock_passwd: true
    ssh_authorized_keys:
      - 
password: password123
chpasswd: { expire: False }
packages:
  - curl
  - docker.io

runcmd:
  # 1. 安装 Docker
  - systemctl enable --now docker
  # 2. 拉取 OpenClaw 镜像
  - su - openclaw -c "docker pull openclaw/openclaw:latest"
  # 3. 创建配置文件目录
  - mkdir -p /home/openclaw/.openclaw
  - chown openclaw:openclaw /home/openclaw/.openclaw
  # 4. 启动 OpenClaw 容器
  - su - openclaw -c "docker run -d --name openclaw --restart always -p 18789:18789 -v /home/openclaw/.openclaw:/root/.openclaw openclaw/openclaw:latest"

hello world

1
2
3
4
5
6
7
8
9
10
11
12
13
#cloud-config
hostname: firecracker-vm
users:
  - name: admin
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash

# 设置密码以防万一
password: password123
chpasswd: { expire: False }

runcmd:
  - echo "Hello from Firecracker!\n" >> /tmp/hello.txt

配置 Firecracker

1
2
3
# 下载对应版本的firecracker 确保未来使用版本一致
wget https://github.com/firecracker-microvm/firecracker/releases/download/v1.14.4/firecracker-v1.14.4-x86_64.tgz

Firecracker 需要一个 TAP 设备来与宿主机通信。为每个 VM 创建一个。 ```

为第一个VM创建

sudo ip tuntap add dev tap0 mode tap sudo ip addr add 192.168.100.1/24 dev tap0 sudo ip link set tap0 up

请为另外两个VM重复此操作,创建 tap1, tap2 等

1
2
3
4
5
> 为每个实例创建一个 JSON 配置文件。例如,创建 `firecracker-config-1.json`:
>
> (Firecracker 需要一个特定的内核文件 `vmlinux.bin`。你需要从对应的 Ubuntu cloud image 中提取它,或者使用官方提供的示例内核。这是一个高级步骤,具体方法需查阅 Firecracker 官方文档。)

{ “boot-source”: { “kernel_image_path”: “/data/kvm/openclaw-vm-images/vmlinux.bin”, “boot_args”: “console=ttyS0 reboot=k panic=1 pci=off” }, “drives”: [ { “drive_id”: “rootfs”, “path_on_host”: “/data/kvm/openclaw-vm-images/openclaw-rootfs-1.ext4”, “is_root_device”: true, “partuuid”: “00000000-0000-0000-0000-000000000001”, “is_read_only”: false }, { “drive_id”: “seed”, “path_on_host”: “/data/kvm/openclaw-vm-images/seed.iso”, “is_root_device”: false, “is_read_only”: true } ], “network-interfaces”: [ { “iface_id”: “eth0”, “host_dev_name”: “tap0” } ], “machine-config”: { “vcpu_count”: 2, “mem_size_mib”: 2048, “track_dirty_pages”: true } }

1

#提取 vmlinux.bin (关键步骤)

vmlinux.bin

将镜像转换为可挂载格式 (qcow2 -> raw)

qemu-img convert -f qcow2 -O raw jammy-server-cloudimg-amd64.img jammy.raw

我们使用 guestmount (来自 libguestfs-tools 包) 来安全地读取镜像内部文件,比直接 loop mount 更省心。

创建挂载点

mkdir ./mnt

挂载镜像 (只读模式)

sudo guestmount -a jammy.raw -i –ro ./mnt

找到最新的内核文件并复制出来,重命名为 vmlinux.bin

cp $(ls ./mnt/boot/vmlinuz-* | head -n 1) ./vmlinux.bin

卸载镜像

sudo guestunmount ./mnt

1
2
3
4
5
6
7




### 集成运行 

使用 Firecracker API 启动虚拟机。

firecracker –api-sock /tmp/firecracker-1.socket –config-file firecracker-config-1.json &

#对三个实例重复此操作,分别使用不同的 socket 文件和配置文件。

1
2
3


假设VM的IP是192.168.100.2

ssh openclaw@192.168.100.2

虚拟机内查看

docker ps

1
2
3
4
5
## 错误情况

### 可能不全

root@raha-0001:/data/kvm/openclaw-vm-images# 2026-04-17T18:42:39.149514998 [anonymous-instance:main] Running Firecracker v1.14.4 2026-04-17T18:42:39.153785874 [anonymous-instance:main] Listening on API socket (“/tmp/firecracker-1.socket”). 2026-04-17T18:42:39.154813752 [anonymous-instance:fc_api] API server started. 2026-04-17T18:42:39.158040996 [anonymous-instance:main] Disk size 692453456 is not a multiple of sector size 512; the remainder will not be visible to the guest. 2026-04-17T18:42:39.165908251 [anonymous-instance:main] RunWithApiError error: Failed to build MicroVM from Json: Could not Start MicroVM from one single json: Kvm error: Error creating KVM object: No such file or directory (os error 2) Make sure the user launching the firecracker process is
configured on the /dev/kvm file’s ACL. Error: RunWithApi(BuildFromJson(StartMicroVM(Kvm(Kvm(Error(2)))))) 2026-04-17T18:42:39.167569085 [anonymous-instance:main] Firecracker exiting with error. exit_code=1

[1]+ Exit 1 /data/tmp/release-v1.14.4-x86_64/firecracker-v1.14.4-x86_64 –api-sock /tmp/firecracker-1.socket –config-file firecracker-config-1.json ```

虚拟机套壳虚拟机,如果未给虚拟机授权虚拟化,则不可使用该方法。

本文由作者按照 CC BY 4.0 进行授权