WSL 与 Windows 双环境 OpenCode 配置同步实践
背景
在 WSL 和 Windows 双环境下使用 OpenCode 时,希望两边配置和会话数据能够同步,避免手动切换环境时丢失上下文。
主要分为两块:配置目录同步和会话数据库同步。把步骤直接丢给agent应该就能搞定了。
一、配置文件同步
OpenCode 的配置目录位于 ~/.config/opencode/,包含:
opencode.json- 主配置(provider、model、MCP)AGENTS.md- 全局规则hooks/- 钩子脚本agents/- Agent 定义command/- 斜杠命令
方案:符号链接,WSL 直接指向 Windows 配置目录
ln -s /mnt/c/Users/用户名/.config/opencode ~/.config/opencode
ln -s /mnt/c/Users/用户名/.config/opencode ~/.opencode
优点:
- 修改任意一边自动同步
- 无需手动维护
注意:
- AGENTS.md 如果包含了操作系统相关的内容,需要修改为跨平台描述
二、会话数据库同步(失败 → 改进方案)
初期尝试:符号链接同步数据库
数据库位置:~/.local/share/opencode/opencode.db(SQLite)
ln -s /mnt/c/Users/用户名/.local/share/opencode ~/.local/share/opencode
遇到的问题
问题 1:SQLite 跨系统锁定冲突
- Windows 和 WSL 同时运行 OpenCode 时,数据库被锁定
- WSL 访问时报
disk I/O error - SQLite 的 WAL 文件机制不支持跨文件系统并发
问题 2:路径格式混乱导致递归拼接
- Windows 使用
\分隔符,WSL 使用/ - OpenCode 解析路径时反复叠加,产生错误路径:
/home/用户名/\home\用户名\\home\用户名\\home\用户名\C:\Users\用户名 - 数据库中出现多条错误 session 记录
解决方案:独立数据库 + 手动同步脚本
由于 SQLite 不支持跨系统同时访问,最终采用独立数据库 + 切换前同步方案:
1. 恢复 WSL 独立数据库
步骤略
2. 创建同步脚本 ~/.local/bin/opencode-sync
#!/bin/bash
WINDOWS_DB="/mnt/c/Users/用户名/.local/share/opencode/opencode.db"
WSL_DB="$HOME/.local/share/opencode/opencode.db"
check_process() {
# 检查 WSL 进程(排除同步脚本自身)
local opencode_procs=$(ps aux | grep -E "node|bun" | grep "opencode-ai" | grep -v grep | wc -l)
if [ "$opencode_procs" -gt 0 ]; then
echo "错误: WSL opencode 正在运行"
return 1
fi
# 检查 Windows 进程
local win_procs=$(powershell.exe -Command "(Get-Process opencode -ErrorAction SilentlyContinue).Count" 2>/dev/null | tr -d '\r\n')
if [ "$win_procs" != "" ] && [ "$win_procs" -gt 0 ]; then
echo "错误: Windows opencode 正在运行"
return 1
fi
return 0
}
case "$1" in
"push") # WSL → Windows
check_process || exit 1
cp "$WSL_DB" "$WINDOWS_DB"
rm -f "/mnt/c/Users/kirafishy/.local/share/opencode/opencode.db-wal"
;;
"pull") # Windows → WSL
check_process || exit 1
cp "$WINDOWS_DB" "$WSL_DB"
rm -f "$HOME/.local/share/opencode/opencode.db-wal"
;;
"auto") # 自动判断方向
check_process || exit 1
# 比较修改时间,从较新的同步到较旧的
;;
"status") # 查看状态
;;
esac
## 三、自动同步 Wrapper
为避免每次手动执行同步,创建 wrapper 脚本:
**`~/.local/bin/opencode-wrapper`**
```bash
#!/bin/bash
OPENCODE_REAL="$HOME/.bun/bin/opencode"
SYNC_SCRIPT="$HOME/.local/bin/opencode-sync"
# 使用 trap 确保退出时同步(包括 Ctrl+C)
cleanup() {
echo ""
echo ">>> 正在推送数据到 Windows..."
"$SYNC_SCRIPT" push 2>/dev/null
}
trap cleanup EXIT
# 启动前同步
echo ">>> 正在同步数据..."
"$SYNC_SCRIPT" pull 2>/dev/null
# 运行 opencode
"$OPENCODE_REAL" "$@"
集成到 bashrc:
alias opencode='$HOME/.local/bin/opencode-wrapper'
工作流程:
启动 → pull (Windows→WSL) → 运行 opencode → 退出 → push (WSL→Windows)
↑ ↑
包括 Ctrl+C 也触发 push (trap EXIT)
四、数据库清理
步骤略
五、最终架构
组件 同步方式 说明 配置文件 (~/.config/opencode)
符号链接
实时同步
会话数据库 (~/.local/share/opencode/opencode.db)
手动/自动脚本
切换环境前同步
wrapper (opencode-wrapper)
自动触发
运行 opencode 时自动同步
六、经验教训
-
SQLite 不支持跨系统并发:WSL 和 Windows 通过
/mnt/c访问同一个 SQLite 文件会有锁定冲突,不要尝试符号链接同步数据库 -
进程检测要精确:
pgrep -f "opencode"会匹配脚本自身,需要更精确的匹配条件 -
Ctrl+C 退出仍需同步:因为用到了佬友开发的Web UI:[开源自荐] OpenCodeUI (opencode webui) 。所以需要使用
trap EXIT捕获所有退出方式,包括信号中断。 -
路径格式差异:Windows
\和 WSL/混合可能导致解析错误,切换环境时要注意
七、使用指南
# 手动同步
opencode-sync pull # 切换到 WSL 前,从 Windows 拉取
opencode-sync push # 离开 WSL 前,推送到 Windows
opencode-sync auto # 自动判断方向
opencode-sync status # 查看状态
# 自动同步(推荐)
source ~/.bashrc # 加载 alias
opencode serve ... # 自动 pull → 运行 → 退出自动 push
3 个帖子 - 3 位参与者