如果你手头还留着那款二十多年前横版动作游戏的安装光盘,或者在某个旧硬盘的角落里翻出过它的完整安装目录,那你一定懂那种“想重温,却找不到一台能跑它的电脑”的无奈。OpenClaw 这个开源引擎重制项目,就是为了让这款经典老游戏在现代操作系统上重新“活过来”而生的。但问题在于,OpenClaw 从源码编译部署,Linux 环境最顺手,而绝大多数人的日常主力机又是 Windows——于是 WSL2+Ubuntu 就成了一个非常舒服的折中方案。
这篇分享就是我自己在 WSL2+Ubuntu 上部署 OpenClaw 的完整记录。里面既有从零开始的 WSL2 环境搭建,也有编译依赖的逐个说明、源码构建过程、游戏资源文件的准备、WSLg 图形界面运行、音频和手柄问题排查,以及最后的一些性能调优手段。不管你是想把这游戏跑起来怀旧一下的普通玩家,还是打算读一读 SDL2 游戏引擎源码的开发者,这篇内容应该都能给你省下不少弯路。
1. 为什么我把部署环境定在 WSL2+Ubuntu,而不是双系统或虚拟机
老实说,我第一次编译 OpenClaw 是在一台纯 Linux 机器上完成的,过程很顺,编译链常规,依赖也都能从系统源里直接装上。但问题在于,我平时写代码、处理文档、剪视频都在 Windows 上,总不能为了一个游戏或者说一个开源项目,动不动就重启切双系统。虚拟机我也试过,VirtualBox 里装个精简版 Linux,游戏画面倒也能出来,但那层虚拟化的图形性能损失很明显,老游戏虽然不吃显卡,操作延迟和画面撕裂却让人不太舒服。
后来我把目光转向 WSL2。用过的人都清楚,WSL2 本质是一个轻量级虚拟机,但它和 Windows 的集成度远不是传统虚拟机可比的。最直观的感受是:
- 启动速度:WSL2 的发行版启动基本在一两秒内,不用像虚拟机那样等完整的开机流程。
- 文件互访:Windows 的 D 盘资源直接挂在
/mnt/d下面,游戏资源文件从 Windows 侧复制到 Linux 侧就是一条cp命令的事。 - GUI 支持:较新版本的 Windows 自带 WSLg,能在 WSL 里直接弹出 Linux 图形程序的窗口,SDL2 写的 OpenClaw 刚好适用。
- 资源占用:WSL2 的内存和 CPU 分配可以按需配置,平时不吃性能,编译时可以临时调大。
相比之下,原生双系统最干净,但切换成本太高;传统虚拟机图形性能拉胯;WSL2 正好卡在中间,既保留 Linux 的编译体验,又不用离开 Windows 桌面。所以我的结论很明确:如果你的首要目标是“在 Windows 上把 OpenClaw 跑起来”,并且你不想折腾双系统或虚拟机,那 WSL2+Ubuntu 就是当前综合成本最低的方案。
另外提一句发行版选择。有人喜欢用 Arch 或 Fedora 的 WSL 版本,但我的建议是如果追求省心,直接上 Ubuntu 22.04 LTS。原因很简单:OpenClaw 的依赖库在 Ubuntu 的官方软件源里全都有,版本也够用,不需要自己从源码编译第三方库。有些依赖如果你用滚动发行版,反而可能因为库版本太新出现编译不兼容的问题。稳定、保守、依赖齐,这就是我选 Ubuntu 的理由。
2. WSL2 环境搭建:从 Windows 一侧到 Ubuntu 一侧
2.1 启用适用于 Linux 的 Windows 子系统
如果你用的是 Windows 10 2004 以上版本或者 Windows 11,启用 WSL2 非常简单。我建议优先走命令行方式,它会自动把需要的 Windows 功能组件打开。管理员权限的 PowerShell 或 CMD 里执行:
wsl --install这条命令默认会安装 WSL2 所需的虚拟机平台和 WSL 内核,并顺带装一个 Ubuntu 发行版。不过为了保险,我一般还会确认默认版本是 2:
wsl --set-default-version 2如果电脑之前从未开过 WSL,系统会提示你重启一次。重启之后打开“启用或关闭 Windows 功能”,检查“适用于 Linux 的 Windows 子系统”和“虚拟机平台”这两个选项是否处于勾选状态。有时候旧版本系统需要手动勾选并重启,新版本用wsl --install一般自动就处理好了。
进入 BIOS 开启 CPU 虚拟化这一步容易被忽略。你可以在 Windows 的任务管理器“性能”标签里看“虚拟化”那行是否显示“已启用”。如果显示未启用,需要重启进 BIOS 打开 Intel VT-x 或 AMD SVM,否则 WSL2 的虚拟机平台根本起不来。这也是我踩过的第一个坑,当时换了一台新机器,系统层所有组件都装好了,结果 WSL 一直起不来,排查了半天才发现是 BIOS 虚拟化关了。
2.2 安装 Ubuntu 22.04 并完成基础初始化
如果你用wsl --install时没有指定发行版,默认装的可能就是 Ubuntu 最新 LTS。想指定版本的话可以这样:
wsl --install -d Ubuntu-22.04装完之后,从开始菜单打开 Ubuntu 终端,第一次启动会让你创建用户和密码。注意这个用户不是 root,但拥有 sudo 权限。我建议不要使用 root 作为日常账号,后面编译的时候如果遇到权限问题就用 sudo,没必要在 root 环境下折腾。
进去第一件事当然是更新软件源。如果你在国内,建议先把源换成国内镜像,否则apt update的速度会让你怀疑人生。这一步不同镜像站的配置方式略有差异,我自己的习惯是直接编辑/etc/apt/sources.list,把archive.ubuntu.com替换成对应镜像域名,然后执行:
sudo apt update sudo apt upgrade -y升级完之后,用wsl -l -v确认一下当前发行版的版本号,确保显示的是 2 而不是 1。这一步很重要,因为 WSL1 不支持 WSLg,也不支持很多 Linux 特有的行为,后面运行 GUI 程序会遇到各种奇怪问题。
3. 编译依赖安装:这些包少一个,CMake 都会跟你翻脸
3.1 OpenClaw 的依赖全景
OpenClaw 不是那种“下载二进制就能跑”的闭源软件,它从源码构建需要一整套工具链和运行库。我在第一次部署的时候就是因为少装了一个 SDL2 相关包,CMake 阶段直接报错,排查了半天才发现。所以这里先把依赖讲清楚。
OpenClaw 的底层依赖大致分三块:
第一块是基础编译工具链。包括build-essential(里面含 g++、make 等)、cmake和pkg-config。pkg-config很多人会忽略,但 CMake 找 SDL2 头文件和库路径时经常要借助它,少了它后面各种NOT FOUND报错。
第二块是 SDL2 核心库。OpenClaw 是典型的 SDL2 应用,窗口创建、事件循环、纹理渲染都依赖它。具体需要libsdl2-dev、libsdl2-image-dev、libsdl2-mixer-dev、libsdl2-net-dev这四个。其中 mixer 负责混音,image 负责加载图片资源,net 主要用于网络功能。如果你只装了核心的libsdl2-dev,编译到一半会冒出“找不到 SDL_mixer.h”之类的错误。
第三块是压缩和音频编解码库。包括zlib1g-dev、libogg-dev、libvorbis-dev、libtheora-dev。这些库用于解压游戏的数据包和播放特定格式的音频流。OpenClaw 继承自原版游戏的数据资源里,音频和视频格式都比较老,这些解码库是必须的。
3.2 安装命令与验证
依赖全部可以在 Ubuntu 官方源里装,一条命令搞定:
sudo apt update sudo apt install -y build-essential cmake pkg-config \ libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev \ zlib1g-dev libogg-dev libvorbis-dev libtheora-dev安装完成后我习惯先验证一下关键库是否可用:
pkg-config --modversion sdl2 cmake --version如果pkg-config能正常输出 SDL2 的版本号(Ubuntu 22.04 上通常是 2.0.20 左右),说明依赖基本到位。这里我额外提一句:Ubuntu 22.04 自带的 CMake 是 3.22 版本,完全满足 OpenClaw 的构建要求,不需要自己折腾新版 CMake。有些新项目对 CMake 版本要求很高,但老游戏引擎重制项目通常没那么多讲究。
我很早以前也有过“既然要编译,就把所有开发库都装上”的想法,比如libsdl2-ttf-dev这种。装也不是不行,但没必要,追求最小化依赖对后续排查问题更有利。你装的库越多,将来出问题的时候越难判断到底是哪个库引起的。
4. 获取源码与首次构建:把 OpenClaw 编译出来
4.1 源码获取与克隆目录的选择
依赖装好之后,下一步就是获取源码。OpenClaw 的源码托管在 GitHub 上,直接克隆到本地。打开项目主页找到仓库地址,然后执行:
mkdir -p ~/dev cd ~/dev git clone https://github.com/openclaw-project/OpenClaw.git cd OpenClaw这里我必须提醒一个 WSL2 特有的优化点:项目目录千万不要放在 Windows 文件系统里。什么意思呢?如果你把项目克隆到/mnt/c/Users/你的用户名/Dev/OpenClaw,那实际是在 Windows 的 NTFS 分区上通过 9P 协议访问。WSL2 访问/mnt/c的 IO 性能比访问 Linux 原生文件系统慢很多,编译时大量的小文件读写会把性能拖得非常难看。
我实测过两个目录的对比:放在~/dev下,用make -j8编译大概一两分钟;放在/mnt/c下,同样的任务可能要跑十几分钟,而且 Concurrent 编译时还会频繁报文件系统锁问题。所以记住一句话:WSL2 里干活,项目放 Linux 侧,资源文件最终也放 Linux 侧。
4.2 CMake 配置与 make 编译
OpenClaw 的构建流程就是标准的 CMake 流程:
mkdir -p build cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc)-DCMAKE_BUILD_TYPE=Release是要重点说明的。默认的 CMake 构建类型是空字符串,编译器不会加优化参数,编出来的程序跑起来会明显更慢。Release 模式会开启-O2或-O3优化,对于老游戏重制引擎来说,性能差距在低配机器上非常明显。如果你是想读代码或者调试,可以改成Debug,但我玩 OpenClaw 的场景纯粹是运行时体验,所以 Release 是我的默认选择。
make -j$(nproc)很好理解,nproc会自动读取 CPU 核心数,开启并行编译。如果你在 WSL2 的.wslconfig里限制了 CPU 核心数,这里会按限制后的数量来,不会把 Windows 宿主机拖垮。
第一次编译时如果出现 CMake 报错,最常见的无非是两种:找不到 SDL2 相关库,或者 pkg-config 路径不对。前者回到上一章的安装命令检查有没有漏装;后者可以尝试清理一下 CMake 缓存再重新编译:
rm -rf build mkdir build && cd build cmake ..编译结束后,在build目录下会生成 OpenClaw 的可执行文件。仔细找的话,它可能在项目根目录或者某个子目录下。先用ls看一眼,确认文件存在,然后试运行一下:
./openclaw --help如果有--help输出,说明编译本身已经成功了。接下来的问题是,这个游戏引擎还缺游戏资源文件——这一步是很多第一次接触 OpenClaw 的人最容易卡住的地方。
5. 游戏资源文件:OpenClaw 没有素材,素材得你自己来
5.1 REZ 数据包与合法来源
OpenClaw 本身只是一套引擎代码,它不包含任何关卡、贴图、音乐和音效。这些东西全部封装在原版游戏的 REZ 数据包里。也就是说,只有引擎没有资源,程序跑起来就是一个空壳窗口,连主菜单都显示不出来。
关于资源文件的来源,我只强调一个原则:使用你自己合法拥有的游戏备份。如果你当年买过正版光盘,现在仍然保留着光盘镜像或者完整安装目录,那就没问题。把安装目录里的*.REZ文件提取出来即可。我不建议去网上找不明来路的资源包,且不说版权风险,那种资源包经常文件不完整,要么缺音频流,要么存档文件损坏,折腾到最后还是跑不起来的。
有人会问,我既没有光盘,也没有安装目录,能不能直接用 OpenClaw 自带的什么测试资源?很遗憾,开源引擎重制项目一般都严格遵守版权边界,仓库里不会附带原版数据文件。所以想玩,资源这块只能自己想办法解决。
5.2 资源目录放置与验证
拿到 REZ 文件之后,接下来就是把它放到 OpenClaw 能找到的位置。根据 OpenClaw 的惯例,它会在程序运行目录或者用户数据目录下寻找data子目录。我实际操作下来最稳妥的方式是:
- 在 Linux 侧创建一个数据目录,比如
~/.local/share/openclaw/data - 把原版安装目录里所有
*.REZ文件复制进去
mkdir -p ~/.local/share/openclaw/data cp /mnt/d/GameData/Claw/*.REZ ~/.local/share/openclaw/data/上面这个/mnt/d/GameData/Claw/是我举例的路径,实际按你自己的 Windows 目录改。资源文件放好之后,再运行 OpenClaw,它应该就能读取到数据并展示游戏画面了。
如果程序启动后仍然提示找不到数据,或者直接后退退出,可能需要用命令行参数显式指定数据目录。运行./openclaw --help看它支持的选项,不同版本的 OpenClaw 参数名可能略有不同。这种日志里一般会清楚告诉你它尝试了哪些路径,你照着把文件放到对应位置就行。我的经验是先看日志,不要盲目乱放。
另外有一点要提醒:REZ 文件的大小写要保持原样,Linux 文件系统是区分大小写的。如果你在 Windows 那边解压过,文件名可能被改成了全小写,复制过来之前先检查一下。
6. 运行 OpenClaw:WSLg、黑屏与声音问题的一次性解决
6.1 WSLg 直接显示窗口
如果你用的是较新的 Windows 11 或 Windows 10 21H2 以上版本,WSLg 是默认开启的。在 Ubuntu 终端里直接运行:
cd ~/dev/OpenClaw/build ./openclaw正常情况下一两秒就会弹出一个 SDL2 窗口,这就是 WSLg 在起作用。WSLg 的本质是 Windows 自带的 Wayland/X Server 桥接,Linux 图形程序通过它直接显示到 Windows 桌面,不需要额外安装任何 X Server,体验上和原生 Windows 程序差不多。
你可以用echo $DISPLAY看看环境变量。在 WSLg 下通常显示的是:0或者类似值。如果DISPLAY为空,说明 WSLg 没有正常工作,这时候图形程序是无法弹出的。
6.2 黑屏、闪退与显示问题的排查
我遇到的第一个显示问题不是黑屏,而是窗口弹出来之后界面上什么都没有,动几下鼠标就崩溃。排查下来发现是 SDL2 默认尝试 Wayland 后端,在某些 WSLg 版本的 X/Wayland 转换下不稳定。解决方法是强制 SDL2 使用 X11 后端:
export SDL_VIDEODRIVER=x11 ./openclaw如果你跑的是旧版 WSL(没有 WSLg),那就只能走外挂 X Server 的路子了。Windows 侧安装 VcXsrv 之类的 X Server 工具,启动后在 WSL 里设置:
export DISPLAY=:0这个方案能跑,但窗口合成性能和输入延迟都不如 WSLg 舒服。我的建议是:如果系统支持 WSLg,优先用 WSLg;WSLg 黑屏才考虑回退 X Server。
另外,如果你在 Windows 侧开了高 DPI 缩放,SDL2 窗口可能会出现模糊或尺寸错乱。这时候可以在 Windows 侧把对应终端程序(Windows Terminal 或 Ubuntu 窗口)的兼容性属性里设置高 DPI 缩放替代,让 WSLg 渲染走正常的缩放逻辑。这个问题出现频率不高,但值得知道。
6.3 音频问题的处理思路
OpenClaw 使用的是 SDL2_mixer,音频输出默认走 PulseAudio 或 PipeWire。在 WSLg 环境中,音频会自动桥接到 Windows 音频设备,理论上开箱即用。但我实际遇到的情况比较搞笑:背景音乐正常播放,音效却时有时无,后来发现是 SDL2_mixer 初始化时声道数设置和我的声卡配置不匹配导致的。
解决方法是先确认 WSL 里有没有音频服务在跑:
pactl info如果提示找不到pactl,就先安装 PulseAudio 工具集:
sudo apt install -y pulseaudio-utilsWSLg 开启后,PulseAudio 服务通常已经从 Windows 侧桥接过来。如果pactl info能看到服务器信息,声音通道就是通的。音频失调或者爆音,可以尝试把 SDL_AUDIODRIVER 指定为pulseaudio:
export SDL_AUDIODRIVER=pulseaudio如果实在解决不了,也不用太纠结。毕竟这是老游戏,很多人玩的时候是关声音的,不会影响核心体验。
7. WSL2 下的运行调优:从编译加速到流畅运行的细节
7.1 数据文件放哪里,直接影响加载速度
我在前面已经提过项目目录不要放在/mnt/c,游戏资源文件同样如此。OpenClaw 运行时需要加载大量的贴图、音频块和动画文件,这些文件如果放在 NTFS 分区上,每次读取都要经过 9P 协议换算,加载起来会有肉眼可见的卡顿。
我建议把整个 OpenClaw 数据目录放在 Linux 侧。如果你真的想在 Windows 侧管理存档或资源,可以通过符号链接把 Linux 侧目录指过去,但读取损耗还是存在。总之,性能最优的方案就是:所有 Linux 侧程序的数据全部放 Linux 侧,Windows 文件只做一次性导入。
7.2 通过 .wslconfig 调整内存与 CPU
默认情况下,WSL2 会使用宿主机一部分内存和 CPU,具体的分配策略自动管理。但对编译场景来说,默认限制可能不够爽。在 Windows 用户目录下创建一个.wslconfig文件(如果不存在),内容可以这样写:
[wsl2] memory=8GB processors=6 swap=4GB localhostForwarding=true其中memory是 WSL2 最大可用内存,processors是最大可用 CPU 核心数。配置改完后要让 WSL2 重新加载,在 PowerShell 里执行:
wsl --shutdown然后再重新打开 Ubuntu 终端,用free -h和nproc确认配置生效。我这样调过之后,编译 OpenClaw 的并行度提升明显,资源加载和场景切换也更流畅。
不过要注意,memory和processors也不是越大越好。如果你宿主机总共才 16GB 内存,给 WSL 塞 12GB,Windows 侧开几个浏览器加微信可能就卡了。我的建议是给 WSL 分配不超过宿主机内存的一半,日常使用完全够。
7.3 GPU 直通对老游戏的意义
WSL2 支持 GPU 加速直通,但对 OpenClaw 这种 2D 游戏来说,真正的需求很低。SDL2 默认的 renderer 使用软件绘制也能跑得动,所以我个人认为,专门为 OpenClaw 配置显卡直通没有必要。如果你后续还打算在 WSL2 里跑其他 3D 应用或者 OpenGL 项目,那另说,但本文的场景就到这为止。
8. 手柄输入与按键自定义:复古游戏的操控方案
8.1 用 usbipd-win 把手柄直通进 WSL2
WSL2 默认不能直接访问 USB 设备。你插一个游戏手柄,Windows 能识别,但 WSL 里的 Linux 系统看不到它。要让 OpenClaw 识别手柄,最通用的方案是微软提供的usbipd-win工具。
首先在 GitHub 上获取usbipd-win的安装包,装好之后在管理员 PowerShell 里查看当前连接的 USB 设备:
usbipd list记下你手柄对应的 BUSID,比如2-1,然后先把它 attach 到 WSL:
usbipd attach --wsl --busid 2-1在 WSL 终端里用lsusb确认设备是否成功挂载。如果能看到手柄,SDL2 的 joystick 接口就能正常识别。OpenClaw 启动后,进入控制设置就能映射手柄按键。
这里有个小经验:每次重新插拔手柄,都需要重新执行一次 attach。Windows 系统重启后,之前绑定的设备也不会自动挂到 WSL,需要走一遍流程。如果你想省事,可以写个脚本一键执行。
8.2 键盘按键与配置文件
如果你和我一样懒得折腾手柄直通,那键盘也完全能玩。OpenClaw 作为引擎重制项目,按键配置通常放在用户目录的配置文件中。文件位置一般在~/.local/share/openclaw/下,具体名字可能因版本而异。
我习惯先把默认配置跑一遍,把按键映射打印出来,再改成自己舒服的布局。比如方向键、跳跃、攻击这几个核心操作,我通常会重新映射到键盘左侧区域,这样左手控制方向,右手放技能和跳跃,玩起来更顺手。修改配置时要注意格式,备份原文件再改,改坏了至少还能还原。
如果手柄和键盘都想要,配置里一般也支持多设备并行。只要你那部分代码没有被 OpenClaw 砍掉,插上手柄后键盘和手柄可以同时操作,这在双人场景下尤其有用。
9. 我踩过的坑和 OpenClaw 部署问题速查表
整个部署过程中,我前前后后踩了不少坑,最后汇总成一张速查表。以后你如果在 WSL2+Ubuntu 上部署 OpenClaw 遇到问题,对照着查,大概率能省一两个小时折腾时间。
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
wsl命令不存在或安装失败 | Windows 版本过旧或未开启虚拟机平台 | 更新系统,启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”,打开 BIOS 虚拟化 |
| WSL 发行版始终是 1 而不是 2 | 默认版本未设置或内核未安装 | 执行wsl --set-default-version 2,必要时更新 WSL 内核 |
| CMake 提示找不到 SDL2 | 缺少libsdl2-dev或pkg-config | 重新安装依赖包,确认pkg-config --modversion sdl2有输出 |
| 编译速度极慢 | 项目目录放在/mnt/c挂载的 Windows 文件系统上 | 把源码移到 Linux 侧路径,比如~/dev |
| 窗口弹出但黑屏 | SDL2 默认 Wayland 后端不稳定 | export SDL_VIDEODRIVER=x11后重新运行 |
| 没有声音或音效卡顿 | SDL_AUDIODRIVER 未指定或 PulseAudio 服务异常 | export SDL_AUDIODRIVER=pulseaudio,检查pactl info |
| 找不到 REZ 资源文件 | 数据目录路径不正确 | 观察程序日志提示,把资源放到~/.local/share/openclaw/data |
| 手柄没反应 | WSL2 需要 USB 设备直通 | 安装usbipd-win,用usbipd attach --wsl挂载手柄 |
| 字体模糊或窗口尺寸异常 | Windows 高 DPI 缩放影响 WSLg | 调整终端程序的高 DPI 缩放替代设置 |
除了表格里这些,我还有一个体会想分享:遇到问题先看日志,别急着瞎猜。OpenClaw 作为开源项目,日志输出虽然不算丰富,但关键错误信息都会打印到终端或者日志文件里。比如资源路径加载失败,它会明确告诉你尝试了哪些目录;音频设备初始化失败,它会打印 SDL 的底层错误。学会顺着日志定位,基本能解决八成以上的问题。
最后再补充一条小经验:如果你在编译过程中改了源码或者更新了依赖,重新编译时不一定要删掉整个 build 目录,直接再跑一次cmake ..和make即可。CMake 会做增量编译,能省下不少时间。只是当你改了 CMakeLists.txt 或者更换了依赖库位置时,为了干净起见,删掉CMakeCache.txt重新配置更保险。
老实说,在 WSL2 里折腾 OpenClaw 这件事,技术上并不复杂,真正的价值在于把“Windows 上玩 Linux 老游戏”这条路彻底走通了。整个流程走完之后,你会发现自己不光学会了一套工具箱,还顺带把 Linux 编译环境、SDL2 应用部署、WSL 调优这些知识全过了一遍。以后想跑别的开源项目,思路也能直接复用。如果你在部署中卡住了,欢迎回来对照速查表,祝一次跑通。