rsync 是什么
rsync 是文件级同步与备份工具,核心是『左右对比、只传差异』的增量算法:先比较两侧文件的大小与修改时间,再只传输发生变化的部分,因此重复执行的开销远低于整目录拷贝。它既支持本地目录之间同步,也能通过 SSH 通道与远程主机互传,是文件级备份脚本最常用的组件。
基本信息
| 定位 | 文件级同步与备份工具 |
|---|---|
| 核心优势 | 增量算法只比较并传输变化部分 |
| 常用组合 | -a 归档模式加 -v 详细输出,按需叠加其他选项 |
| 传输通道 | 本地、SSH 远程 shell、rsync 守护进程 |
| 适用范围 | Linux 与 macOS 自带;Windows 可用 cwRsync 或 WSL |
本地与远程同步
本地与远程同步
rsync -av /data/ /backup/data/ # 本地同步
rsync -av /data/ user@10.0.0.5:/backup/data/ # 推送到远程
rsync -av user@10.0.0.5:/data/ /backup/data/ # 从远程拉取
rsync -avz -e ssh /data/ backup@10.0.0.5:/backup/data/ # 走 SSH 通道并压缩核心选项对照
| 选项 | 作用 | 注意 |
|---|---|---|
| -a | 归档模式,等于 -rlptgoD | 默认不保留 ACL 与扩展属性 |
| -n | 预演,只显示将要执行的动作 | 危险同步前的例行步骤 |
| --delete | 删除目标端多余文件 | 镜像同步不等于备份 |
| --link-dest | 未变化文件硬链接到基准目录 | 生成空间友好的多份快照 |
| --bwlimit | 限制传输带宽,单位为 KB/s | 避免挤占业务链路 |
典型使用场景
- 日常目录同步:把站点目录或共享目录定期复制到备份服务器
- 远程异地传输:通过 SSH 通道把增量推到异地存储,不额外开放服务端口
- 硬链接快照:配合 --link-dest 生成每天一份完整视图,只占新增数据的空间
- 限速迁移:用 --bwlimit 在业务高峰约束带宽,把大批量传输摊平到全天
- 变更前留底:改动配置或升级前先同步一份到临时目录,便于快速回退
rsync 不是备份
容易忽略的一点:rsync 维护的是镜像关系,源端删除会同步到目标端,它本身不产生历史版本,也无法抵御勒索软件对两侧的同时加密。因此 rsync 更适合作为副本传输手段,真正的备份还需要硬链接快照目录或独立归档来保留历史版本。
常见误解
- 把 rsync 当备份:镜像副本只有当前状态,误删后没有可回退的历史点
- 以为 -a 会保留一切:ACL、扩展属性与硬链接需要额外的 -A、-X、-H
- 以为同步一定能传完:中断后未加 -P 会从头再来,大文件尤其明显
- 以为结果可信:默认按大小与修改时间判断差异,时钟漂移时会漏同步或反复全量
- 以为退出码 0 就万事大吉:部分源文件在传输中消失会返回 24,需要按语义单独处理
常用组合示例
常用组合示例
rsync -av --delete --exclude-from=/etc/backup-exclude.txt /data/ /backup/data/
rsync -avP --bwlimit=30000 /data/ /backup/data/ # 显示进度并可续传,限速 30MB/s
rsync -avni --delete /data/ /backup/data/ # 执行前预演,核对删除清单
rsync -av -e "ssh -i /root/.ssh/backup_key -o BatchMode=yes" /data/ backup@10.0.0.5:/backup/data/--delete 会让目标端在源端删除的文件一并消失,且源与目标路径写反时会把备份数据抹掉;执行前先跑 -n 预演并逐行确认删除清单。
源路径结尾的斜杠语义不同:/data/ 表示复制目录内容,/data 表示连同目录本身一起复制,脚本中要固定写法避免层级偏移。
退出码与失败处理
- 退出码 0 表示传输成功,是脚本里唯一可以按成功处理的情况
- 退出码 24 表示有源文件在传输期间消失,通常按成功处理但要在日志中留痕
- 其余非零值都应触发告警,常见原因是权限不足、磁盘写满与网络中断
- 限速任务在窗口内没跑完时退出码仍可能是 0,需要额外比对耗时趋势发现异常
- 多数发行版的 cron 不会重复发送相同输出,脚本应主动写日志并接入告警通道