NAS 本地与云端同步方案:rsync、rclone、davfs2
tags: NASNAS 本地与云端同步方案:rsync、rclone、davfs2
文件同步始终是 NAS 使用过程中无法避开的功能。对于我个人来说,文件同步功能用得不多,一直以来的主要用法也就是多盘间使用 rsync 进行一下数据备份。最近有一个需求,我想把音乐库里面的新增音乐同步到 onedrive 里面,主要特点是整体音乐文件多,但新增的不多,大多数在 onedrive 中是已经存在的。
以前用 windows 的时候,都是直接用 filefreesync 软件将本地音乐文件夹与 onedrive 中的文件夹同步就完事了,但现在切换到 Linux 之后,并没有 onedrive 可用的客户端。于是我用 openlist 将 onedrive 挂载为 webdav,然后用 rsync 与 webdav 同步。然后 rsync 打脸了我的天真,rsync 无法有效读写我的网盘(我这儿的主要报错是无法识别中文字符,实际上还有很多问题),于是不得不安装了 rclone,通过 rclone+davfs2 挂载 来解决这一问题。
为什么我不直接用 rclone 挂载 onedrive?
理论上的确是可以的,但我在试图挂载 onedrive 的过程中,发现需要通过网页来登陆 onedrive 账号,但这个登陆页面必须通过 localhost 来登录,这让 NAS 用户很是难堪,无奈放弃。
Rsync 本地同步与 rclone + WebDAV 云端同步的最佳实践
在众多同步工具中,Rsync 和 rclone 是最常用、最稳定、也最能互补的组合。前者擅长本地与局域网同步,后者则在云存储和 WebDAV 协议上表现出色。下面我们就来详细聊聊如何用 Rsync 做本地同步,以及如何用 rclone 配合 WebDAV 进行云端同步。
Rsync 本地同步
Rsync 是 Linux 系统中最经典的同步工具之一,它以“增量同步”著称,能够只传输文件变化的部分,因此速度快、效率高,非常适合本地目录之间、本地与外接硬盘、以及本地与局域网 NAS 之间的同步任务。
使用 Rsync 进行本地同步的基本思路很简单:指定源目录、目标目录,然后让 Rsync 对比两者的差异并执行同步。例如,将本地的音乐库同步到外接硬盘,只需要一行命令即可完成。Rsync 会自动对比文件的大小、修改时间等信息,只传输新增或变化的文件,既节省时间又减少磁盘写入压力。
Rsync 的优势不仅在于速度,还在于其丰富的参数。比如 --ignore-existing 可以只上传新增文件,--delete 可以让目标目录与源目录保持完全一致,--progress 可以实时查看同步进度。这些参数让 Rsync 几乎能满足所有本地同步需求。
# 基本用法:将源目录同步到目标目录
rsync -av --delete --dry-run --exclude '.Trash-*' 源目录/A 目标目录/B
注意,目录后面有没有 / 非常重要,假设我们有以下文件:
$ tree
.
├── A
│ ├── 1.txt
│ └── 2.txt
└── B
# 使用 A B 同步
$ rsync -av --delete --exclude '.Trash-*' A B
sending incremental file list
A/
A/1.txt
A/2.txt
sent 185 bytes received 58 bytes 486.00 bytes/sec
total size is 0 speedup is 0.00
$ tree
.
├── A
│ ├── 1.txt
│ └── 2.txt
└── B
└── A
├── 1.txt
└── 2.txt
4 directories, 4 files
# 使用 A B/ 同步
$ rsync -av --delete --exclude '.Trash-*' A B/
sending incremental file list
A/
A/1.txt
A/2.txt
sent 185 bytes received 58 bytes 486.00 bytes/sec
total size is 0 speedup is 0.00
$ tree
.
├── A
│ ├── 1.txt
│ └── 2.txt
└── B
└── A
├── 1.txt
└── 2.txt
4 directories, 4 files
# 使用 A/ B/ 同步
$ rsync -av --delete --exclude '.Trash-*' A/ B/
sending incremental file list
./
1.txt
2.txt
sent 173 bytes received 57 bytes 460.00 bytes/sec
total size is 0 speedup is 0.00
$ tree
.
├── A
│ ├── 1.txt
│ └── 2.txt
└── B
├── 1.txt
└── 2.txt
由此可见,目标目录 B 带不带 / 影响不大,但源目录带不带 / 决定了同步的行为。为避免出错,建议跑之前都用 --dry-run 先模拟试试,避免误删除目标目录的文件,就算能救回来,也浪费不少时间。如果使用同步脚本,每次修改脚本都要手动 --dry-run 先试试,不要盲目自信。
rclone + WebDAV 云端同步
Rsync 是为本地文件系统设计的,对网络文件系统的兼容性有限。此时,rclone 就成了更好的选择。rclone 是一款专门为云存储设计的命令行工具,它原生支持数十种云服务,包括 WebDAV、OneDrive、Google Drive、Dropbox 等。与 Rsync 不同,rclone 不需要将云存储挂载到本地,而是直接通过 API 或协议与云端通信。
对于 rclone 支持的云盘,直接通过 API 通信无疑效率最高,但如前文所说,我打不开登陆页面……所以只能通过 webdav 曲线救国。
使用 rclone 配合 WebDAV 同步文件非常简单。首先需要通过 rclone config 配置 WebDAV 连接,包括服务器地址、用户名、密码等信息。配置完成后,就可以像使用 Rsync 一样同步文件了。例如,将本地音乐库同步到支持 WebDAV 的云盘,只需要指定本地目录和远程名称即可。
$ rclone config
zsh: correct 'config' to '.config' [nyae]? n
Current remotes:
Name Type
==== ====
onedrive-webdav webdav
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
rclone 的优势在于它对云存储的深度适配。它支持断点续传、批量操作、多线程同步,并且能很好地处理中日文等特殊字符文件名。对于需要将文件同步到云端的用户来说,rclone 是最可靠的工具之一。
此外,rclone 还提供了丰富的参数,如 --ignore-existing 只上传新增文件,--transfers 调整并发线程数,--progress 查看实时进度等。这些参数让 rclone 的使用体验与 Rsync 非常接近,用户可以轻松上手。
# 将 A 与 B 的内容同步
rclone copy --ignore-existing --progress --dry-run ./A/ onedrive-webdav:B/
# 报错无视,已经上传完成
$ rclone copy --ignore-existing --progress ./个人收藏音乐/ onedrive-webdav:个人收藏音乐/
...
2026/01/19 15:24:22 ERROR : Attempt 3/3 succeeded
Transferred: 802.189 MiB / 802.189 MiB, 100%, 779.188 KiB/s, ETA 0s
Checks: 7342 / 7342, 100%, Listed 14713
Transferred: 11 / 11, 100%
Elapsed time: 20m34.1s
总结
Rsync 和 rclone 是两种不同定位的工具,但它们可以完美互补。Rsync 适合本地同步,rclone 适合云端同步。将两者结合使用,就能构建一套完整的文件管理与备份体系:用 Rsync 处理本地文件,用 rclone 同步到云端,既高效又安全。
无论是整理媒体库、备份重要文件,还是构建自动化同步脚本,Rsync 和 rclone 都是不可或缺的工具。掌握它们的使用方法,会让文件管理变得更加轻松、高效。