前阵子在 Windows 11 上把 OpenClaw 完整部署到 WSL2 里,之后又调好了静默自启和浏览器访问。现在每天打开电脑,等半分钟左右,浏览器输入http://localhost:8787就能直接进控制台,全程一次终端都没打开过。这套环境我稳定跑了一个多月,中间重启系统不下十次,没有一次需要人工干预。
今天把这套方案从头到尾拆一遍,从 WSL2 环境准备、OpenClaw 脚本安装,到 systemd 自启、Windows 浏览器访问、常见报错排查,全部写清楚。如果你也是 Windows 主力机、想跑一个 Linux 侧的 Agent 服务,而且希望开机后“啥也不用管”,那这篇就是照着抄的作业。
1. 部署前环境准备:先把 WSL2 这块地基打牢
1.1 为什么不用 Docker Desktop 或虚拟机,偏偏选 WSL2
很多人看到 Linux 服务,第一反应是装 Docker Desktop。从表面看,Docker Desktop 也有 WSL2 后端,界面点一点就能起容器。但这里有个问题:Docker Desktop 跑容器、OpenClaw 又要跑在容器里,中间多一层抽象,网络转发和端口映射排查起来非常痛苦。我刚开始也试过这个方案,折腾两天,最后发现日志都在,页面就是连不上,问题就出在 Windows、WSL2、Docker 三层网络的叠加上。
WSL2 本身就是一个轻量虚拟机,跑的是真实 Linux 内核,service、systemd、端口监听这些行为和独立 Linux 服务器完全一致。直接把 OpenClaw 装进 WSL2,比容器方案少一层,出问题时好排查得多。
对比一下三个方案的取舍:
- WSL2 直接装:最贴近“一台 Linux 服务器”的真实状态,systemd 自启友好,网络链路最短,内存开销最小。推荐。
- Docker Desktop:适合需要快速拉起和销毁环境的人,但链路复杂,自启和网络访问需要额外处理。
- VMware / VirtualBox:GUI 占用大、启动慢、快照管理麻烦,而且不支持 systemd 的轻量集成场景,不推荐作为日常自启服务载体。
说白了,WSL2 是 Windows 和 Linux 之间的“原配桥梁”,能直接跑二进制、能被 Windows 侧计划任务调用,还能被 VS Code 无缝接管调试。这个组合最适合长期跑一个常驻 Agent 服务。
1.2 从零装好 WSL2 + Ubuntu 22.04,一次跑通
先说系统要求:Windows 10 21H2 及以上、或者 Windows 11。内存建议 8GB 起步,跑 OpenClaw 加上中间件,16GB 会比较舒服。
安装前的第一道坎是 BIOS 虚拟化。任务管理器里切到“性能”选项卡,看底部“虚拟化”那项是不是“已启用”。如果显示“已禁用”,先重启进 BIOS/UEFI,找到 Intel VT-x 或 AMD-V 相关的选项打开,保存退出。这一步不做,后面 WSL2 基本没法启动。
系统层面,新版 Windows 直接用一条命令装全家桶:
wsl --install默认会装 WSL2 和 Ubuntu。如果想指定发行版,可以加参数:
wsl --install -d Ubuntu-22.04旧机器或者系统组件比较乱的情况下,建议手动开两个 Windows 功能,PowerShell 管理员模式执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启,再wsl --install -d Ubuntu-22.04。
Ubuntu 首次启动会让你设置用户名和密码,这个密码后续 sudo 要用,别乱设完就忘了。装完先更新系统:
sudo apt update && sudo apt upgrade -y如果你的网络环境下载比较慢,可以把 apt 源换成国内常用镜像源,修改/etc/apt/sources.list后重新 update 即可。这一步可做可不做,但换了之后后面装依赖会明显快很多。
装完确认 WSL 版本是 2,而不是 1:
wsl -l -v输出里面 VERSION 列必须是 2。如果显示 1,执行:
wsl --set-version Ubuntu-22.04 2这里要提一个很常见的坑:wsl --install跑完之后,系统默认的发行版可能不是你刚装的。用wsl --set-default Ubuntu-22.04把它设成默认,避免后面计划任务里调用 WSL 时找错发行版。
1.3 启用 systemd:后台常驻服务的开关终于打开了
WSL2 刚出来的时候有个很尴尬的问题:默认 init 进程不是 systemd,而是类似容器的轻量 init。这导致systemctl start xxx这种命令根本不可用,很多 Linux 下的服务管理方式全部失效。当时大家只能靠 cron、rc.local 或者手动脚本去拉服务,难受得一批。
新版 WSL2 已经支持 systemd,只需要在/etc/wsl.conf里打开开关:
[boot] systemd=true然后回到 Windows,执行:
wsl --shutdown注意,这里不是关掉终端窗口,而是彻底关停整个 WSL 虚拟机。可以在 PowerShell 里跑wsl --shutdown,再重新进入 Ubuntu。
验证 systemd 是否生效:
ps -p 1 -o comm=输出systemd就说明成功了。这一步是整个“静默自启”方案的地基,因为后面 OpenClaw 的常驻服务和崩溃重启都依赖 systemd。没有这步,服务管理会麻烦很多,排查问题时也会到处踩坑。
2. OpenClaw 本体安装:脚本化安装、目录规划与升级
2.1 先搞清楚 OpenClaw 是什么、安装前要准备什么
OpenClaw 是一个开源智能体运行平台,核心能力是把大模型接入、工具调用、工作流编排和自动化执行整合到一起。你可以把它理解成一个“agent 管家”:告诉它目标,它会拆任务、调模型、调工具、把结果整理好。部署它本质上是部署一套带 Web 控制台的常驻服务。
在开始安装之前,先确认了两件事:
一是中间件。OpenClaw 运行需要一些外部依赖,常见组合是消息队列加数据库,我这边用的是 RabbitMQ 和 MongoDB,具体以官方文档当前版本的依赖清单为准。个人使用场景下,我建议把中间件放到 Docker Compose 里管理,OpenClaw 本体则直接装进 WSL2。这样中间件出问题可以一键重建,OpenClaw 本体又能直接享受 systemd 自启。
二是端口规划。OpenClaw 的 Web 控制台有默认端口,我这边是 8787。这个端口不一定和你的版本一致,安装完启动日志里会明确打印,记住这个端口,后续访问和防火墙都围绕它展开。
2.2 使用官方安装脚本,指定 git 方式从 main 分支安装
OpenClaw 提供了官方安装脚本,支持几种不同的安装方式。这里我强烈建议用 git 方式,直接从 GitHub 的 main 分支检出源码。为什么?因为 release 包更新有滞后,而 main 分支通常包含最新功能和紧急修复。Agent 平台这种迭代飞快的项目,用 git 方式能让你及时跟上更新节奏,升级也只是一次git pull的事。
流程是这样:先下载安装脚本到本地查看内容,不要盲目执行管道安装,看清楚脚本行为和依赖再跑:
curl -fsSL -o install_openclaw.sh <官方文档里的脚本地址> bash install_openclaw.sh --method git --branch main脚本会做几件事:检查系统依赖、创建项目目录、从 main 分支检出源码、安装 Python/Node 相关依赖、生成默认配置。整个过程有网络请求,耐心等。如果中途失败,多半是网络拉源码断了,重跑一次脚本即可,它有幂等处理。
安装完成后,在终端执行:
openclaw --version能输出版本号就说明命令行工具装好了。然后用which openclaw记下它的绝对路径,后面 systemd 配置要用。
第一次启动前,改一下配置文件。OpenClaw 的配置一般在~/.openclaw/config.yaml或项目目录下,取决于安装脚本的约定。重点检查几个字段:中间件连接地址、控制台监听地址、控制台端口。监听地址一定要设置成0.0.0.0,否则从 Windows 侧访问时会连不上,只监听127.0.0.1的话服务只在 WSL2 内部可见。
2.3 目录规划与版本升级
目录规划这件事,越早做越好。我的建议是:OpenClaw 本体放在~/openclaw,配置文件、日志、数据库数据不要混在项目目录里。
当时踩过一个教训:升级时git pull拉下来新代码,和本地的自定义配置冲突,差一点把生产配置覆盖掉。后来学乖了,把配置文件放到~/.openclaw/,项目目录通过环境变量或启动参数指定配置路径:
export OPENCLAW_CONFIG=/home/你的用户名/.openclaw/config.yaml这样每次升级,只需要 pull 代码、更新依赖、重启服务,配置和数据都是独立的。
升级版本的操作也很简单:
cd ~/openclaw git pull origin main # 根据项目文档更新依赖,比如 pip install -r requirements.txt 或 npm install sudo systemctl restart openclaw升级前记得备份配置和数据库。数据库如果是 MongoDB,用mongodump导出一份备份,几十 MB 的东西,花不了一分钟,但能避免很多意外。
3. WSL2 静默自启:开机后不用敲一行命令
3.1 静默自启的完整链路拆解
“静默自启”这四个字,核心诉求是:开机后不打开 WSL 终端、不手动敲命令,OpenClaw 自己就在后台跑起来,浏览器直接访问。
要实现这个效果,需要把两段链路接起来:
一段在 Windows 侧:系统登录后,触发一个计划任务,执行一条 WSL 命令。 一段在 Linux 侧:WSL2 里的 systemd 接管这条命令,把 OpenClaw 作为系统服务拉起,并保证它崩溃后自动重启。
为什么不用 Windows 的开机启动文件夹放一个wsl -d Ubuntu的快捷方式?因为那只会打开一个 WSL 窗口,还要在里面想办法跑命令,既不“静默”也不可靠。计划任务 + systemd 的组合,服务由 Linux 的进程管理器托管,异常退出会自动拉起,比开机启动文件夹稳得多。
还有一点要确认:WSL2 默认是“登录后启动”,不是 Windows 服务那种系统级自启。对个人办公电脑来说,登录后启动完全够用。如果你需要不登录也启动,可以把计划任务设为“不管用户是否登录都要运行”,但那样 WSL 的网络和用户环境会有额外坑,不建议个人用户这么折腾。
3.2 在 WSL2 里注册 systemd 服务
在/etc/systemd/system/openclaw.service写入服务单元文件:
[Unit] Description=OpenClaw Server After=network-online.target mongod.service rabbitmq-server.service Wants=network-online.target [Service] User=你的用户名 WorkingDirectory=/home/你的用户名/openclaw ExecStart=/usr/local/bin/openclaw serve Restart=on-failure RestartSec=5 Environment=OPENCLAW_CONFIG=/home/你的用户名/.openclaw/config.yaml [Install] WantedBy=multi-user.target解释几个关键字段:
Restart=on-failure:进程异常退出时自动重启,RestartSec=5表示等 5 秒再拉起来,避免疯狂重启。User:指定运行用户,别用 root 跑 Web 服务,权限太宽不是好事。ExecStart:替换成你自己的openclaw绝对路径和启动子命令,以官方文档和openclaw --help为准。After和Wants:等网络和中间件就绪后再启动本体,避免启动顺序不对导致连接失败。
写完后执行:
sudo systemctl daemon-reload sudo systemctl enable openclaw sudo systemctl start openclawenable是注册开机自启的关键,很多人漏了这一步,导致 systemd 服务手动能起,但重启后不生效。启动后查看状态:
sudo systemctl status openclaw状态是active (running)就说明服务已经在后台跑起来了。可以再确认下端口监听:
ss -tlnp | grep 8787注意看监听地址是不是0.0.0.0:8787。如果是127.0.0.1:8787,外部访问不了,回到配置文件把监听地址改成0.0.0.0再重启服务。
3.3 Windows 侧创建计划任务
现在进入 Windows 侧,这条命令是核心:
schtasks /Create /TN "OpenClawAutostart" /TR "C:\Windows\System32\wsl.exe -d Ubuntu-22.04 -u root systemctl start openclaw" /SC ONLOGON /RL HIGHEST /F这条命令的含义是:登录时触发,以最高权限运行,调用 wsl.exe 让 Ubuntu-22.04 的 root 用户执行systemctl start openclaw。
这里有几个容易出问题的细节:
计划任务里的wsl.exe建议写全路径C:\Windows\System32\wsl.exe。有些环境的 PATH 不包含 System32,只写wsl.exe可能执行失败。-d Ubuntu-22.04指定发行版,避免机器上装了多个 WSL 发行版时调错。-u root是为了让 systemctl 有权限操作系统服务,不需要额外配 sudo 免密。systemctl start openclaw前面不要加sudo,因为已经是 root 用户。
如果你不喜欢命令行创建任务,用“任务计划程序”GUI 也行。创建任务 → 触发器设为“登录时” → 操作设为“启动程序” → 程序填C:\Windows\System32\wsl.exe,参数填-d Ubuntu-22.04 -u root systemctl start openclaw,然后勾选“使用最高权限运行”。
创建完之后,最好重启一次电脑验证。重启后不要手动打开 WSL,等一分钟左右浏览器直接访问 OpenClaw 地址,能打开就说明整条链路已经通了。
4. Windows 浏览器访问:从 localhost 到局域网,三种姿势全打通
4.1 默认的 localhost 转发套路
WSL2 有个非常实用的特性:localhost 转发。什么意思?WSL2 里监听端口的服务,Windows 侧直接访问http://localhost:端口就能通,不需要手动配端口映射。这是绝大多数人遇到的第一种访问方式,也是我最推荐的基础方案。
也就是说,OpenClaw 在 WSL2 里监听0.0.0.0:8787,Windows 浏览器打开:
http://localhost:8787就能看到控制台页面。实测下来这个转发非常稳定,和本机跑的 Windows 服务体验完全一致。
注意前提是 OpenClaw 监听地址必须包含0.0.0.0,至少不能只监听 WSL 内部的127.0.0.1。如果只监听回环地址,Windows 侧localhost转发也会连不上,因为转发目标是 WSL 的完整网络栈,不是 WSL 内部的回环接口。
验证方式很简单:在 Windows 的 PowerShell 里执行:
curl http://localhost:8787能返回 HTML 内容说明转发通了。如果返回curl: (56)之类的错误,大概率是监听地址问题或者服务根本没起来,回 3.2 查ss -tlnp。
4.2 局域网访问与 netsh 端口代理
localhost 访问只覆盖本机。如果想让手机、平板、公司局域网里的其他电脑访问 OpenClaw,就需要把 WSL2 的服务端口暴露到 Windows 物理网卡上。
为什么不能直接访问 WSL2 的 IP?原因很简单:WSL2 是 NAT 网络,它有一个内部 IP(比如 172.20.10.5),这个 IP 只有 Windows 宿主机能路由到,局域网其他设备根本不知道这个 IP 存在,也路由不进去。
所以需要在 Windows 上做一个端口代理,把 Windows 的某个端口转发到 WSL2 的 IP 和端口:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8787 connectaddress=172.20.10.5 connectport=8787先拿到 WSL2 的当前 IP:
hostname -I把这个 IP 填进去。然后还要放行 Windows 防火墙:
netsh advfirewall firewall add rule name="OpenClaw Web" dir=in action=allow protocol=TCP localport=8787之后局域网其他设备访问http://你的Windows主机IP:8787就能打开控制台。
但这里有个很烦的问题:WSL2 的 IP 不固定,重启后可能会变。端口代理还是指向旧 IP,访问就断了。解决办法是写一个 PowerShell 脚本,每次开机时重新拉取 WSL2 最新 IP 并刷新端口代理:
$wslIp = (wsl -d Ubuntu-22.04 -- hostname -I).Trim().Split(' ')[0] netsh interface portproxy delete v4tov4 listenport=8787 listenaddress=0.0.0.0 netsh interface portproxy add v4tov4 listenport=8787 listenaddress=0.0.0.0 connectport=8787 connectaddress=$wslIp把这个脚本挂到计划任务里,触发条件设为登录时,就能保持端口代理一直指向最新 IP。
4.3 一劳永逸的 .wslconfig:mirrored 网络模式
如果你受够了 WSL2 IP 漂移,有一个更优雅的解法:WSL2 的 mirrored 网络模式。
简单理解,开启 mirrored 之后,WSL2 共享 Windows 宿主机的网络接口,IP 地址也变成同一个。WSL2 里监听的端口,Windows 侧直接用 localhost 访问,局域网其他设备也能像访问 Windows 本机服务一样访问,不再需要 netsh 端口代理,也不再存在 IP 漂移问题。
配置方法是在 Windows 用户目录下创建.wslconfig文件(C:\Users\你的用户名\.wslconfig),写入:
[wsl2] memory=8GB processors=4 networkingMode=mirrored然后wsl --shutdown重启 WSL 使配置生效。
注意 mirrored 模式有前提:Windows 11 22H2 及以上版本,且 WSL 版本比较新。老版本 Windows 10 大概率用不了,系统会自动忽略这个配置项。
另外,如果你机器上有很多虚拟网卡或者网络类软件,mirrored 模式偶尔会出现兼容性问题,表现是 WSL2 里网络忽通忽不通。遇到这种情况,退回 NAT + netsh 端口代理方案就好,两种方案各有适用场景:
| 对比项 | NAT + netsh 端口代理 | mirrored 网络模式 |
|---|---|---|
| 适用系统 | Windows 10 / 11 均可 | 推荐 Win11 22H2+ |
| 配置复杂度 | 需要脚本维护 | 一次配置,后续不用管 |
| IP 漂移问题 | 有,需要刷新脚本 | 无 |
| 局域网访问 | 需要防火墙放行 | 天然支持 |
| 网络兼容性 | 最好 | 可能受虚拟网卡影响 |
个人建议:能开 mirrored 就开,省心太多;开不了或者遇到兼容问题再用 NAT 方案兜底。
5. 常见问题排查与避坑记录
5.1 “此计算机上未启用虚拟化”的系列报错
这个报错在论坛里每天都有人问,形态也五花八门:0x80370102、0x80370114、还有 WSL2 直接提示“无法启动,因为此计算机上未启用虚拟化”。
排查顺序基本固定:
第一步,任务管理器 → 性能 → CPU,看“虚拟化”状态。如果是“已禁用”,进 BIOS/UEFI 打开 Intel VT-x 或 AMD-V,这是硬前提。
第二步,检查 Windows 功能里“虚拟机平台”是否开启。管理员 PowerShell 执行:
dism.exe /online /get-featureinfo /featurename:VirtualMachinePlatformState 显示 Enabled 才正常。没有的话按 1.2 节的命令启用并重启。
第三步,如果 BIOS 和 Windows 功能都正常,但旧版本 Windows 还是报错,考虑升级 WSL 内核。执行:
wsl --update这套排查走下来,90% 的虚拟化问题都能解决。剩下的基本是主板固件太老或 BIOS 里虚拟化选项被“安全启动”或“内存完整性”间接关掉,需要具体机型具体查了。
5.2 服务起了但浏览器一直打不开
这是自启排查里最头疼的:“服务明明 active,怎么浏览器就是打不开?”
按以下清单逐项排查:
- 服务是否真的在监听:WSL2 里
ss -tlnp | grep 8787,没有输出说明进程没起来或端口不对。 - 监听地址是不是
0.0.0.0:只监听127.0.0.1的话 Windows 侧访问不了,去配置里改掉重启。 - Windows 侧是否通:PowerShell 里
curl http://localhost:8787,报connection refused说明转发层有问题。 - 防火墙是否挡了局域网访问:本地 localhost 访问一般不受 Windows 防火墙影响,但局域网访问必须放行端口。
- 有没有端口冲突:Windows 上别的程序占了 8787,服务起不来或者转发混乱。
之前有次折腾到半夜,最后发现是 OpenClaw 启动参数里没指定配置,默认监听127.0.0.1,启动日志还挺正常。改配置后一切正常。所以先看监听地址,再看防火墙,不要瞎猜。
5.3 自启任务没生效的几种原因
计划任务创建了,systemd 服务也 enable 了,但重启后浏览器还是打不开。常见的三种原因:
第一种,计划任务的参数写错了。wsl.exe的参数和 PowerShell 的参数解析规则不同,-u root和systemctl start openclaw之间不能有奇怪的引号或换行。先用系统 PATH 里的 wsl 手动执行一遍,确认命令本身没问题。
第二种,系统登录后 WSL 还没完全启动,计划任务太快执行导致服务没拉起来。处理办法是给计划任务加一个延迟。GUI 里可以在触发器设置“延迟任务”30 到 60 秒;命令行可以用/DELAY 60参数,或者配合 PowerShell 脚本里Start-Sleep 30。
第三种,systemd 服务 enable 失败。检查:
systemctl is-enabled openclaw输出必须是enabled。如果是disabled,回到 3.2 重新执行systemctl enable。记住,enable和start是两件事,一个管开机自启,一个管立即拉起,缺一不可。
5.4 端口被占用与内存不足
OpenClaw 的端口如果被其他程序占用了,启动可能直接失败。Windows 侧查端口占用:
netstat -ano | findstr 8787看到 LISTENING 的 PID 后,任务管理器里找到对应进程终止,或者换一个端口。
内存这块更值得注意。WSL2 默认会吃掉最多一半物理内存,如果你同时开浏览器、IDE、微信,再跑 OpenClaw,Windows 会明显卡顿。解决方法是给 WSL2 设限,.wslconfig里:
[wsl2] memory=8GB processors=4 swap=2GB这里swap=2GB是给 WSL2 内部的交换分区,别设太大,太大会拖慢磁盘。设完wsl --shutdown生效。8GB 内存的机器建议设成 4GB,16GB 内存设 8GB,留出 Windows 侧的空间。
另外,OpenClaw 和中间件如果都跑在 WSL2 里,最好在.wslconfig里给足processors和memory,否则高峰期容易 OOM。这个我在 4.3 的配置里写了,可以一起用。
整套流程走下来,我最大的感触是:OpenClaw 本身的问题其实不多,真正折磨人的是 Windows 和 WSL2 之间那层网络关系和自启链路。如果你也想折腾这套环境,我会建议先把 mirrored 模式和 systemd 配好,再装 OpenClaw,这样从一开始就不会被 IP 漂移和手动拉服务的琐事拖住。
最后再分享一个小技巧:第一次部署别急着设自启,先手动启动、手动通过浏览器访问成功一次,确认环境和配置都没问题,再上 systemd 和计划任务。拆分步骤的好处是每引入一个自动化,你都能准确判断问题出在哪一层,而不是全部叠加在一起之后,连从哪里开始排查都不知道。