网站备份天天全量拷贝太慢?两台服务器之间同步文件用 scp 传一半断了?想把本地目录和服务器保持完全一致?这些场景都该用 rsync。rsync 是 Linux 下最强的文件同步工具:只传输差异部分、支持断点续传、可以增量备份、还能加密传输。这篇文章把 rsync 的参数、实战场景和常见坑一次讲透。
一、rsync 是什么?为什么比 scp 快
rsync(remote sync)的原理是分块校验 + 只传差异:它把文件切成固定大小的数据块,先比对源和目标的校验和,只把有变化的部分传过去。所以第一次同步可能慢,第二次开始就飞快——备份、日志、网站代码这种重复性传输场景,rsync 是首选。
scp # 每次都全量拷贝,适合小文件、一次性传输
rsync # 增量同步,适合大目录、定期备份、长期同步
本地先测试 rsync 是否安装:
rsync --version
# 没有的话
yum install -y rsync # CentOS
apt install -y rsync # Ubuntu/Debian
二、最常用的参数组合
rsync 参数很多,但 90% 的场景用下面这一组就够了:
rsync -avz 源目录/ 目标目录/
| 参数 | 作用 |
|---|---|
| -a | 归档模式,等价于 -rlptgoD(保留权限、属主、时间戳、软链接、设备文件) |
| -v | 显示同步过程 |
| -z | 传输时压缩,适合带宽小的场景 |
| -P | 等于 --partial + --progress,断点续传并显示进度 |
| --delete | 删除目标端源端没有的文件(保持完全一致,小心使用) |
| -n | 试运行(dry-run),先看会同步什么,不实际执行 |
| -e | 指定远程 shell,常用 -e 'ssh -p 2222' 指定端口 |
注意结尾斜杠的坑:
rsync -avz /data/ /backup/ # 同步 /data/ 目录下的内容到 /backup/
rsync -avz /data /backup/ # 把 /data 这个目录本身放进去,变成 /backup/data
结尾有没有斜杠,结果完全不同,这是新手最容易踩的坑。
三、断点续传与进度显示
大文件同步一半断了,重新跑一遍是不是要重来?不会。加 -P 参数即可断点续传:
rsync -avzP /data/bigfile.zip root@1.2.3.4:/backup/
中途 Ctrl+C 或断网,再执行同一条命令,会从上次中断的位置继续,不用从头再来。
四、本地目录同步与增量备份
场景 1:本地备份(比如把网站目录备份到另一块盘)
rsync -avzP /www/wwwroot/site/ /backup/site/
场景 2:增量备份 + 保留历史版本(每天备份一次,保留最近 7 天)
rsync -avz --backup --backup-dir=/backup/history/$(date +%Y%m%d) /www/wwwroot/site/ /backup/site/
这样每天同步最新状态到 /backup/site,被覆盖或删除的旧文件会进到按日期命名的 history 目录,误删了也能找回。
五、跨服务器同步与免密配置
场景 3:两台服务器之间同步(用 SSH 传输,天然加密)
rsync -avzP /www/wwwroot/site/ root@192.168.1.10:/backup/site/
场景 4:远程拉取到本地
rsync -avzP root@192.168.1.10:/www/wwwroot/site/ /backup/site/
每次都要输密码很烦,配置 SSH 密钥免密登录(rsync 走的就是 SSH):
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.1.10
配置后 rsync 就不用输密码了,配合 cron 就能实现无人值守备份。
场景 5:指定 SSH 端口(VPS 常改端口)
rsync -avzP -e "ssh -p 2222" /www/ root@192.168.1.10:/backup/
六、保持目录完全一致:--delete
如果想让目标目录和源目录一模一样(源删了目标也删),加 --delete:
rsync -avz --delete /www/wwwroot/site/ root@192.168.1.10:/backup/site/
⚠️ --delete 很危险:如果源目录写错或为空,目标会被清空。强烈建议先用 -n 试运行:
rsync -avzn --delete /www/wwwroot/site/ root@192.168.1.10:/backup/site/
先看输出里会删除哪些文件,确认无误再去掉 -n。
七、排除不想同步的文件
日志、缓存、临时文件经常不需要同步,用 --exclude:
rsync -avzP --exclude "cache/" --exclude "*.log" --exclude ".git/" /www/wwwroot/site/ /backup/site/
多个排除项可以写进文件里统一管理:
rsync -avzP --exclude-from=/root/exclude.txt /www/wwwroot/site/ /backup/site/
exclude.txt 每行一个规则:
cache/
runtime/
*.log
.git/
八、定时自动同步:cron 组合
免密配置好后,就可以写 crontab 定时同步。每天凌晨 2 点备份网站:
crontab -e
0 2 * * * rsync -avzP --delete /www/wwwroot/site/ root@192.168.1.10:/backup/site/ >> /var/log/rsync.log 2>&1
再配合日志保留策略,就是一个完整的数据备份方案。要确认脚本有没有成功,可以看 /var/log/rsync.log 里有没有报错。
九、rsync 实时同步:inotifywait
cron 最短只能到分钟级,想文件一变就同步,用 inotify-tools 监听:
yum install -y inotify-tools
inotifywait -mrq --format '%w%f' -e modify,create,delete /www/wwwroot/site/ | while read file
do
rsync -avzP --delete /www/wwwroot/site/ root@192.168.1.10:/backup/site/
done
放到 nohup 后台运行即可,文件有任何变化都会立刻触发同步。
十、常见报错与排查
1. 提示 rsync: connection unexpectedly closed
一般是 SSH 端口、密钥或网络问题。先单独测试 SSH 能否连通:
ssh -p 2222 root@192.168.1.10
2. Permission denied (publickey)
密钥没配好或权限不对。检查 ~/.ssh/authorized_keys 权限:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
3. 同步后属主/权限变了
加 -a 参数保留权限属主;如果要强制属主,用 --chown:
rsync -avzP --chown=www:www /www/ root@192.168.1.10:/backup/
4. 大目录同步太慢
第一次全量同步慢是正常的;后续增量会快很多。如果还是慢,加 -z 压缩,或者换更好的网络线路。
总结
rsync 是 Linux 运维的必备技能,核心就记住这几点:-avz 是基础组合,-P 断点续传,--delete 完全一致(慎用),--exclude 排除无用文件,配合 SSH 密钥和 cron 就能实现无人值守的自动备份。多练习几次,你会离不开它。




