先说结论:在 VMware 的 Ubuntu 24.04.2 LTS 虚拟机里把 OpenClaw 跑起来,并把 MiniMax M2.5 作为模型后端接好,这件事的难度不在于“装软件”,而在于把版本、依赖、配置串成一条不出错的链路。我前后折腾了不少时间才稳定下来,所以把这套最终步骤清单整理出来,希望你能少走我走过的弯路。
这套方案适合两类人:一类是想在本地虚拟环境里长期跑一个可交互智能体服务的开发者,另一类是刚接触 OpenClaw、手头只有一台 Windows 主机但不想直接污染物理机环境的朋友。文章里我会把虚拟机参数、系统安装、OpenClaw 依赖处理、MiniMax M2.5 接入、启动排错、systemd 托管这几段完整串起来,照着操作基本能一次跑通。
1. 为什么要用 VMware 虚拟机跑这套组合,而不是直接装在物理机
如果你也和我一样,主力机器上是 Windows,同时又想长期稳定跑 Linux 服务,那 VMware 虚拟机几乎是成本最低的方案。OpenClaw 本身并不挑硬件,真正吃资源的是模型推理侧,但 MiniMax M2.5 走的是 API 调用,本地只负责框架调度和上下文管理,所以虚拟机完全带得动。
1.1 虚拟机资源分配:给多少才算“够用但不浪费”
我最初犯过一个典型错误:给虚拟机分配了 16GB 内存,觉得越大越好。实际跑起来发现,OpenClaw 加 Node.js 进程,再加上 systemd、SSH、日志服务,日常内存占用也就 3GB 左右。后来我把配置收敛到下面这组参数,连续运行一周都没有任何资源压力:
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| CPU | 4 核 | OpenClaw 启动时会执行构建任务,少于 2 核容易让构建变慢 |
| 内存 | 8GB | 编译 Node 原生模块和运行服务都够用,如果只是 API 转发 4GB 也能跑 |
| 磁盘 | 80GB | Ubuntu 24.04 加源码加依赖缓存,40GB 勉强够,但建议留出快照空间 |
| 网络 | NAT 模式 | 虚拟机只需要访问外网 API 和主机 SSH,不需要桥接 |
| 显示 | 关闭 3D 加速 | 纯命令行服务用不到显卡虚拟化 |
内存这块说个实际经验:虚拟机内存不建议一次性给满,尤其是你主机自己还要干活的情况。VMware 的默认内存回收机制虽然会动态调整,但明明只需要 8GB 却给了 16GB,反而会让主机的物理内存时不时吃紧,早晚会遇到卡顿。
1.2 系统镜像与安装选项:Server 版比桌面版省心太多
镜像直接选 Ubuntu 24.04.2 LTS Server 版 ISO。我知道有人会纠结“Server 版没有桌面,操作不习惯”,但对于部署 OpenClaw 这种常驻进程来说,桌面环境纯属负担。它意味着你还需要保留 GUI 相关组件、自动更新图形工具、不必要的网络服务,这些在虚拟机里都只是潜在的不稳定因素。
安装时勾选 OpenSSH server,这一步千万别跳过。装完系统后你会完全依赖 SSH 进虚拟机操作,如果当时没装,后面还得再走一遍安装流程,非常没必要。分区直接用默认方案即可,文件系统选 ext4,别在这里整 LVM 加密分区,至少在个人虚拟机上没有收益,还增加排错复杂度。
软件更新策略我建议选“仅安全更新”。Ubuntu 24.04 的常规安全更新不会引入大的软件版本跳跃,而“不限更新”模式会在某个深夜悄悄升级内核或者 Node 相关依赖,第二天你再看服务可能就起不来了。虚拟机能少动就少动,稳定优先。
1.3 装完系统后的第一步,先装 open-vm-tools
很多人习惯去 VMware 菜单里点“安装 VMware Tools”,然后手动挂载 ISO 再执行脚本。但在 Server 版 Ubuntu 上完全没必要,直接用 apt 装内核自带的开源版本:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y open-vm-tools
装完之后建议重启一次,让虚拟机适配 VMware 的虚拟硬件信息。这一步主要解决两个实际问题:一是剪贴板共享,二是虚拟机的 IP 在 VMware 网络里能被正确感知,方便你从主机 SSH 进去。如果你发现 SSH 连不上,先确认 NAT 网段下虚拟机的 IP,再检查 VMware 虚拟网络编辑器里是否有 DHCP 分配。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. OpenClaw 的安装:依赖选型比拉源码更值得花时间
OpenClaw 本身不是一个单体应用,它更像一个智能体运行框架:你给它配置一个模型后端,它负责对话上下文、工具调用、任务编排这些上层逻辑。MiniMax M2.5 就是作为这个后端模型接入的。源码拉取从来不难,难的是本地依赖环境能不能完整对齐项目要求。
2.1 先明确 OpenClaw 的运行时要求
动手之前,我建议先把 OpenClaw 根目录的 README 和 package.json 打开看一下。不同版本的要求有差异,但基本都绕不开这几样:Node.js 20 及以上、Python 3.10 及以上、npm 10 左右、git。后面两个一般不会有问题,最容易翻车的是 Node 版本。
我的第一反应是直接跑:
bash复制sudo apt install -y nodejs npm
然后开心地执行 node -v,结果发现版本是 18.x。这个版本并不是“不能用”,而是 OpenClaw 启动后会报出各种莫名其妙的兼容错误,比如某些模块要求 Node 20 的 API,或者构建时直接提示 engine 不匹配。这种问题排查起来很烦躁,因为错误信息不会明确告诉你“去升级 Node”,只会抛一个模块加载失败。
所以先检查系统里有没有旧版本:
bash复制node -v || true
which node || true
如果有残留的旧版本,先清理干净再装新的,避免 PATH 里出现两个 node 互相干扰。
2.2 安装 Node.js 20 的正确姿势
Ubuntu 24.04 官方仓库里带的 Node 版本偏老,不适合 OpenClaw 这类偏前沿的框架。我采用的是 NodeSource 提供的 20.x 仓库,注意这不是第三方野鸡源,而是被广泛使用的维护仓库。操作命令如下:
bash复制curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
如果你是离线环境或者对从网络拉取脚本比较谨慎,也可以去 Node 官网下载源码包手动安装,但那个流程更繁琐。虚拟机只要能正常访问外网,直接用这个仓库是最省事的。
装完验证版本:
bash复制node -v
npm -v
我机器上看到的是 v20.15.x 和 10 开头的 npm。到这里,OpenClaw 最大的一个依赖雷就排掉了。
2.3 Python 编译依赖:防止 wheels 现场编译失败
OpenClaw 的某些子模块会用到 Python 脚本,尤其是涉及文档处理、文本解析这类能力时,很多 Python 依赖都需要本地编译。Ubuntu 24.04 系统比较干净,默认缺少编译链,直接装 Python 依赖很容易在 pip 阶段报 gcc 找不到或者 Python.h 缺失。
所以不要等报错再去补,先一次性装好:
bash复制sudo apt install -y python3-venv python3-pip build-essential
build-essential 看起来像个无关紧要的包,但它包含 gcc、g++、make 等一系列编译工具。没有它,pip 在安装某些带 C 扩展的 Python 包时会走到“源码编译”这条路,然后挂在一个红字报错上。我甚至可以说,80% 的 Python 依赖安装失败都跟没装编译链有关。
如果你需要 Python 环境隔离,可以再创建一个虚拟环境:
bash复制python3 -m venv ~/openclaw-venv
source ~/openclaw-venv/bin/activate
是否真正需要隔离,取决于 OpenClaw 的 Python 组件是否自己管理虚拟环境。我建议先按官方 README 来,官方没提就保持系统环境干净,不额外折腾。
2.4 拉取源码与安装依赖时的三个细节
源码获取我用的 git clone,而不是下载 ZIP 包。原因是 OpenClaw 这类迭代快的项目,后续升级会频繁用到 git pull,如果当初是 ZIP 解压的,升级时只能重新下载覆盖,很容易丢配置。
克隆下来之后,注意到这个项目是包含多个子包的 monorepo 结构。也就是说根目录的 package.json 会通过 npm workspaces 管理各个子模块,安装依赖必须在根目录执行:
bash复制cd ~/openclaw
npm install
这里有个很值得说的坑:如果你因为想看某个子模块的代码,单独进入到 packages/xxx 目录里去执行 npm install,npm 很可能会因为你当前不在 workspace 根目录而重新解析依赖树,甚至产生一个额外的 node_modules。后果就是根目录无法识别子包的链接,启动时报 Cannot find module '@openclaw/core' 这类错。
正确做法永远是:统一在根目录安装,然后耐心等待。npm 输出里如果出现 ERR!,不要反复重试同一个命令,先看错误上下文。大多数情况下是网络超时或镜像源问题,解决完再重试。如果项目提供了 npm run build 步骤,安装完依赖后在根目录执行一遍。
3. MiniMax M2.5 接入:从申请 Key 到配置文件一个坑一个坑填
OpenClaw 装好只算搭建了骨架,真正的“灵魂”是把 MiniMax M2.5 模型接进来。这个阶段出问题最多的不是 OpenClaw 本身,而是 API Key 和模型配置。
3.1 申请 Key 之前先去控制台做一件事
在 MiniMax 开放平台申请 API Key 之前,先确认你需要的模型服务已经在控制台开通。这不是一句废话,因为现在很多模型平台对每个模型单独设置了开通状态。你拿了一个全平台通用的 API Key,但某个具体模型没有开通服务,调用时照样会返回鉴权失败。
所以顺序应该是:先在控制台找到 M2.5 模型服务,确认自己的账号已开通;然后进入 API Key 管理页面生成新的 Key;最后把以下三个信息复制到本地文本里备好:
- API Key 本身
- 模型名称(例如
m2.5或你控制台显示的具体标识) - API 网关地址
三样东西缺一不可。尤其是“API 网关地址”,我见过有人把网页控制台的地址当成了请求网关,能不快吗。
3.2 .env 文件怎么改才算“真改好”
OpenClaw 根目录下通常会有一个 .env.example 文件,第一次部署时先复制它:
bash复制cp .env.example .env
然后编辑 .env。下面是我采用的配置骨架,变量名以你拉取的源码实际示例为准,因为我遇到过版本之间命名差异:
bash复制# OpenClaw 模型后端配置
LLM_PROVIDER=minimax
LLM_MODEL=m2.5
MINIMAX_API_KEY=这里换成你的Key
MINIMAX_API_BASE=控制台里的网关地址
这里说三个我踩过的细节。
第一,Key 值不要加单双引号。OpenClaw 读取环境变量时会把引号也解析进来,导致实际传出去的 Key 变成了 'sk-xxxx',后端鉴权当然失败。第二,文件编辑建议用 vim 而不是从 Windows 记事本复制内容进去。记事本保存的 UTF-8 带 BOM 文件,会让第一行变量名前面多出不可见字符,排查起来非常隐蔽。第三,文件里不要有空格行尾。为了确认文件没毛病,我后来养成了一个习惯:
bash复制cat -A .env | head -20
cat -A 会把行尾的 $ 显示出来,也能看到每行末尾有没有多余空格。如果某一行显示 MINIMAX_API_KEY=xxx $,说明结尾有一个空格,删掉再保存。
3.3 用一段请求先验证模型链路
很多人在 OpenClaw 里跑不通对话,第一反应是去查 OpenClaw 配置,其实更快的办法是绕过 OpenClaw,直接模拟一次模型请求。我这里用的是 Chat Completions 风格的接口做验证,如果你的控制台文档里直接给了 curl 示例,那就用官方示例改一下模型名再执行:
bash复制curl "$MINIMAX_API_BASE/chat/completions" \
-H "Authorization: Bearer $MINIMAX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "m2.5",
"messages": [{"role": "user", "content": "ping"}],
"max_tokens": 8
}'
如果返回内容里带 choices 字段,说明 Key、模型名、网关地址三者都没问题,问题一定出在 OpenClaw 侧。如果返回 401 或 403,按控制台错误提示逐项对照;如果返回 404,大概率是网关地址拼错;如果返回 400 提示模型名错误,那就要把模型字段改成平台文档里的精确名称。
这一步非常值得做,它能帮你把问题边界切得很干净。我后来再部署到别的环境时,都是先跑这个验证,再回头去检查 OpenClaw 配置。
4. 第一次启动的完整排查:从“401 鉴权失败”到正常对话
部署过程里教训最深的是一次“几乎成功”的启动。当时 OpenClaw 进程正常起来了,端口也监听了,但不管我在对话窗口里输入什么,它都回一句鉴权失败。这次排查把环境变量、启动日志、端口占用、systemd 服务全串了一遍,也算是一次比较完整的排错链路。
4.1 现象记录:能启动,但一问就报错
启动命令执行后,日志滚动了几行,最后停顿在类似“OpenClaw is running on port 3000”的位置。我以为一切正常,结果输入第一句话,屏幕上直接抛了一个包含 401 的错误,后面跟着 MiniMax API 的相关描述。
第一反应是检查 .env 里 Key 是否有问题。但反复复制粘贴,确认 Key 本身是对的。于是我又回到第 3.3 小节那种直接 curl 的方式验证了一次,返回正常。也就是说链路本身没问题,问题发生在 OpenClaw 进程内部。
4.2 完整排查链路:日志、环境变量、端口、权限
我的排查顺序是这样的:
第一步,先看 OpenClaw 自己的启动日志,有没有加载到模型配置。如果日志里出现 model not configured 之类,说明环境变量没被读取。
第二步,检查当前进程环境里到底有没有这些变量。如果是直接在终端里启动的,用:
bash复制env | grep -i minimax
如果这行输出是空的,说明 .env 没有被加载,问题可能出在 OpenClaw 读取配置的路径上。比如项目要求从指定目录启动,而我却把 .env 放在了另一个位置。
第三步,检查 .env 内容是否有多余字符。我就是在这个环节发现,自己在复制 Key 时不小心带上了一个空格。cat -A .env 输出里,Key 那行末尾多了一个空格,导致解析后的值不是预期值。
第四步,修完空格后重启,又遇到一个新问题:EADDRINUSE。这说明 3000 端口已经被之前那个半残进程占住了。使用下面的命令找到并处理:
bash复制ss -tlnp | grep 3000
看到 PID 后,确认是无用残留进程就 kill 掉。这一步也提醒我,以后每次重启前先确认旧进程有没有退干净。
第五步,再次启动,日志终于正常,对话也通了。
4.3 用 systemd 托管,避免 SSH 关闭后进程跟着退出
命令行启动方便是方便,但只要你断开 SSH,OpenClaw 进程就可能跟着退出。所以跑通之后,我建议立刻用 systemd 把进程托管起来。在 /etc/systemd/system/openclaw.service 写入:
ini复制[Unit]
Description=OpenClaw Service
After=network.target
[Service]
Type=simple
User=你的用户名
WorkingDirectory=/home/你的用户名/openclaw
EnvironmentFile=/home/你的用户名/openclaw/.env
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
注意 ExecStart 里 npm 建议换成绝对路径。用 which npm 查一下你机器上的 npm 位置,我这里是 /usr/bin/npm。如果直接用 npm,有些 systemd 环境下会因为 PATH 不全而找不到命令。
写好后执行:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now openclaw
sudo systemctl status openclaw
之后查看日志统一用:
bash复制journalctl -u openclaw -f
这种方式比在终端里开着项目前台日志可靠得多。你甚至可以把它想象成给服务买了一份保险,只要系统不崩,OpenClaw 总能自己拉起来。
5. 最终步骤清单:照着抄就行
前面讲了很多原理和排错,这一节把已实践过的最终步骤浓缩成可直接照抄的清单。环境变量、路径、包名请根据你的实际情况微调,但流程顺序不用改。
5.1 虚拟机参数与系统配置速查
| 类别 | 配置值 | 备注 |
|---|---|---|
| 虚拟机平台 | VMware Workstation | 版本差异影响不大 |
| 系统镜像 | Ubuntu 24.04.2 LTS Server | 安装时勾选 OpenSSH server |
| CPU | 4 核 | 构建阶段更顺畅 |
| 内存 | 8GB | 实际占用约 3GB,留余量 |
| 磁盘 | 80GB | 保留快照空间 |
| 网络 | NAT | 满足外网 API 与主机 SSH 访问 |
| 虚拟化工具 | open-vm-tools | 通过 apt 安装,不用 VMware Tools ISO |
5.2 部署命令速查
进入虚拟机后,依次执行:
bash复制# 系统基础更新
sudo apt update && sudo apt upgrade -y
# 虚拟化工具与编译链
sudo apt install -y open-vm-tools build-essential python3-venv python3-pip git curl
# 安装 Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# 验证 Node 版本
node -v
npm -v
# 拉取 OpenClaw 源码,目录名可自行调整
cd ~
git clone 你的OpenClaw仓库地址
cd ~/openclaw
# 安装依赖与构建
npm install
npm run build
# 生成并编辑环境变量
cp .env.example .env
vim .env
编辑 .env 时,至少保证这三项是正确的:LLM_PROVIDER=minimax、LLM_MODEL=m2.5、MINIMAX_API_KEY=你的Key。
5.3 启动与验证命令速查
先手动启动验证一次:
bash复制cd ~/openclaw
npm start
看到端口监听字样后,输入一句话,确认 MiniMax M2.5 能正常返回。确认没问题后,停止手动进程,创建 systemd 服务,然后:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now openclaw
sudo systemctl status openclaw
journalctl -u openclaw -f
到这里,一个长期运行的 OpenClaw 服务就算真正落地了。
另外说点实在的:部署完成后一定要在 VMware 里打一个快照。后面你升级 OpenClaw、调整模型参数、改环境变量,都可能把服务弄到起不来,这时候快照回滚比你现场排错快得多。还有,备份配置只备份 .env 文件和自定义数据目录就够了,源码和依赖随时可以重装。每次更新模型配置后,记得同时重启 systemd 服务,只改文件不重启是很多人常犯的低级错误。
