rsync 是什么
rsync 的核心是差异传输:它先在两端比较文件,只把变化的部分传过去,源与目标都在远端时也只传输一次数据。默认的判断依据是大小与修改时间(mtime),满足这两项就跳过,所以用 -a 保留时间戳对增量效果至关重要;如果 mtime 因为文件系统精度或复制方式被改掉,rsync 会反复重传同样的文件,这时才需要 -c 用校验和判断。本地同步与远程同步共用一套语法,走 SSH 通道时不需要在服务端额外部署 rsync 守护进程。
基本信息
| 适用平台 | Linux、macOS、BSD 通用(rsync 3.x);两端都要安装 rsync,版本差异过大会导致选项不兼容 |
|---|---|
| 命令语法 | rsync [选项] 源 目标;远程写法 用户@主机:路径,或 rsync:// 模块协议 |
| 归档选项 | -a 等于 -rlptgoD:递归、保留链接、权限、时间、属组、属主、设备文件 |
| 常用选项 | -v 详细、-z 传输压缩、-P 等于 --partial --progress、-n 干跑、--delete 镜像删除、--exclude 排除、--bwlimit 限速、-i 显示变更明细 |
| 权限要求 | 保留属主与属组需要 root;非 root 执行 -a 会报权限错误,需加 --no-owner --no-group 或改用 --chown |
典型使用场景
- 定时增量备份:配合 cron 每小时把数据目录同步到备份盘,只传变化部分,带宽与时间都可控
- 目录镜像:用 --delete 让目标端与源端逐字节一致,适合发布机到多台应用机的分发
- 跨机迁移:先做一次全量,再反复跑增量直到切换窗口内只差最后一点数据
- 断点续传大文件:--partial 保留未传完的临时文件,网络中断后不必从头再来
- 受控带宽传输:--bwlimit 限制速率,避免备份任务挤占生产链路
- 验证与排错:-n 加 -i 打印每个文件将被如何处理,先看清再执行
常用示例
常用示例
rsync -avn --delete /data/site/ /backup/site/ # 干跑:先看会删会传什么
rsync -av --delete /data/site/ /backup/site/ # 确认无误再实跑
rsync -avz -e 'ssh -p 2222' /data/site/ deploy@10.0.0.8:/srv/site/
rsync -av --exclude-from=/etc/rsync-exclude /data/ /backup/data/
rsync -avP --bwlimit=5000 /data/big/ /backup/big/ # 进度 + 断点续传 + 限速
rsync -avi /data/site/ /backup/site/ | head -30 # 看每个文件的变更原因关键选项对照
| 选项 | 作用 | 注意 |
|---|---|---|
| -a | 归档模式,保留权限、时间、属主、链接 | 非 root 会因属主属组报错 |
| -n | 干跑,只显示要做什么 | 与 --delete 搭配使用是标准动作 |
| --delete | 删除目标端多余的文件,保持镜像 | 源填错会清空目标,务必先 -n 核对 |
| --exclude | 按模式排除文件或目录 | 模式相对传输根目录,用 --exclude-from 管理长列表 |
| --partial | 中断时保留已传部分,下次续传 | 配合 --progress 或 -P 使用 |
| -c | 用校验和判断差异,忽略时间戳 | 准确但要把两端文件都读完,大目录明显变慢 |
重复传输的常见原因不是 rsync 坏了,而是 mtime 精度:FAT、部分网络存储与某些复制方式只保留到秒甚至两秒,导致两端时间戳总差一点,rsync 每次都判定需要传。可用 --modify-window=2 放宽比较精度,或直接信任内容用 -c。
保留硬链接要用 -H,默认会把每个硬链接当成独立文件分别传输,占用额外空间;-H 需要在两端维护链接映射,大目录上内存与时间开销都明显上升,只在确实使用硬链接的场景开启。
源路径结尾的斜杠改变语义:/data/site/ 表示同步目录内容,/data/site 表示在目标下再建一层 site 目录。--delete 会把这条语义差异放大成「删多一层」或「多建一层」,执行前用 -n 看清清单是最低成本的自保。