rsync默认增量同步但非安全备份,因仅镜像且不保留历史;全量传输源于quick-check失效(时间戳/大小变化),-c可强制校验但降速;--link-dest支持硬链接快照,需同文件系统并确保路径有效。

rsync 默认就是增量同步,但“增量”不等于“安全备份”——它默认只做镜像,删源就删目标,不保留历史版本。真要可靠增量同步,必须加参数、控路径、防误删。
为什么 rsync -av 每次都在传全量?
这不是 bug,是 quick-check 机制在失效:rsync 默认靠「修改时间 + 文件大小」判断是否跳过文件。只要目标端文件被 touch 过、挂载时用了 noatime、或权限被重置(比如 chmod -R 755 批量改过),它就认为“变了”,退化为全量传输。
- 临时验证是否内容真变了?加
-c(即--checksum)强制比对内容,但速度会明显下降 - 远程同步时,目标目录若被其他进程清空或改过时间戳,
rsync -av也识别不了已存在文件 - 源路径末尾斜杠决定语义:
/src/同步内容,/src同步目录本身——错一个字符,可能多嵌套一层
如何用 --link-dest 做可回溯的硬链接快照
这是空间高效、能保留多个历史版本的主流做法,但要求源和备份目录在**同一文件系统**(硬链接不能跨设备)。
- 先创建带日期的备份目录:
mkdir /backup/20260614 - 首次完整同步:
rsync -a /src/ /backup/20260614/ - 后续增量快照:
rsync -a --link-dest="/backup/20260614" /src/ /backup/20260615/ - 务必确认
--link-dest路径存在且可读,否则退化为全量复制 - 禁止对
--link-dest目录执行rsync --delete,否则可能破坏其他快照的硬链接引用
远程同步时必须检查的三件事
远程场景下,rsync 表面报错少,但卡住、静默失败很常见,多数出在权限和路径上。
- SSH 免密必须配好,且
~/.ssh/authorized_keys权限不能超过600,否则连接会 hang 住不报错 - 目标路径要用绝对路径,避免因 shell 环境差异导致写入错位(比如
~/backup在不同用户下解析不同) - 目标目录需对 SSH 用户可写;若用
sudo提权,得在远程命令里显式加rsync --rsync-path="sudo rsync"
排除干扰文件和避免误删的关键参数
不加过滤,.DS_Store、Thumbs.db、node_modules 或锁文件可能让 rsync 报错中断,或污染备份结果。
- 常用排除:
--exclude=".DS_Store" --exclude="*.tmp" --exclude="node_modules/" --exclude=".git/" - 复杂规则建议用
--filter配文件,比如--filter="merge /etc/rsync-exclude.conf" -
--delete很危险:它会让目标严格等于源,一旦源删了配置文件,目标也跟着丢——加之前务必先跑--dry-run预览 - 本地测试时,可用
--dry-run+-v看清楚哪些文件会被删、哪些会传
真正难的不是写对一条命令,而是每次运行前确认 --link-dest 存在、目标文件系统没满、SSH 权限没变、排除列表没漏关键临时文件——这些点一漏,cron 里跑起来可能就变成删库跑路。











