rsync 命令详解与实战:增量同步、断点续传、免密配置与实时备份方案


网站备份天天全量拷贝太慢?两台服务器之间同步文件用 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 就能实现无人值守的自动备份。多练习几次,你会离不开它。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

LVM 逻辑卷管理详解:PV/VG/LV 三件套、在线扩容缩容、快照与迁移实战

SSH 隧道与端口转发详解:本地转发、远程转发、动态代理与跳板机实战

评 论
更换验证码