使用rclone bisync替代oneDrive客户端双向同步

oneDrive+MS Office 2019突然出现保存失败,卸载oneDrive就没有这个问题了。

背景

在公司的笔记本上,使用oneDrive+MS Office 2019时,经常出现保存失败,要保存副本或另存为,甚至出现Visio无法打开oneDrive里的文件。而在MS Office 2019中将保存或打开本地路径,不是oneDrive路径,就没有一点问题。
工作中,OneNote的好用,是没有可替代的软件,所以只能卸载oneDrive,就需要另一个双向步云盘了。考虑过以下方向

  1. 自建服务器,但都是Linux的:seafile、nextcloud
  2. 另类云盘双向同步,自建FTP服务器:sftp/ftp+FreeFileSync/WinSCP;但公司网络中,禁用了ftp。
    • FreeFileSync需要捐赠版,才能修改并发数,离谱的是只有捐赠版,才有便携版,非捐赠版安装需要管理员权限。
    • openSSH-WIN64 碰到了标准用户连接,不能出shell的问题。
  3. 国内网盘基本是自动备份,不是双向自动同步。
    • 阿里云盘据称支持双向自动同步,但公司里网速慢的令人发指,应该是被限制了;
    • 腾讯微云的同步助手,在公司里下网速很慢,也应该是限制了;另外,下载后是需要管理员用户安装,不支持标准用户安装。
  4. 自建WebDav服务器:由于协议原因,上传文件后不能修改文件的修改日期与时间(测试:rclone touch -C --localtime T725:/favicon.ico )
    • rclone无法可靠地判断文件内容(大小与修改时间)是否确实发生了变化,rclone提供了专门的解决方案:使用--update(或简写-u)参数,但也只适用于单向同步(备份)。
    • --update:目标文件的修改时间是否比源文件旧,如果是,则执行同步。
  5. 将 rclone bisync 当oneDrive的客户端,做双向同步。
  6. 自建 rclone serve s3 服务器 + rclone bisync 做双向同步。

rclone bisycn 语法与参数

命令语法:rclone bisync <LOCAL_PATH> {remoteName}:path [flags]
同样,可以是本地与远程,也可以是远程与本地,还可以是远程与远程;但是,使用前,先看是否在支持列表中。
rclone bisync -h查看可用参数

      --backup-dir1 string                   Path1 的备份目录。必须是同一远程上不重叠的路径。
      --backup-dir2 string                   Path2 的备份目录。必须是同一远程上不重叠的路径。
      --check-access                         确保在 Path1  Path2 文件系统上都能找到预期的 RCLONE_TEST 文件,否则中止操作。
      --check-filename string                --check-access 使用的文件名(默认值:RCLONE_TEST)
      --check-sync string                    控制最终列表的比较方式:true|false|only(默认值:true)
      --compare string                       以逗号分隔的双向同步特定比较选项列表,例如 'size,modtime,checksum'(默认值:'size,modtime')
      --conflict-loser ConflictLoserAction   对同步冲突的输家(有赢家时)或两个文件(无赢家时)采取的操作:num, pathname, delete(默认值:num)
      --conflict-resolve string              自动解决冲突,优先选择以下版本:none, path1, path2, newer, older, larger, smaller(默认值:none)
      --conflict-suffix string               重命名 --conflict-loser 时使用的后缀。可以是一个字符串,也可以是两个用逗号分隔的字符串,分别为 Path1/Path2 指定不同的后缀。(默认值:'conflict')
      --create-empty-src-dirs                同步空目录的创建和删除操作。(与 --remove-empty-dirs 不兼容)
      --download-hash                        当无法获取哈希值时,通过下载文件来计算哈希值。(警告:可能会很慢并消耗大量数据!)
      --filters-file string                  从文件中读取过滤规则
      --force                                绕过 --max-delete 安全检查并运行同步。建议与 --verbose 一起使用
  -h, --help                                 显示 bisync 命令的帮助信息
      --ignore-listing-checksum              列表时不使用校验和(添加 --ignore-checksum 以额外跳过复制后校验和检查)
      --max-lock Duration                    认为超过此时间的锁文件已过期(默认值:0(永不过期))(最小值:2m)
      --no-cleanup                           保留工作文件(有助于故障排除和测试)。
      --no-slow-hash                         仅在后端计算校验和较慢时忽略列表校验和
      --recover                              无需 --resync 即可自动从中断中恢复。
      --remove-empty-dirs                    在最终清理步骤中删除所有空目录。
      --resilient                            允许未来运行在某些不太严重的错误后重试,而不是需要 --resync。使用时请自行承担风险!
  -1, --resync                               执行重新同步操作。相当于 --resync-mode path1。建议先使用 --verbose  --dry-run。
      --resync-mode string                   重新同步时,优先选择以下版本:path1, path2, newer, older, larger, smaller(默认值:如果使用 --resync 则为 path1,否则为 none 表示不重新同步)
      --slow-hash-sync-only                  列表和差异计算时忽略慢校验和,但在同步调用时仍考虑它们。
      --workdir string                       使用自定义工作目录 - 用于测试。(默认值:{WORKDIR})

单个目录双向同步验证

