强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Rclone 数据迁移完全指南 / 第 10 章 - 双向同步

第 10 章 - 双向同步


10.1 双向同步概述

bisync(Bidirectional Sync)是 Rclone 的双向同步命令,能够在两个路径之间保持文件的一致性,无论哪一端发生了变化。

bisync vs sync 对比

特性syncbisync
方向单向双向
删除策略删除目标端多余文件智能删除(两端同步)
冲突处理源端覆盖目标端检测并报告冲突
检查点支持
适用场景镜像备份多端协作

适用场景

  • 本地与云端双向同步文件
  • 多台电脑之间同步工作目录
  • 团队成员与共享存储之间的文件同步
  • 笔记应用(如 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 集成 →