WSL2
Ubuntu
从 WSL 2.0.0 版本开始,支持在安装时指定自定义名称,从而创建多个相同发行版的独立实例。
安装
- 安装第一个 Ubuntu-24.04(如果你只需要一个Ubuntu,执行完这个命令即可)。
- wsl --install -d Ubuntu-24.04
- 安装第二个Ubuntu-24.04
- wsl --install -d Ubuntu-24.04 --name ubuntu24-1
- 安装第三个Ubuntu-24.04
- wsl --install -d Ubuntu-24.04 --name ubuntu24-2
- 删除指定名称的 Ubuntu
- wsl --unregister ubuntu24-1
- wsl --unregister ubuntu24-2
启动
wsl.exe -d ubuntu24-1
查看和进入
- 查看已安装哪些 Ubuntu
wsl -l -v
- 进入指定 Ubuntu
wsl -d ubuntu24-1
NVM
- 安装 NVM
curl -o- https://mirror.ghproxy.com/https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bashcurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
- 环境变量、启动代码写入文件
~/.bashrcsource ~/.bashrc
- 验证版本
nvm -v
NodeJS
- 查看所有可安装版本
nvm ls-remote
- 只看 LTS 稳定版
nvm ls-remote --lts
- 安装指定版本
nvm install 24- 第一次安装似乎会自动设置默认版本?
- 查看你已经装了哪些版本
nvm ls
- 查看当前正在用的版本
nvm current
- 查看默认版本
nvm alias default
OpenClaw (常规安装)
- 安装
npm install -g openclaw --registry=https://registry.npmmirror.com
- 验证版本
openclaw --version
- 键入配置界面
openclaw onboard
- 启动 openclaw
openclaw gateway
- 进入后台
http://127.0.0.1:18789/
OpenClaw (Docker内安装)
LM Studio
- 准备 lmstudio 所需要的依赖
sudo apt-get update && sudo apt-get install -y libatomic1
- 安装 lmstudio
curl -fsSL https://lmstudio.ai/install.sh | bash
Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# 回车 + yes
source ~/.bashrc
conda create -n vllm python=3.11
conda activate vllm
pip install vllm
npm install -g openclaw
VLLM
安装
conda deactivate
conda remove -n vllm --all -y pip cache purge
conda create -n vllm python=3.10 -y
conda activate vllm
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121
pip install vllm --no-cache-dir
vllm --version
启动
vllm serve /home/jin/.vllm/models/Qwen/Qwen2.5-7B-Instruct-AWQ \
--host 0.0.0.0 \
--port 8000 \
--trust-remote-code \
--quantization awq \
--dtype auto \
--gpu-memory-utilization 0.9 \
--max-model-len 32768 \
--max-num-seqs 8 \
--enable-auto-tool-choice \
--tool-call-parser hermes
Docker
最小生产级方案(Makefile + Compose)
docker-compose.yml
路径 ~/openclaw/docker-compose.yml
services:
openclaw:
image: ghcr.io/openclaw/openclaw:latest
container_name: openclaw-${INSTANCE}
volumes:
- ./base:/app/config/base
- ./instances/${INSTANCE}:/app/config/override
environment:
- CONFIG_BASE=/app/config/base/config.yaml
- CONFIG_OVERRIDE=/app/config/override/override.yaml
restart: unless-stopped
Makefile
路径: ~/openclaw/Makefile
# =========================
# OpenClaw Infra 管理(极简版)
# =========================
N ?= 2
# =========================
# 初始化
# =========================
init:
@echo "📁 初始化基础目录..."
mkdir -p base
mkdir -p instances
@echo "✅ 完成"
# =========================
# 创建实例(只做最小结构)
# =========================
add:
@echo "➕ 创建 $(N) 个实例..."
@for i in $$(seq 1 $(N)); do \
dir=instances/o$$i; \
if [ ! -d $$dir ]; then \
mkdir -p $$dir; \
touch $$dir/override.yaml; \
echo " ✔ 创建 $$dir"; \
else \
echo " ⚠ 已存在 $$dir"; \
fi; \
done
# =========================
# 生成基础模板(仅入口级)
# =========================
template:
@echo "🧩 生成基础配置(不会覆盖)..."
@if [ ! -f base/config.yaml ]; then \
printf "model:\n provider: openai-compatible\n base_url: http://host.docker.internal:11434/v1\n api_key: dummy\n\nruntime:\n timeout: 60\n" > base/config.yaml; \
echo " ✔ base/config.yaml"; \
else \
echo " ⚠ base/config.yaml 已存在"; \
fi
@for dir in instances/*; do \
if [ ! -f $$dir/override.yaml ]; then \
printf "system:\n mode: single\n" > $$dir/override.yaml; \
echo " ✔ $$dir/override.yaml"; \
fi; \
done
@echo "✅ 完成"
# =========================
# 启动所有实例
# =========================
up:
@echo "🚀 启动所有实例..."
@for dir in instances/*; do \
name=$$(basename $$dir); \
echo " ▶ $$name"; \
INSTANCE=$$name docker compose up -d; \
done
# =========================
# 停止所有实例
# =========================
down:
@echo "🛑 停止所有实例..."
@for dir in instances/*; do \
name=$$(basename $$dir); \
echo " ■ $$name"; \
INSTANCE=$$name docker compose down; \
done
# =========================
# 单实例操作
# =========================
logs:
@INSTANCE?=o1
docker logs -f openclaw-$(INSTANCE)
restart:
@INSTANCE?=o1
docker restart openclaw-$(INSTANCE)
# =========================
# 状态 & 更新
# =========================
ps:
docker ps | grep openclaw
pull:
docker compose pull
update:
docker compose pull
docker compose up -d
首次使用(初始化 + 启动)
make add N=2 # 创建实例 o1、o2(必须手动执行)
make up # 初始化 + 生成模板 + 启动全部
比下方之前的版本更简洁高效.
make init # 创建目录
make add N=2 # 创建实例
make template # 生成配置
make up # 自动执行 docker compose 启动所有
日常使用
# 启动
make up # 初始化 + 生成配置 + 启动全部实例
make up o1 # 只启动 o1 实例
# 停止
make down # 停止所有实例
make down o2 # 只停止 o2 实例
# 重启
make restart # 重启所有实例
make restart o1 # 只重启 o1 实例
# 日志
make logs o1 # 查看 o1 实例日志
# 更新
make update # 更新所有实例的镜像并重启(保持最新版本)
make update o2 # 只更新并重启指定实例(o2)
# 状态查看
make ps # 查看所有 openclaw 实例状态(支持)
openclaw/ ├── base/ │ └── config.yaml ├── instances/ │ ├── o1/ │ │ ├── override.yaml │ │ ├── agents/ │ │ ├── workflow.md │ │ └── workspace/ │ ├── o2/ │ └── o3/ ├── docker-compose.yml └── Makefile
docker exec 容器名 openclaw devices approve 这里填请求ID
docker exec o1-openclaw-1 openclaw devices approve ae3c8159-9e10-4ace-af37-20bc7ccdf612 │ 6245d6c691b596 Pending (1) ┌──────────────────────────────────────┬────────────────┬──────────┬────────────────────┬────────────┬────────┬────────┐ │ Request │ Device │ Role │ Scopes │ IP │ Age │ Flags │ ├──────────────────────────────────────┼────────────────┼──────────┼────────────────────┼────────────┼────────┼────────┤ │ ae3c8159-9e10-4ace-af37-20bc7ccdf612 │ 6245d6c691b596 │ operator │ operator.admin, │ 172.19.0.1 │ 3m ago │ │ │ │ 5b08f11d2f788f │ │ operator.read, │ │ │ │ │ │ c0adffcfd8798e │ │ operator.write, │ │ │ │ │ │ 675eca05c34a4a │ │ operator. │ │ │ │ │ │ 3dc94661 │ │ approvals, │ │ │ │ │ │ │ │ operator.pairing
docker exec o2-openclaw-1 openclaw devices approve 这里填请求ID docker exec o3-openclaw-1 openclaw devices approve 这里填请求ID
Pending (1)
┌──────────────────────────────────────┬────────────────┬──────────┬────────────────────┬────────────┬────────┬────────┐
│ Request │ Device │ Role │ Scopes │ IP │ Age │ Flags │
├──────────────────────────────────────┼────────────────┼──────────┼────────────────────┼────────────┼────────┼────────┤
│ ae3c8159-9e10-4ace-af37-20bc7ccdf612 │ 6245d6c691b596 │ operator │ operator.admin, │ 172.19.0.1 │ 3m ago │ │
│ │ 5b08f11d2f788f │ │ operator.read, │ │ │ │
│ │ c0adffcfd8798e │ │ operator.write, │ │ │ │
│ │ 675eca05c34a4a │ │ operator. │ │ │ │
│ │ 3dc94661 │ │ approvals, │ │ │ │
│ │ │ │ operator.pairing │ │ │ │
6245d6c691b5965b08f11d2f788fc0adffcfd8798e675eca05c34a4a3dc94661