刚帮朋友在一台完全断网的内网机器上把 WSL Ubuntu 24.04 跑起来,并且把 OpenClaw 的依赖环境铺完了。整个过程听着简单,实际操作时踩了不少坑,值得记录一下。这里的“铺路”不是标题党——OpenClaw 这类工具装起来不难,难的是它依赖一套干净的 Linux 用户态环境,而绝大多数人手上正好只有一台不能联网的 Windows 机器。这篇文章就是针对这个场景的完整离线安装方案,包括我试过的所有路径、参数细节和最终选择,适合正在做离线开发环境、内网服务器初始化,或者单纯想在没网的笔记本上用 WSL 跑 Linux 工具的人。
标题里提到的关键动作是“WSL 离线安装”和“Ubuntu 24.04”,核心诉求有两个:一是绕开在线安装依赖,二是让 OpenClaw 能在一个标准的、自带 systemd 的 Linux 发行版里跑起来。我前后试了三种方案,踩了大大小小十几个坑,最后梳理出一条最稳的路线。下面从选型思路开始讲,再到实操和排查,全程按我实际执行的顺序写,你照着抄基本能成。
1. 为什么偏偏是 WSL、偏偏是 Ubuntu 24.04
1.1 WSL 到底解决了什么问题
WSL 全称 Windows Subsystem for Linux,它让你在 Windows 上直接跑 Linux 用户态程序,不需要虚拟机软件,也不需要双系统重启。对普通人来说,最直观的体验是在 Windows 的终端里敲sudo apt、systemctl、gcc这些命令,而背后是一个完整的 Ubuntu 系统目录。WSL 2 更是把 Linux 内核也搬了过来,性能接近原生,I/O 大幅改善,所以现在很多开发者的主力运行环境其实就是 WSL。
但你要注意,WSL 不是“模拟器”,也不是“容器”,它是一个介于虚拟机和系统调用翻译之间的实现。WSL 2 本质是轻量虚拟机加定制内核,它的配置文件、根文件系统、启动器都是可以独立迁移的。这就为离线安装提供了可能:你完全可以在能联网的机器上装好一套 Ubuntu 24.04,然后整体打包,搬到断网机器上导入。
1.2 为什么版本选 Ubuntu 24.04
Ubuntu 24.04 是 LTS 版本,支持周期拉得很长,做事稳妥。更重要的是它自带的 glibc 版本比较新,OpenClaw 这类依赖现代 Node.js、Python 3.12、系统级共享库的工具,在旧版 Ubuntu 上经常因为 glibc 太老直接拒绝安装。我最早在一台 Ubuntu 20.04 上试过,OpenClaw 的某个依赖二进制一启动就报version GLIBC_2.34 not found,这就是典型的系统库版本不够。换到 24.04 之后,这类问题基本绝迹。
1.3 哪些场景真的需要离线安装
离线安装不是没事找事。实际工作中最常见的场景是内网开发机、涉密实验室、没有外网的终端设备,还有那种公司统一安装的锁网办公电脑。这类机器通常有着严格的网络策略,不允许连外网,但开发需求又真实存在。另一种常见情况是临时搭建离线培训环境——把一个装好的 WSL 环境拷贝到几十台机器上,比逐台在线安装快太多。所以离线安装的核心思路不是“绕开网络”,而是“提前制作好可迁移的可运行环境”。这也是为什么我一上来就强调,先准备一台能联网的“制作机”。
2. 离线安装的三条路线,我帮你对比清楚了
2.1 在线虚拟机上先装好,然后整体导出
这是最推荐的方式,也是本文最终的方案。流程是:在一台能联网的 Windows 机器上安装 WSL 和 Ubuntu 24.04,配置好 root 用户、软件包、中文字体等所有环境,然后用wsl --export把整个发行版导出成一个 tar 包(或者带压缩的 vhdx 镜像),拷贝到离线机器的 Windows 系统中,再用wsl --import导入。
这套方案的优势是直接保留所有已安装的软件和配置,离线机器上不必重新下载任何东西。缺点是需要你至少有一台能联网的 Windows 环境,而且制作机和你目标机的 WSL 版本最好保持一致,否则可能出现元数据不兼容。
2.2 直接导入官方 rootfs 镜像
WSL 的发行版安装本质上就是把一个 rootfs(根文件系统)解压到指定目录。所以你也可以绕过“制作机”,直接下载 Ubuntu 24.04 的 rootfs tar 包,在离线机器上wsl --import即可。
这个方案的优点是体积小、步骤少,官方 rootfs 只有几十 MB,拷起来方便。缺点也很明显:rootfs 是最小系统,没有 systemd 完整配置,缺少很多基础工具,连sudo、vim都可能没装。你离线导入后还得手动处理依赖,麻烦程度直线上升。所以它更适合那些对系统洁净度有执念、或者需要从零定制系统的人,不适合拿来跑 OpenClaw 这种开箱即用的工具。
2.3 使用 Appx 包离线安装发行版
WSL 的发行版在商店里其实是以 Appx 包形式分发的。你可以想办法获取到对应发行版的“.appx”文件,然后在离线机器上双击安装。但这条路我不太推荐,因为 Appx 包安装后,它仍然依赖在线的应用商店基础服务,而且包内封装的还是 rootfs,只是包了一层安装器。更关键的是,不同版本的 WSL 对 Appx 包的签名要求不同,离线环境下证书链缺失会导致安装失败,你要额外处理签名证书问题。除非你的目标机器本身就是已经联网激活过商店的企业环境,否则不建议一开始就选这条路。
三者的路线图我用一个对比表总结:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 在线制作 + export/import | 保留完整环境,软件依赖一次到位 | 需要有联网机器,包体积较大 | 大多数需求,推荐首选 |
| 官方 rootfs 导入 | 体积小、路径直接 | 系统空,依赖处处要自己补 | 喜欢从零搭建、需要最小系统的人 |
| Appx 包离线安装 | 操作符合商店习惯 | 签名事务多,容易失败 | 已准备好 Appx 且目标机商店环境完整的情况 |
我最终选了第一套,因为它最贴近“铺路”这个任务:我要的不只是装一个系统,而是让 OpenClaw 可以稳定安装运行。把环境配置留在制作机,离线机器只做导入,相当于把最费时间的依赖解析工作提前做完了。
3. 实操全流程:从联网机器到断网机器
这一部分是我这次完整跑通的记录,步骤多但每一步都很关键,建议按顺序执行。
3.1 在制作机上安装并初始化 Ubuntu 24.04
制作机的 Windows 版本尽量更新,至少是 Windows 11 或者较新版本的 Windows 10。先确保 WSL 本身可用,在管理员权限的终端里执行:
wsl --install wsl --install --distribution Ubuntu-24.04如果执行后发现wsl命令不存在或者版本是旧版,先升级 WSL 本身。老版本 WSL 的离线导入会有很多兼容问题,后面会细说。安装完成后先进入系统,做基本的初始化:
sudo apt update sudo apt upgrade -y这里有一个容易被忽视的细节:升级内核包和基础系统是为了让后续导出的 tar 包尽可能完整,而不只是为了让当前系统“能用”。离线机器上没法在线升级,所以你在制作机上更新得越彻底,离线机器上踩“系统组件版本过旧”的坑就越少。
然后我顺手配置了基础环境和后面离线要用到的打包工具:
sudo apt install -y tar gzip vim curl wget ca-certificates3.2 配置 systemd 和默认用户
Ubuntu 24.04 的 WSL 默认 systemd 是开启的,但如果你用的是旧版本 WSL 或从 rootfs 导入,就不一定了。systemd 对 OpenClaw 这类依赖 systemctl 开出服务、使用日志系统的应用至关重要。
配置文件路径是/etc/wsl.conf,我最终的内容是:
[boot] systemd=true [user] default=你的用户名 [network] generateResolvConf=true [interop] enabled=true appendWindowsPath=true这一段解释一下每项作用。systemd=true让 WSL 启动后自动运行 systemd 作为第一个进程,否则很多服务的enable、start操作都会失效。default=你的用户名指定启动 WSL 时默认以哪个用户进入,不写的话可能落到 root 或不知道的随机用户。generateResolvConf=true表示自动生成 DNS 配置,离线环境通常没有 DNS,不生成反而省事,不过保留 true 可以避免它在联网机器上解析出错。interop允许你在 Linux 里调用 Windows 的 exe 文件,这对复制文件、调用编辑器有帮助。
改完配置文件后重启 WSL(在 Windows 终端执行wsl --shutdown,然后重新进入),用systemctl验证一下:
systemctl is-system-running如果返回running,说明 systemd 已经正常接管。
3.3 预装 OpenClaw 需要的核心依赖
OpenClaw 的安装通常需要 Pip 、Node.js 和基本的编译工具链。虽然我不建议把 OpenClaw 本体直接装好再导出——因为拷贝后的环境如果有网络策略变化,配置容易错乱——但核心依赖必须提前准备。
我实际安装的软件包是:
sudo apt install -y python3 python3-pip python3-venv nodejs npm git build-essential libssl-dev libffi-devPython 和 Node 版本要注意。Ubuntu 24.04 自带的 Python 3.12 和 Node.js 18 都足够新,不需要额外折腾版本管理工具。如果你要跑的是需要特定 Python 版本的虚拟环境,建议直接用python3 -m venv建好并保存依赖,后面离线机器上也能直接用,不用重复安装。
这里我额外做了一步:把 pip 的离线依赖包目录建好。在制作机上执行:
pip download openclaw -d ./offline-pip-packagespip download 会把 OpenClaw 及其所有 Python 依赖的.whl或.tar.gz文件下载到本地目录,之后拷到离线机器上只管pip install --no-index --find-links即可。这一步非常关键,是后面离线安装 OpenClaw 的核心保障。
3.4 导出 WSL 发行版:wsl --export 的细节
导出动作需要先把 WSL 彻底关闭,否则文件系统被占用,导出可能出错。
wsl --shutdown wsl --export Ubuntu-24.04 ubuntu204-wsl.tar这里默认导出的是 tar 包格式,体积通常 4GB 以上。如果你觉得拷贝不方便,可以用--vhd参数导出成虚拟磁盘镜像,但 VHD 文件一般更大。更实用的做法是导出后压缩:
tar -czf ubuntu204-wsl.tar.gz ubuntu204-wsl.tar实测压缩率大概 60%-70%,从 5GB 压到 3GB 左右,拷 U 盘的时间可以省不少。但要注意,导入端如果读取的是 gz 压缩包,wsl --import 是能直接处理的,无需先解压。
3.5 离线机器导入 WSL 发行版
离线机器上先确认 WSL 功能可用。如果这台 Windows 完全没装过 WSL,你需要先启用系统功能。在管理员终端执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启系统。如果机器之前装过 WSL 但版本很老,建议先升级 WSL 到支持 24.04 的版本。离线机器怎么升级?把制作机上的 WSL 安装包拷贝过去即可,这个是纯离线可行的。
接着创建目标目录并导入:
mkdir D:\WSLUbuntu24 wsl --import OpenClawUbuntu D:\WSLUbuntu24 D:\ubuntu204-wsl.tar.gzOpenClawUbuntu是发行版在 Windows 侧的别名,随便取,但建议别带特殊字符,方便命令行调用。导入完成后进入系统:
wsl -d OpenClawUbuntu如果导入过程提示“操作出现错误”或者“文件无法访问”,多数是 WSL 版本太旧不支持新 tar 元数据,优先级最高的动作就是把制作机的 WSL 组件打包拷过来升级。
3.6 修正导入后的默认用户和 DNS 配置
导入的发行版默认很可能是 root 用户登录。这有两个不良后果:一是 OpenClaw 当前版本不推荐直接 root 跑,二是后续文件权限错乱。修正方法是进入系统后编辑/etc/wsl.conf,在[user]节里补上你的普通用户名。如果你还没有普通用户,先创建:
useradd -m -s /bin/bash 你的用户名 echo "你的用户名 ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/你的用户名然后在 Windows 终端执行wsl --shutdown再重新进入,确认当前用户已经变成普通用户。
离线机器经常没有 DNS,表现为apt update时大量域名解析超时。解决办法是把软件源指向本地的离线仓库,或者直接编辑/etc/resolv.conf写一个内网 DNS 地址。如果你根本没有内网 DNS,最省事的方法是把软件源全部改成file://指向本地临时拷贝的 deb 包目录,同时禁用自动解析:
sudo cp /etc/resolv.conf /etc/resolv.conf.bak echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf sudo chattr +i /etc/resolv.conf注意,chattr +i这个操作会锁住文件,防止 WSL 每次启动时自动覆盖回动态配置。如果你后面需要恢复联网,记得先sudo chattr -i /etc/resolv.conf再改内容。
4. 踩坑指南:这些坑我几乎全都踩过一遍
4.1 坑一:WSL 版本老旧,导入报错或 systemd 起不来
这是最容易遇到的坑。很多 Windows 10 机器自带的 WSL 是老版本,根本不认识 24.04 的新 tar 元数据。我一开始在一台 Windows 10 旧机器上直接 import,报错信息很笼统,就说“无法找到指定的文件”,我一度以为是压缩包损坏,查了半天发现是 WSL 太老。
解决办法非常明确:离线拷贝新版 WSL 安装组件过去升级。具体做法是在制作机下载最新的 WSL 发行包(通常是.msi或.msixbundle形式),拷贝到离线机器安装。装完后再跑wsl --version确认版本号,再重新导入。
4.2 坑二:导出的系统在离线机器上没有默认用户
你可能会想,我制作机上明明配好了普通用户,为什么导过去登录还是 root?这其实是 WSL 导出/导入的一个经典细节:wsl --export并不会把你 Windows 侧设置的默认用户信息一并带走。这个设置保存在 Windows 的发行版注册信息里,而不是 Linux 根文件系统里。
所以导入后第一件事就是检查用户身份:
whoami id如果是 root,就按 3.6 节的步骤创建并指定普通用户,然后wsl --shutdown重进。注意,/etc/wsl.conf里的default项只对新登录生效,不重启 WSL 是不行的。
4.3 坑三:glibc 版本不匹配,程序启动报 GLIBC 错误
如果你拿到的是别人做的精简 rootfs,或者选了 Ubuntu 20.04 之类的旧版本,装 OpenClaw 很可能报GLIBC_2.34 not found。这个错误的本质是程序编译时链接的 glibc 符号版本比系统提供的更高。离线环境没法apt upgrade拉新库,所以一定要提前选对基础镜像版本。
最佳方案就是本文选择的 Ubuntu 24.04。如果已经导入旧版系统,另一个补救方式是拷贝高级版本的 libc6 及其依赖 deb 包手动安装,但风险不小,容易把系统搞炸。亲测不建议。
4.4 坑四:离线 apt update 失败,软件包装不上
离线机器上执行apt update大概率是失败或不满足的,因为更新源指向互联网。解决办法是制作机上把需要的所有依赖下载成 deb 包,在离线机器上用本地仓库。
我的操作流程是:
# 制作机上 mkdir -p /tmp/offline-apt cd /tmp/offline-apt apt-cache depends python3-pip | grep Depends | awk '{print $2}' | sort -u > deps.txt xargs -a deps.txt apt download apt download python3-pip然后把整个目录拷到离线机器,写本地源:
sudo cp -r offline-apt /var/cache/offline-apt echo "deb [trusted=yes] file:/var/cache/offline-apt ./" | sudo tee /etc/apt/sources.list.d/offline.list sudo apt update sudo apt install -y python3-pip这个法子能解决绝大多数系统包缺失问题。要注意apt download只下载当前架构的包,如果你的离线机器是 ARM64 而制作机是 x86_64,就要在制作机上指定--option=APT::Architecture=arm64,或者直接在 ARM64 制作机上下载。
4.5 坑五:图形界面和中文显示问题
OpenClaw 本身是纯命令行服务,但如果你后续想跑桌面端辅助工具或者看日志,WSLg 就很重要。新版本 WSL 自带 WSLg,Windows 桌面可以直接显示 Linux 图形程序。前提是两个条件:一是 WSL 版本够新,二是导入时别用太精简的 rootfs,否则缺 X11 库、缺/tmp/.X11-unix目录。
如果你发现图形程序报display not set,手动指定一下环境变量即可:
export DISPLAY=:0 export WAYLAND_DISPLAY=wayland-0中文乱码则是字体缺失问题。爱折腾的人可以提前在制作机上装:
sudo apt install -y fonts-noto-cjk省得离线机器上一屏幕方块字。
4.6 坑六:pip 离线安装时卡在“Building wheel”或编译超时
离线机器用pip install --no-index --find-links=./offline-pip-packages openclaw时,如果你的离线包目录里缺了某个依赖的 wheel,pip 会尝试从源码编译,这在没有编译器或者内存不足的机器上非常痛苦,甚至直接卡死。
我的建议是制作机上用pip download --platform manylinux2014_x86_64 --only-binary=:all:生成纯二进制 wheel 包,优先避免源码编译:
pip download openclaw \ --dest ./offline-pip-packages \ --only-binary=:all: \ --platform manylinux2014_x86_64 \ --python-version 3.12 \ --implementation cp \ --abi cp312导入离线机器后,用pip install --no-index --find-links=./offline-pip-packages openclaw安装。如果某个包确实只有源码版,我建议单独处理或者换一个功能等价的轮子包,不建议硬编译。
5. 离线包管理方法论:提前把“依赖森林”打包
5.1 apt 层面:构建本地 deb 仓库
离线系统的包管理核心思路是构建一个本地 deb 仓库。做法我之前已经提过:在制作机上用apt-cache depends递归地找依赖,然后用apt download逐个下载。但这里有个进阶技巧:直接使用apt-get install --reinstall --download-only。
sudo apt-get install --download-only --reinstall python3-pip这个命令会把 python3-pip 及其全部依赖直接下载到/var/cache/apt/archives/,省去手动解析依赖的时间。然后把整个 archives 目录拷贝到离线机器,用dpkg -i *.deb或者配置本地源安装。
注意一点:用dpkg -i手动安装 deb 是不会自动处理依赖的,但如果你把仓库里所有 deb 都放一起,然后逐个dpkg -i,依赖顺序错了会报错。所以我始终推荐用本地源方式,让 apt 自己解析依赖关系,省心。
5.2 pip 层面:锁定版本和哈希
Python 依赖的离线处理比 apt 复杂,因为你既要保证包都下载齐,又要尽量保证版本一致。我通常会在制作机上准备一个requirements.txt,然后用pip download -r requirements.txt下载,保存后把requirements.txt和一整个wheelhouse/目录一起拷贝。
离线机器上安装时,除了加--no-index --find-links,建议再带--no-cache-dir,避免它尝试频繁访问网络:
pip install --no-index --find-links=./wheelhouse --no-cache-dir -r requirements.txt如果需要保证包完整性,可以在离线机器上执行pip install --require-hashes -r requirements.txt,但前提是 requirements.txt 里每一行都带哈希值。哈希值可以在制作机上用pip freeze加上hash属性自动生成,也可以借助打包工具自动追踪。
5.3 npm 层面:离线缓存一把梭
OpenClaw 的安装通常还会拉取 npm 包。npm 比 pip 还有意思,它自带缓存机制,在制作机上安装一次之后,~/.npm目录里就有全部依赖缓存。你只需要把整个~/.npm目录拷贝到离线机器的相同位置,然后在离线机器上执行安装命令,它会自动命中缓存。
命令层面,你也可以先执行一次:
npm pack openclaw然后把打包好的 tgz 拷贝过去,用npm install ./openclaw-x.x.x.tgz离线安装。不过这个方法只适合一个包,如果依赖树很复杂,还是建议直接拷贝.npm缓存。
6. OpenClaw 离线安装的最终落地要点
6.1 为什么 OpenClaw 需要这套环境
OpenClaw 是一个开源的个人 AI 助理系统,涉及自然语言处理、插件系统、任务编排等多个模块。它的安装脚本虽然简单,但对运行环境要求明确:Python 3.10+、Node.js 18+、可用的 systemd 服务管理、以及若干系统级共享库。在 WSL Ubuntu 24.04 上跑一套完整环境,比在原生 CentOS、或者精简 Alpine 容器里折腾要轻松得多,主要原因是 24.04 的库版本足够新,依赖冲突少。
6.2 离线安装 OpenClaw 的完整命令
假设你已经把 wheelhouse 和 dependencies 拷贝进了离线机器,执行:
python3 -m venv ~/openclaw-venv source ~/openclaw-venv/bin/activate pip install --no-index --find-links=./wheelhouse openclaw openclaw --quickstart如果你还需要安装额外的 CLI 插件,npm 部分直接:
npm i -g openclaw-cli --offline--offline标志会强制 npm 使用本地缓存,不发起网络请求。
6.3 网络策略变化时的应对策略
有时候离线机器本身是有内网环境的,只是没有公网访问。这种情况下,你可以把制作机上的 apt 源、pip 源、npm 源都指向一个内网仓库地址,更高效。但需要注意,一旦你在离线机器上执行过apt update且源不可达,apt 会生成一个损坏的列表缓存。下次再切回本地源时,建议先清理:
sudo rm -rf /var/lib/apt/lists/* sudo apt update这套操作我在几个项目现场都用到过,基本每次都能救急。
7. 高频问题排查速查表
我把这次过程中最有价值的排查场景整理成一张表,遇到问题先按图索骥。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 导入报“无法找到指定的文件” | WSL 版本旧 | 离线升级 WSL,重启后重试 |
| systemctl 命令不存在 | systemd 未启用 | 检查 /etc/wsl.conf,启用 boot.systemd=true |
| 进入系统后默认是 root | 导入时未指定默认用户 | 建普通用户,改 wsl.conf [user] 节,重启 WSL |
| apt update 一直超时 | DNS 缺失或源不可达 | 改本地文件源或固定 resolv.conf,配置 file:/// |
| pip install 报找不到匹配分发 | wheel 目录不完整 | 制作机重新 pip download,用 --only-binary |
| 图形程序无显示 | WSLg 缺失或版本旧 | 升级 WSL,确认 DISPLAY 环境变量 |
| 中文全变方块 | 字体缺失 | 制作机上预装 fonts-noto-cjk |
| OpenClaw 启动报 GLIBC 错误 | 基础系统 glibc 过旧 | 换 Ubuntu 24.04,或升级系统核心包 |
这张表里的解决方案我全部实测过,尤其是“WSL 老旧”和“glibc 过旧”这两个,属于离线安装中最让人头疼的硬骨头。张表外补充一句:离线环境下的排查思路一定要遵循“先确认版本,再改配置,最后动依赖包”的顺序,不要跳过第一步直接去改源或者重装包,那样很容易把自己绕进去。
我个人在实际操作中的体会是,离线环境的难点从来不是“不会安装”,而是“环境不标准”。只要制作机的系统版本和依赖版本和你最终目标一致,整个离线过程就是一次简单的复制粘贴。最后再分享一个小技巧:做完整个流程之后,不用急着把制作机删掉,留着那台制作机等于保留了一个“环境模板”,下次再碰到离线机器,直接把 tar 包和新文档一拷,十到二十分钟就能复现一套干净可运行的环境。这个模板价值比单次安装大得多,建议你把它压缩保存好,当作自己的离线安装随身工具箱。