首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >rsync 同步与备份实战:末尾斜杠、--delete 的风险与 --link-dest 增量快照

rsync 同步与备份实战:末尾斜杠、--delete 的风险与 --link-dest 增量快照

原创
作者头像
一只特立独行的兔先生
发布于 2026-11-02 09:11:27
发布于 2026-11-02 09:11:27
810
举报

背景

在服务器之间同步文件、做定时备份,rsync 是最常用的工具:它只传输变化的部分,支持断点续传,通过 SSH 即可使用。但它有几个容易出事故的细节,比如源路径末尾的斜杠、--delete 误删目标文件。本文按“先安全、再高效”的顺序整理。

一、基本用法

代码语言:bash
复制
rsync -avz /data/app/ user@192.168.0.10:/backup/app/

常用选项:

  • -a:归档模式,递归并保留权限、时间戳、属主属组、符号链接,等价于 -rlptgoD。
  • -v:显示详细过程。
  • -z:传输时压缩。对已经压缩过的文件(图片、视频、压缩包)收益很小,局域网内也未必划算。
  • -P:等于 --partial --progress,保留传输中断的部分文件并显示进度,大文件断点续传依赖它。
  • -e "ssh -p 2222":指定 SSH 端口或其他参数。

二、源路径末尾斜杠的区别

这是最常见的坑:

代码语言:bash
复制
# 同步目录“里面的内容”到目标目录
rsync -a /data/app/ /backup/app/

# 同步目录“本身”,目标下会多出一层 app 目录
rsync -a /data/app /backup/app/

第一条结果是 /backup/app/文件...,第二条结果是 /backup/app/app/文件...。目标路径末尾的斜杠影响不大,源路径的斜杠才有区别。

三、--delete:让目标与源保持完全一致

默认情况下,rsync 只复制和更新,不会删除目标中多出的文件。加上 --delete 后,目标里源端没有的文件会被删除。这对镜像同步有用,但配错路径就会造成数据丢失。

使用前务必先做演练:

代码语言:bash
复制
rsync -avn --delete /data/app/ /backup/app/

-n(--dry-run)只显示将要执行的动作,不做实际修改。确认删除列表符合预期后再去掉 -n。还要警惕:

  1. 源目录为空或没有挂载成功时,--delete 会把目标清空。脚本里应先检查源目录是否存在且非空。
  2. 用变量拼接路径时,变量为空会让路径变成根目录,务必检查。
  3. 可以用 --max-delete=100 限制一次最多删除的文件数,作为保险。

四、排除与包含

代码语言:bash
复制
rsync -av --exclude='*.log' --exclude='node_modules/' /data/app/ /backup/app/

排除规则很多时,用文件管理:--exclude-from=/etc/rsync-exclude.txt。

五、用 --link-dest 做增量快照

每天做一份完整备份占用空间很大。--link-dest 让没有变化的文件以硬链接指向上一次备份,只为变化的文件占用新空间,而每个日期目录看起来都是一份完整备份:

代码语言:bash
复制
today=$(date +%F)
rsync -a --delete \
  --link-dest=/backup/snap/latest \
  /data/app/ /backup/snap/$today/
ln -sfn /backup/snap/$today /backup/snap/latest

要点:

  • 备份目录必须在同一个文件系统上,硬链接才能工作。
  • 删除某一份快照目录不会影响其他快照,因为文件内容在所有链接都删除后才会被释放。
  • 需要配合清理脚本,保留最近若干天,避免备份无限增长。
  • 首次执行时 latest 不存在,rsync 会提示但仍会做完整复制。

六、传输校验与性能

  • 默认依据文件大小和修改时间判断是否变化,速度快。需要严格校验内容时,加 --checksum,会读取并计算两端文件的校验和,较慢。
  • 限速避免占满带宽:--bwlimit=20000(单位 KB/s)。
  • 大量小文件时,瓶颈往往在文件列表扫描和磁盘 IO,而不是带宽。
  • 使用 --info=progress2 可以查看整体进度。

七、定时任务与安全

  1. 用 SSH 密钥登录,避免在脚本里写密码;给备份账号只授予必要的目录权限。
  2. 在 crontab 里使用绝对路径,并将输出写入日志。长时间任务配合 flock 防止重叠运行。
  3. 需要更严格的限制时,可以在 authorized_keys 中用 command= 限定该密钥只能执行 rsync。
  4. 备份完成后检查退出码,非 0 时告警。rsync 的退出码 23、24 表示部分文件传输失败或文件在传输中消失,要区别对待。
  5. 定期做恢复演练,没有验证过能恢复的备份不算备份。

小结

  1. 源路径末尾的斜杠决定是复制“内容”还是“目录本身”。
  2. --delete 前先 -n 演练,脚本里检查源目录并加删除数量上限。
  3. 用 --link-dest 做节省空间的增量快照。
  4. 备份要有监控、有保留策略,并验证恢复流程。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 背景
  • 一、基本用法
  • 二、源路径末尾斜杠的区别
  • 三、--delete:让目标与源保持完全一致
  • 四、排除与包含
  • 五、用 --link-dest 做增量快照
  • 六、传输校验与性能
  • 七、定时任务与安全
  • 小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档