各有优缺点,今天就说说将 rclone bisync 当oneDrive的客户端,做双向同步。
如果你是第一次使用,请试着对单个文件夹,用最少的参数,做双向同步;成功后,再批量目录,增加参数。可以简化问题排查难度。

准备工作

前提:仅目录 D:\CloudFiles\ConfigBak\ 与 oneDrive:/ConfigBak/ 之间双向同步
CMD环境:注意doskey会明显感觉,要停顿2~3秒。

BAT (Batchfile)
set RcloneDir=D:\CloudFiles\Rclone
set "toDay=%date:~2,2%%date:~5,2%%date:~8,2%"
set "rLog=--progress --verbose --log-file %RcloneDir%\Logs\%toDay%.log"
doskey rclone=%RcloneDir%\rclone.exe --config %~dp0Console\rclone.conf $*
  1. 先使用sync或copy,单向同步一次:rclone sync D:\CloudFiles\ConfigBak\ oneDrive:/ConfigBak/ %rLog%,有二个作用:
    • 先人工正确同步一次,是从本地到oneDrive,还是oneDrive到本地只有人工判断出来。
    • 避免第2步有大量数据
  2. 再使用--resync初次双向同步一次:rclone bisync D:\CloudFiles\ConfigBak\ oneDrive:/ConfigBak/ %rLog% --resync
    • 这步最关键是生成 %LOCALAPPDATA%\rclone\bisync\{paht1}...{path2}.paht1/2.lst 的两个文件,因为默认是按 --compare size,modtime 校验,这二个文件中,是记录了各自路径下,所有文件的修改日期与大小,内容示例:
  1. 验证:后续不使用 --resync 参数的命令,是否正确。
    • 每次双向步会再次更新两个 xxx.lst 文件,只保留上一次的副本,且重命名为 xxx.lst.old
Bash
@echo off
set "toDay=%date:~2,2%%date:~5,2%%date:~8,2%"
set exeDir=D:\CloudFiles\Rclone
set confDir=D:\CloudFiles\Console
rem --progress --verbose
%exeDir%\rclone.exe bisync D:\CloudFiles\ConfigBak\ oneDrive:/ConfigBak/ --config %confDir%\rclone.conf --log-level INFO --log-file %exeDir%\Logs\%toDay%.log

日常定时自动双向同步计划任务

在计划任务中,添加定时任务,以什么样的频率,运行BAT文件。

多个目录的双向同步

场景:在 D:\CloudFiles\ 与 oneDrive: 之间,仅双向同步特定的目录下子目录与文件;且都有不同的,不需要同步的子目录与文件,如图:

接上面的CMD环境,先对新建目录

Bash
rclone sync oneDrive:/Pictures/ d:\CloudFiles\Pictures\ %rLog%
rclone copy D:\CloudFiles\Sysinternals\ oneDrive:/Sysinternals/ %rLog%

创建UTF-8的rclone.filter文本文件,实现在 D:\CloudFiles\ 与 oneDrive: 之间,只同步特定的目录下子目录与文件。

# oneDrive 的过滤
+ /ConfigBak/**
- /Documents/baozun/**
+ /Documents/**
+ /Sysinternals/**
+ /Pictures/**
# 排除其他所有子目录与文件
- /**

再手工同步一次:
rclone sync D:\CloudFiles\ oneDrive:/ --filter-from %ConsoleDir%\rclone.filter --ignore-case %rLog%

为两边差异准备备份目录:

Bash
rclone mkdir oneDrive:/bisyncDifferBak/
rclone mkdir D:\CloudFiles\bisyncDifferBak

首次全量双向同步,为了创建出xxx.lst文件

Bash
rclone bisync D:\CloudFiles\ oneDrive: --filter-from %ConsoleDir%\rclone.filter --ignore-case --backup-dir1 D:\CloudFiles\bisyncDifferBak\ --backup-dir2 oneDrive:/bisyncDifferBak/ %rLog% --resync --dry-run
  • 由于oneDrive的根目录,所以不能写 oneDrive:/ ??不确认,没有验证

后续双向同步,有差异,被删除的都移到各自的bisyncDifferBak目录中。

Bash
rclone bisync D:\CloudFiles\ oneDrive: --filter-from %ConsoleDir%\rclone.filter --ignore-case --backup-dir1 D:\CloudFiles\bisyncDifferBak\ --backup-dir2 oneDrive:/bisyncDifferBak/ %rLog% --dry-run

日常定时自动同步的bat

Bash
@echo off
set "toDay=%date:~2,2%%date:~5,2%%date:~8,2%"
rem Rclone.exe与logs的目录
set exeDir=D:\CloudFiles\Rclone
rem rclone.conf与rclone.filter的目录
set confDir=D:\CloudFiles\Console
rem --progress --verbose
%exeDir%\rclone.exe bisync D:\CloudFiles\ oneDrive: --config %confDir%\rclone.conf --log-level INFO --log-file %exeDir%\Logs\%toDay%.log --filter-from %confDir%\rclone.filter --ignore-case --backup-dir1 D:\CloudFiles\bisyncDifferBak\ --backup-dir2 oneDrive:/bisyncDifferBak/

注意事项

如果您连续 90 天不使用 rclone,刷新令牌将会过期。这将导致授权问题。解决此问题很简单,只需运行 rclone config reconnect {remoteName}: 命令来获取新的令牌和刷新令牌。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注