Rclone 数据迁移完全指南 / 第 10 章 - 双向同步
第 10 章 - 双向同步
10.1 双向同步概述
bisync(Bidirectional Sync)是 Rclone 的双向同步命令,能够在两个路径之间保持文件的一致性,无论哪一端发生了变化。
bisync vs sync 对比
| 特性 | sync | bisync |
|---|---|---|
| 方向 | 单向 | 双向 |
| 删除策略 | 删除目标端多余文件 | 智能删除(两端同步) |
| 冲突处理 | 源端覆盖目标端 | 检测并报告冲突 |
| 检查点 | 无 | 支持 |
| 适用场景 | 镜像备份 | 多端协作 |
适用场景
- 本地与云端双向同步文件
- 多台电脑之间同步工作目录
- 团队成员与共享存储之间的文件同步
- 笔记应用(如 Obsidian)的多端同步
10.2 基本用法
初始化同步
# 首次使用需要 --resync 初始化
rclone bisync /data/workspace/ gdrive:Workspace/ --resync --progress
# --resync 会:
# 1. 比较两端文件
# 2. 将较新的文件同步到较旧的一端
# 3. 创建检查点文件
日常同步
# 初始化后,日常同步直接运行
rclone bisync /data/workspace/ gdrive:Workspace/ --progress
# 每次同步会:
# 1. 检测两端的变化
# 2. 将变化同步到另一端
# 3. 检测冲突并报告
# 4. 更新检查点
10.3 工作原理
同步流程
步骤 1: 检测 Path1(本地)的变化
↓
步骤 2: 检测 Path2(远程)的变化
↓
步骤 3: 比较两端变化
├── 无冲突:同步变化
└── 有冲突:报告冲突
↓
步骤 4: 应用变更
↓
步骤 5: 更新检查点
检查点文件
bisync 使用检查点文件记录上次同步的状态:
# 默认检查点位置
~/.cache/rclone/bisync/
# 检查点文件内容(JSON 格式)
# 记录了上次同步时两端文件的哈希值和修改时间
10.4 冲突检测与解决
冲突场景
场景 1: 两端都修改了同一个文件
本地: file.txt (修改时间 2026-05-10, 内容 "Version B")
云端: file.txt (修改时间 2026-05-10, 内容 "Version C")
→ 冲突!bisync 无法判断哪个版本更新
冲突解决策略
策略 1:手动解决(默认)
# bisync 检测到冲突后会停止并报告
rclone bisync /data/ gdrive:docs/ --progress
# 输出示例:
# ERROR : file.txt: CONFLICT: both sides modified
# Bisync aborted due to conflict. Please resolve manually.
手动解决步骤:
# 1. 查看冲突文件
rclone check /data/ gdrive:docs/ --combined conflicts.json
# 2. 选择保留哪个版本
# 保留本地版本:
rclone copyto /data/file.txt gdrive:docs/file.txt --progress
# 或保留云端版本:
rclone copyto gdrive:docs/file.txt /data/file.txt --progress
# 3. 重新同步
rclone bisync /data/ gdrive:docs/ --progress
策略 2:使用 –conflict-resolve
# 使用本地版本解决冲突
rclone bisync /data/ gdrive:docs/ --conflict-resolve newer --progress
# 可选值:
# newer - 使用更新的版本(基于修改时间)
# older - 使用较旧的版本
# larger - 使用更大的文件
# smaller - 使用更小的文件
# path1 - 始终使用路径1(本地)
# path2 - 始终使用路径2(远程)
策略 3:使用 –conflict-loser
# 将冲突的旧版本备份到指定目录
rclone bisync /data/ gdrive:docs/ \
--conflict-resolve newer \
--conflict-loser /data/.conflicts/ \
--progress
10.5 过滤规则
bisync 支持与 sync 相同的过滤规则:
# 使用 --include 和 --exclude
rclone bisync /data/ gdrive:docs/ \
--include "*.md" \
--include "*.txt" \
--exclude ".*" \
--exclude "node_modules/**" \
--progress
# 使用过滤文件
rclone bisync /data/ gdrive:docs/ \
--filter-from bisync-filters.txt \
--progress
过滤文件示例
# bisync-filters.txt
# 排除临时文件
- *.tmp
- *.temp
- *.swp
- *~
# 排除隐藏目录
- /**/.*
# 排除构建产物
- build/
- dist/
- node_modules/
- __pycache__/
# 包含所有其他文件
+ *
10.6 高级参数
常用参数
| 参数 | 说明 | 默认值 |
|---|---|---|
--resync | 重新初始化同步 | 否 |
--conflict-resolve | 冲突解决策略 | 手动 |
--conflict-loser | 冲突版本备份目录 | 无 |
--check-access | 检查访问权限 | 否 |
--check-filename | 检查点文件名 | .bisync-checkpoint |
--max-delete | 最大删除百分比 | 50% |
--remove-empty-dirs | 删除空目录 | 否 |
--no-traverse | 不遍历目标端 | 否 |
--resilient | 容错模式 | 否 |
--workdir | 工作目录 | 默认缓存目录 |
安全参数
# 限制单次删除的文件数(防止意外删除大量文件)
rclone bisync /data/ gdrive:docs/ --max-delete 10 --progress
# 强制检查访问权限
rclone bisync /data/ gdrive:docs/ --check-access --progress
# 容错模式(跳过非致命错误继续同步)
rclone bisync /data/ gdrive:docs/ --resilient --progress
10.7 测试运行
使用 –dry-run
# 预览同步操作,不实际执行
rclone bisync /data/ gdrive:docs/ --dry-run --progress --verbose
# 输出示例:
# NOTICE: bisync: path1 = /data/
# NOTICE: bisync: path2 = gdrive:docs/
# NOTICE: Bisyncing with --dry-run
# NOTICE: file1.txt: Copying path1 → path2
# NOTICE: file2.txt: Copying path2 → path1
# NOTICE: file3.txt: Deleting from path1 (exists only in path2)
验证同步结果
# 同步后验证两端一致性
rclone check /data/ gdrive:docs/
# 使用 bisync 的检查功能
rclone bisync /data/ gdrive:docs/ --check-access --progress
10.8 定时双向同步
使用 cron
# 编辑 crontab
crontab -e
# 每 30 分钟同步一次
*/30 * * * * /usr/bin/rclone bisync /data/workspace/ gdrive:Workspace/ --log-file /var/log/bisync.log --log-level NOTICE 2>&1
# 每小时同步,工作时间更频繁
0 * * * * /usr/bin/rclone bisync /data/workspace/ gdrive:Workspace/ --log-file /var/log/bisync.log --log-level NOTICE
使用 systemd timer
# 服务文件
sudo tee /etc/systemd/system/bisync.service << 'EOF'
[Unit]
Description=Rclone Bidirectional Sync
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/rclone bisync /data/workspace/ gdrive:Workspace/ --log-file /var/log/bisync.log --log-level NOTICE
EOF
# Timer 文件
sudo tee /etc/systemd/system/bisync.timer << 'EOF'
[Unit]
Description=Run bisync every 30 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=30min
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now bisync.timer
10.9 故障排除
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
checkpoint not found | 首次运行未用 --resync | 添加 --resync 初始化 |
CONFLICT: both sides modified | 两端都修改了同一文件 | 手动解决或使用 --conflict-resolve |
permission denied | 访问权限不足 | 检查文件权限和 Remote 认证 |
max delete exceeded | 删除文件数超过阈值 | 增大 --max-delete 或确认操作 |
重置同步状态
# 删除检查点文件,重新开始
rm ~/.cache/rclone/bisync/*
rclone bisync /data/ gdrive:docs/ --resync --progress
# 或指定检查点文件名
rclone bisync /data/ gdrive:docs/ \
--check-filename .my-checkpoint \
--resync --progress
调试模式
# 详细日志输出
rclone bisync /data/ gdrive:docs/ \
--log-file bisync-debug.log \
--log-level DEBUG \
--dump headers
注意事项
⚠️ 首次必须 –resync:第一次运行 bisync 必须使用
--resync初始化检查点。
⚠️ 避免多客户端同时同步:多个客户端同时 bisync 同一 Remote 可能导致冲突激增。建议错开时间或使用文件锁。
⚠️ 大目录性能:bisync 需要遍历两端所有文件,目录越大越慢。建议配合过滤规则缩小同步范围。
💡 定期 –resync:如果怀疑同步状态异常,可以运行
--resync重新初始化。
💡 备份检查点:检查点文件丢失会导致需要重新
--resync。建议备份检查点文件。
扩展阅读
上一章:← 第 9 章 - 加密存储 下一章:第 11 章 - Docker 集成 →