命令详解 rsync

rsync 用于本地或远程目录同步,能够基于文件差异减少重复传输。它会忠实执行参数:目标写错、方向写反或误用 --delete 都可能造成大范围数据丢失。重要数据先做独立备份,再使用 --dry-run 验证。

最容易踩坑:源路径末尾的斜杠

# 把 src 目录本身复制到 dest 下,形成 dest/src/...
rsync -a src dest/

# 只复制 src 目录中的内容到 dest/...
rsync -a src/ dest/

这两条命令结果不同。上线脚本前用小目录验证,并明确目标最终应出现的路径。

安全的执行顺序

# 1. 预演并显示变化
rsync -aHAXn --itemize-changes source/ destination/

# 2. 人工复核源、目标、排除项和删除项

# 3. 去掉 -n 后正式执行
rsync -aHAX --itemize-changes source/ destination/

-a 等价于归档模式的一组常用选项,但不包含硬链接 -H、ACL -A 和扩展属性 -X。是否需要这些元数据取决于文件系统、权限和恢复目标。

通过 SSH 远程同步

rsync -aHAX --info=progress2 -e 'ssh -p 22' \
  /srv/data/ user@server:/srv/backup/data/

首次连接要核对 SSH 主机指纹。不要在脚本中明文写密码;使用受控密钥、最小权限账号和限制命令。远端也需要可用的 rsync,且双方版本和文件系统能力可能不同。

排除规则

rsync -an --itemize-changes \
  --exclude='cache/' \
  --exclude='*.tmp' \
  source/ destination/

排除模式相对于传输根目录解释。规则复杂时使用 --exclude-from=FILE,并把规则文件纳入版本控制与评审。

谨慎使用 --delete

--delete 会删除目标中源端不存在的内容,使目标更像源端镜像。它不是“清理临时文件”的通用选项。

rsync -aHAXn --delete --itemize-changes source/ destination/

只有在 dry-run 输出经过审核、目标确为镜像且有可恢复备份时,才去掉 -n。可先使用 --max-delete=NUMBER 设置保护上限,或把即将删除的文件保留到备份目录:

rsync -a --delete --backup --backup-dir="../deleted-$(date +%F)" source/ destination/

增量快照式目录

--link-dest 可让未变化文件通过硬链接复用上一份快照的存储:

rsync -aHAX --delete \
  --link-dest=/backup/previous \
  /srv/data/ /backup/2026-10-17/

它要求目标文件系统支持硬链接,路径解析以目标端为准。必须定期执行恢复演练,不能仅凭目录存在就认为备份有效。

大文件与中断续传

rsync -a --partial --partial-dir=.rsync-partial --info=progress2 source/ destination/

--inplace 会直接修改目标文件,可能破坏快照、硬链接语义,也会让中断时留下不完整目标;除非明确理解后果,否则不作为默认项。

校验、时间戳和文件系统差异

  • 默认快速检查主要依赖大小和修改时间;--checksum 会读取双方全部文件计算校验,成本较高。
  • FAT、对象挂载、网络文件系统的时间精度、权限和符号链接能力可能不同。
  • 跨平台同步前要测试文件名大小写、非法字符、稀疏文件、ACL、xattr 和所有者映射。
  • root 运行会放大误操作影响,优先使用最小权限。

退出码与自动化

脚本必须检查 rsync 退出码,不能只看最后几行输出。部分文件消失、I/O 错误、权限不足或网络中断都可能导致非零状态。建议记录:开始时间、参数、源/目标、传输统计、退出码和告警,并对失败任务避免直接覆盖上一份可恢复备份。

同步不等于备份

同步可能把误删、勒索加密和损坏同步到目标。可靠备份还需要版本、隔离、保留策略、完整性校验和定期恢复演练。

官方参考

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-17 14:18:58

results matching ""

    No results matching ""