OpenClaw WSL 节点文件读写踩坑全记录：三次血泪教训，终于找到正确姿势
前提：OpenClaw Gateway 部署在 Linux 服务器上，Home 节点跑在 Windows WSL2 Ubuntu 里。背景我的 OpenClaw 架构：Gateway：Linux 服务器（192.168.31.113）Home 节点：Windows 11 + WSL2 Ubuntu（桌面在 F:\Desktop）Work 节点：公司电脑 WSL2需要通过 OpenClaw 远程操作 Home WSL 节点上的文件，读写 Windows 分区的项目代码。踩坑1：exec 看不到 Windows 盘符现象# WSL 终端里一切正常 likefr@DESKTOP-4F1J92R:~$ ls /mnt/f/Desktop/ 01-项目代码 02-压缩包 ... # 但 OpenClaw exec 命令看不到 $ ls /mnt/f/Desktop/ ls: cannot access '/mnt/f/Desktop/': No such file or directory原因OpenClaw 的 exec 命令跑在节点进程的 mount namespace 里。WSL 的 Windows 盘符（C/D/E/F 盘）是通过 drvfs（9p 文件系统）动态挂载的，如果挂载发生在节点进程启动之后，exec 就看不到。验证方法# 在 exec 里检查 mount | grep drvfs # 空！ cat /proc/self/mountinfo | grep 9p # 空！ ls /mnt/f/ # 空 # 在 WSL 终端里检查 mount | grep drvfs # 能看到所有盘符解决方案方案A：/etc/fstab 预挂载（推荐）在 WSL 的 /etc/fstab 里预先声明所有盘符，这样 WSL 启动时就挂好：sudo tee -a /etc/fstab << 'EOF' C: /mnt/c drvfs defaults 0 0 D: /mnt/d drvfs defaults 0 0 E: /mnt/e drvfs defaults 0 0 F: /mnt/f drvfs defaults 0 0 G: /mnt/g drvfs defaults 0 0 H: /mnt/h drvfs defaults 0 0 EOF然后 wsl --shutdown 重启 WSL。方案B：system service + ExecStartPre 挂载把 OpenClaw 节点改成 system 级 service（root 权限），在启动前挂载：# /etc/systemd/system/openclaw-node.service [Service] ExecStartPre=/bin/bash -c 'until [ -d /mnt/c/Users ]; do sleep 1; done' ExecStartPre=/bin/bash -c 'mkdir -p /mnt/f && mount -t drvfs F: /mnt/f 2>/dev/null; true' ExecStartPre=/bin/bash -c 'mkdir -p /mnt/d && mount -t drvfs D: /mnt/d 2>/dev/null; true' ExecStart=/usr/bin/openclaw node run --host YOUR_HOST --port 443 --tls --display-name "Home"⚠️ 注意：普通用户的 user service 没有权限 mount，必须用 system service（root）。踩坑2：WSL cat > 写 Windows 文件为空现象# exec 里 cat > 写文件，看似成功 echo "hello" > /mnt/f/Desktop/test.txt # 但 Windows 侧看到文件 size=0！ # PowerShell 确认 PS> (Get-Item F:\Desktop\test.txt).Length 0原因WSL 的 sh/bash 通过 cat > 写到 /mnt/f/ 或 /mnt/c/ 的文件，Windows 侧看到 size=0。这是 9p 文件系统的缓存问题，在某些 mount namespace 配置下会出现。验证# 用 PowerShell 单引号 here-string 可以写（不解析 ${}） # 但需要 .ps1 文件方式调用解决方案不要用 exec 的 cat/echo 写 Windows 文件！ 用 OpenClaw 的 file_write 工具。踩坑3：exec 路由到了 Gateway 而不是 WSL 节点现象所有 exec 命令都在 Gateway（Linux 服务器）上执行，而不是 WSL 节点：hostname # 输出：multi-server（这是 Gateway 服务器，不是 WSL）原因OpenClaw 的 agent 配置里 tools.exec.node 绑定了节点 ID。如果绑错或者节点不在线，exec 会 fallback 到 Gateway 本机。// openclaw.json { "agents": { "list": [ { "id": "devops", "tools": { "exec": { "node": "正确的节点ID" } } } ] } }解决方案确认节点 ID：在 Control UI 的 Nodes 页面查看绑定正确节点：配置 agents.list[].tools.exec.node 为目标节点的完整 ID确保节点在线：如果节点离线，exec 会 fallback 到 Gatewayexec 命令加 host=node：host="node", node="Home" 确保路由到节点最终正确姿势✅ 读文件：file_fetchfile_fetch(node="Home", path="/mnt/f/Desktop/project/config.json")走节点插件的文件通道，不受 mount namespace 限制。✅ 写文件：file_writefile_write(node="Home", path="/mnt/f/Desktop/project/newfile.java", contentBase64="...")同样走节点插件的文件通道，Windows 侧能看到完整内容。✅ 路径格式必须用：/mnt/f/Desktop/... 不能用：F:\Desktop\... 或 F:/Desktop/...✅ 执行命令（需要 fstab 或 service 预挂载）# 确保节点能看到盘符后 exec(host="node", node="Home", command="ls /mnt/f/Desktop/")systemd service 完整配置user service（普通用户，推荐）# ~/.config/systemd/user/openclaw-node.service [Unit] Description=OpenClaw Node After=network-online.target Wants=network-online.target [Service] ExecStartPre=/bin/bash -c 'until [ -d /mnt/c/Users ]; do sleep 1; done' ExecStart=/usr/bin/openclaw node run --host YOUR_HOST --port 443 --tls --display-name "Home" Environment=OPENCLAW_GATEWAY_TOKEN=YOUR_TOKEN Restart=always RestartSec=5 [Install] WantedBy=default.target配合 fstab 预挂载# /etc/fstab 追加 C: /mnt/c drvfs defaults 0 0 D: /mnt/d drvfs defaults 0 0 E: /mnt/e drvfs defaults 0 0 F: /mnt/f drvfs defaults 0 0 G: /mnt/g drvfs defaults 0 0 H: /mnt/h drvfs defaults 0 0总结操作工具说明读写 Windows 文件file_write / file_fetch走插件通道，不受 namespace 限制路径格式/mnt/x/...不能用 X:\...exec 看盘符fstab 预挂载确保 WSL 启动时就挂好exec 路由host="node" + 正确 node ID避免 fallback 到 GatewayWSL cat 写文件❌ 别用Windows 侧看到 size=0一句话总结：读写 Windows 文件一律用 file_write / file_fetch，路径格式 /mnt/x/...本文由 Summer（OpenClaw AI 助手）协助整理，基于 2026-05-22 的真实踩坑过程。
前置条件Windows 10/11，已启用 WSL2有 OpenClaw Gateway 运行中Gateway token 已获取第一步：卸载旧 Ubuntu（如需重装）在 PowerShell 中执行：wsl --unregister Ubuntu第二步：安装 Ubuntu在 PowerShell 中执行：wsl --install Ubuntu安装完成后设置用户名和密码。第三步：配置镜像网络模式解决 WSL2 无法使用 Windows localhost 代理的问题。在 PowerShell 中执行：Set-Content -Path "$env:USERPROFILE\.wslconfig" -Value "[wsl2]`nnetworkingMode=mirrored`nvmIdleTimeout=-1"networkingMode=mirrored：WSL 与 Windows 共享网络栈，代理直接能用vmIdleTimeout=-1：WSL 不会因空闲自动关闭然后重启 WSL 使配置生效：wsl --shutdown第四步：安装 Node.js在 WSL 中执行：curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt install nodejs -y验证：node -v && npm -v⚠️ 包名是 nodejs 不是 node，apt install node 会报错。第五步：安装 OpenClaw在 WSL 中执行：sudo npm install -g openclaw第六步：手动运行并配对在 WSL 中执行：OPENCLAW_GATEWAY_TOKEN=<你的gateway_token> openclaw node run --host <gateway地址> --port 443 --tls --display-name "Work"参数说明：--host：Gateway 地址--port 443：端口--tls：443 端口必须加--display-name：节点显示名称OPENCLAW_GATEWAY_TOKEN：Gateway 认证 token（必须传）确认连接成功后 Ctrl+C 停掉，继续配置自启。第七步：创建 systemd 自启服务7.1 配置 wsl.conf在 WSL 中执行：sudo tee /etc/wsl.conf << 'EOF' [boot] systemd=true [automount] enabled=true options="metadata,umask=22,fmask=11" mountFsTab=true EOF然后在 PowerShell 重启 WSL：wsl --shutdown7.2 创建 service 文件在 WSL 中执行：mkdir -p ~/.config/systemd/user cat > ~/.config/systemd/user/openclaw-node.service << EOF [Unit] Description=OpenClaw Node After=network-online.target Wants=network-online.target [Service] ExecStartPre=/bin/bash -c 'until [ -d /mnt/c/Users ]; do sleep 1; done' ExecStart=/usr/bin/openclaw node run --host <gateway地址> --port 443 --tls --display-name "Work" Environment=OPENCLAW_GATEWAY_TOKEN=<你的gateway_token> Restart=always RestartSec=5 [Install] WantedBy=default.target EOF关键点：ExecStartPre：等待 Windows 盘符挂载完成后再启动，否则 /mnt/c /mnt/d 等路径不可用Restart=always：进程异常退出自动重启7.3 启用并启动服务systemctl --user daemon-reload systemctl --user enable openclaw-node.service systemctl --user start openclaw-node.service7.4 检查状态systemctl --user status openclaw-node.service应该显示 active (running)。第八步：设置 WSL 开机自启（Windows 计划任务）WSL 关掉终端后可能退出，需要用 VBS 脚本后台常驻。8.1 创建 VBS 脚本在 PowerShell 中执行：Set-Content -Path "$env:USERPROFILE\start-wsl.vbs" -Value 'CreateObject("Wscript.Shell").Run "wsl -d Ubuntu", 0, False'VBS 脚本会静默启动 WSL，不会弹出终端窗口。8.2 创建计划任务在 PowerShell 中执行：schtasks /create /tn "WSL Ubuntu AutoStart" /tr "wscript.exe \`"$env:USERPROFILE\start-wsl.vbs\`"" /sc onlogon /rl highest /f用户登录后自动运行 VBS 脚本，静默启动 WSL + systemd 服务。8.3 验证计划任务schtasks /query /tn "WSL Ubuntu AutoStart"状态应显示 Ready。常见问题排查问题原因解决方案apt install node 报错包名不对用 apt install nodejsWSL 下载慢/代理不生效NAT 模式不支持 localhost 代理配置 networkingMode=mirroredgateway token missing没传 token加 OPENCLAW_GATEWAY_TOKEN=xxxgateway token mismatchtoken 写错了检查 service 文件里的 tokensystemd 服务里 /mnt/c 不存在服务启动时 Windows 盘符还没挂载加 ExecStartPre 等待挂载WSL 关终端就退出没有活跃会话用 .vbs 脚本后台常驻 + 计划任务服务频繁重启 start-limit-hit启动失败太多次systemctl --user reset-failed 再启动最终效果✅ Windows 开机 → 计划任务自动运行 VBS → 静默启动 WSL✅ WSL 启动 → systemd 自动拉起 openclaw-node 服务✅ 服务等待 Windows 盘符挂载 → 连接 Gateway → 节点上线✅ 关闭终端不影响 WSL 和节点运行✅ 文件读写权限正常，/mnt/c /mnt/d 等均可访问