rsync 默认是镜像同步而非备份工具,需手动配置如--link-dest硬链接快照、免密SSH、绝对路径及日志重定向才能实现可靠增量备份。

rsync 不是开箱即用的“备份工具”,它默认做的是**镜像同步**——删源文件,目标跟着删;不加额外参数,也不会保留历史版本。真要用于可靠增量备份,必须手动启用备份机制、配好权限和路径,否则 cron 一跑,可能把昨天的配置全清空。
怎么确认系统已装 rsync 并验证可用性
多数现代 Linux 发行版(Ubuntu 22.04+、CentOS 8+、RHEL 9)预装 rsync,但不能假设它一定在 PATH 里或有执行权限。
- 运行
rsync --version,看到类似rsync version 3.2.7才算到位 - 若报
command not found,按发行版装:- Debian/Ubuntu:
sudo apt update && sudo apt install rsync -y - CentOS/RHEL 7:
sudo yum install rsync - CentOS 8+/RHEL 8+:
sudo dnf install rsync
- Debian/Ubuntu:
- 别装
rsync-daemon包——那是搭服务端用的,本地备份只需客户端主程序 - 旧系统(如 CentOS 6)自带
rsync 3.0.6,缺--partial-dir和--delete-delay,容易断点续传失败,建议升级或源码编译新版
rsync -av 为什么每次都在传全量?
这不是 bug,是设计:rsync 默认靠「修改时间 + 文件大小」快速比对,只要目标端文件被 touch 过、权限被重置、或挂载时用了 noatime,quick-check 就失效,退化为全量传输。
- 远程同步时,目标目录若被清空过、或由其他进程改过时间戳,
rsync -av就无法识别“哪些没变” -
-c(--checksum)能强制内容比对,但大幅拖慢速度,只在怀疑文件被静默篡改时临时启用 - 斜杠结尾决定语义:
/src/同步内容,/src同步目录本身——错一个字符,可能在目标多嵌套一层src/ - 远程路径权限也关键:目标目录需对 SSH 用户可写,且
~/.ssh/authorized_keys权限不能超过600,否则连接卡住不报错
真正能回溯的增量备份:用 --link-dest 做硬链接快照
这是空间高效、可回溯多版本的主流做法,但要求源和备份目录在**同一文件系统**(硬链接不能跨设备)。
- 先创建带日期的备份目录:
mkdir /backup/daily.0 - 首次完整同步:
rsync -a /data/ /backup/daily.0/ - 第二天执行前,轮转目录:
mv /backup/daily.0 /backup/daily.1 - 再同步并复用旧文件:
rsync -a --delete --link-dest=/backup/daily.1/ /data/ /backup/daily.0/ - 务必确保
--link-dest指向的路径存在且可读,否则 rsync 会退化为全量复制 - 别对
--link-dest目录本身执行rsync --delete,否则破坏其他快照的硬链接引用
远程备份必须配的三件事:免密 SSH、绝对路径、日志重定向
放进 cron 的 rsync 命令,失败时静默丢弃是最常见的线上事故源头。
- SSH 免密不是可选项:用
ssh-keygen -t ed25519生成密钥,ssh-copy-id user@host推送,再测试rsync -n -avz /dev/null user@host:/tmp/ - cron 环境极简,PATH 不含
/usr/bin,必须写全路径:/usr/bin/rsync,不能只写rsync - 日志必须重定向:
>> /var/log/rsync-backup.log 2>&1,否则失败无迹可寻 - 远程命令建议加
--partial(断点续传)、--compress(压缩文本类传输)、--delete-after(删操作放最后,避免中间态丢失) - 排除干扰项:
--exclude=".DS_Store" --exclude="*.tmp" --exclude=".git/",否则可能因锁文件或元数据报错中断
--link-dest 路径拼错、或 cron 里漏了绝对路径,就变成“看起来每天都在备份,其实全是全量”。最危险的是——它不会报错,只会默默吃掉磁盘空间。


















