从 Windows 原生到 WSL:RAKU 踩坑全记录¶
背景¶
RAKU 小队的 Home PC(RTX 4070 Ti, Windows 11)最初在 Windows 原生环境上跑 OpenClaw Gateway + 各种服务。折腾了两天后全面迁移到 WSL2 Ubuntu 24.04,所有问题一次性消失。
本文记录 Windows 原生环境的各种坑,以及迁移到 WSL 后的解决方案,供后来人参考。
Windows 原生的七宗罪¶
1. Terminal 窗口弹出抢焦点 👻¶
最烦人的问题,没有之一。
OpenClaw Gateway 和各种脚本启动时会弹出 terminal 窗口,而且抢走键盘焦点。你正在打字写代码,突然窗口跳到前台,按键全打到了 terminal 里。
尝试过的方案:
.cmd启动脚本 → 弹窗 + 抢焦点,无解.vbs(VBScript) 静默启动 → 能隐藏窗口,但脚本难维护start /min→ 最小化启动,但仍然会短暂抢焦点- Windows Terminal 的
startupActions→ 配置复杂,效果不稳定
最终 Startup 文件夹里堆了 .cmd、.vbs、OpenClaw Node.vbs 三个启动文件,管理混乱。
WSL 方案: systemd --user service,后台运行,没有任何窗口。
2. SIGUSR1 不存在¶
OpenClaw 用 Unix 信号实现热重启,但 Windows 不支持 POSIX 信号。gateway restart 命令直接报错无法使用,只能手动杀进程再启动。
WSL 方案: openclaw gateway restart 正常工作。
3. Docker Desktop 的沉重¶
Windows 上跑 Docker 需要 Docker Desktop,问题一堆:
- 启动慢 — Docker Desktop 本身启动要 30-60 秒
- 吃内存 — Hyper-V VM + Docker daemon 常驻占 2-4 GB RAM
- 依赖用户登录 — 注册在
HKCU\Run,必须用户登录到桌面才能启动 com.docker.service— 需要手动设为 Automatic + Running- 开机无人值守启动需要配 Windows 自动登录(安全隐患)
当时的启动链路:
任何一环断了,整个服务就挂。
WSL 方案: 原生 Docker Engine,systemctl start docker,不需要桌面环境,不需要登录。
4. Streaming Tool Call Bug¶
copilot-api 在 Windows 上有一个诡异的 bug:
stream 模式下,超过 5000 字符的 tool call 参数被截断/吞掉。
排查了很久,最终不得不写一个 stream-strip-proxy Docker 容器做中间代理层,把 streaming 响应转成非 streaming 再转发。
WSL 方案: Linux 版 copilot-api 没有这个 bug,stream-strip-proxy 直接删除。
5. SSH 端口被墙¶
WSL 内部 SSH 22 端口出站全部超时(GitHub、Gitee 都连不上),但 HTTPS 443 正常。原因是代理(V2RayN)不支持 CONNECT 到非 443 端口。
最终放弃 SSH 协议,全部改 HTTPS:
- GitHub:
ghCLI OAuth 认证,HTTPS clone - Gitee: HTTPS + personal access token
6. 开机自启动的脆弱链路¶
Windows 上实现"无人值守开机自启"需要同时满足:
- Windows 自动登录(
netplwiz或注册表) - Docker Desktop 在 Startup 文件夹
- Docker 容器
unless-stoppedrestart policy - OC Gateway
.vbs在 Startup 文件夹 - RAKU-Watchdog 定时任务兜底
五层依赖,任何一层出问题就挂。
WSL 方案:
# 两行搞定
# 1. WSL 开机启动(Windows Task Scheduler AtStartup,不需要登录)
# 2. systemd 管理所有服务
systemctl --user enable openclaw-gateway copilot-api litellm cloudflared
加上 .wslconfig 的 vmIdleTimeout=-1,关掉终端窗口也不会杀 WSL。
7. 路径地狱¶
Windows 和 WSL 混用时路径转换是噩梦:
Windows: D:\openclaw\workspace\skills\local-sd\
WSL: /mnt/d/openclaw/workspace/skills/local-sd/
Python: D:\\openclaw\\workspace\\skills\\local-sd\\
不同工具对路径格式的要求不同,反斜杠/正斜杠、盘符大小写、空格转义……到处是坑。
WSL 方案: 全部用 Linux 路径,统一 /home/user/...。
迁移清单¶
搬进 WSL 的¶
| 服务 | Windows 方案 | WSL 方案 |
|---|---|---|
| OC Gateway | .vbs 静默启动 |
systemd service |
| copilot-api | Docker 容器 | systemd service(原生 Node) |
| LiteLLM | Docker 容器 + PostgreSQL | systemd service + SQLite |
| cloudflared | Docker 容器 / Windows 进程 | systemd service |
| Docker | Docker Desktop (Hyper-V) | 原生 Docker Engine |
从 Windows 删掉的¶
- Startup 文件夹自启动 ×3(
.cmd/.vbs/OpenClaw Node.vbs) - RAKU-Watchdog 定时任务
- Windows 侧 cloudflared 进程
- Docker Desktop(完全卸载)
stream-strip-proxy容器litellm-dbPostgreSQL 容器
WSL 持久化配置¶
# Windows Task Scheduler
触发器: AtStartup(不需要登录)
操作: wsl -d Ubuntu -- bash -c "sleep 5"
# WSL 启动后 systemd 自动拉起所有 enabled 服务
性能对比¶
| 指标 | Windows 原生 | WSL2 |
|---|---|---|
| Gateway 启动 | ~15s (VBS + Node) | ~3s (systemd) |
| Docker 启动 | ~45s (Desktop) | ~5s (Engine) |
| 全服务就绪 | ~90s | ~15s |
| GPU 推理 (SDXL) | 未测试 | ~10-15s |
| 内存开销 | +2-4 GB (Docker Desktop) | +512 MB (WSL VM) |
经验总结¶
- Windows 上跑 Linux 服务栈 = 自找麻烦。 信号、路径、启动方式全不兼容。
- Docker Desktop 是最大的性能和可靠性瓶颈。 能用原生 Docker Engine 就别碰它。
- systemd 是服务管理的终极答案。
Restart=always+enable比任何 Windows 方案都可靠。 - WSL2 的 GPU 直通完美可用。 CUDA、torch、diffusers 全部正常,性能无损。
- 弹窗抢焦点这种问题,在 Linux 世界根本不存在。 没有桌面 = 没有烦恼。
2026-03-30 | RAKU 小队 | 敖丙记录 基于 2026-03-27 ~ 2026-03-28 的实际迁移经历