rsync 适用场景与准备工作
rsync 是 Linux 系统中最常用的文件同步与备份工具,最大特点是增量传输:第一次同步后,再次执行只会传输发生变化的文件片段,而不是全量拷贝,因此在同步大目录、做网站数据备份时效率远高于 cp 或 scp。它既可以在本地目录之间同步,也可以通过 SSH 在两台服务器之间推送或拉取数据,还可以配合 crontab 实现定时自动备份。
常见的适用场景包括:把本地项目目录同步到服务器、把服务器网站目录定期拉回本地或备份机、服务器之间迁移数据、以及对重要目录做每日增量备份。无论哪种场景,动手之前都建议先确认三件事:两端服务器都已安装 rsync(CentOS 使用 yum install rsync,Ubuntu/Debian 使用 apt install rsync,多数系统默认已自带);用来登录的 SSH 账号对目标目录有读写权限;目标磁盘有足够空间。对生产环境的业务数据,正式同步前务必先做一次完整备份,避免误操作造成不可逆的数据丢失。
第一步:本地目录同步与核心参数
本地同步最基础的命令是 rsync -av 源目录 目标目录。其中 -a 是归档模式,会递归同步子目录并保留文件权限、时间戳、软链接等属性;-v 用于显示同步过程,方便确认哪些文件被传输。如果是第一次操作不熟悉的结果,强烈建议先加上 -n 参数做一次预演,rsync 会列出将要执行的操作但不会真正写入任何文件,确认无误后再去掉 -n 正式执行。
# 预演:只看会同步哪些文件,不实际写入
rsync -avn /data/wwwroot/site/ /backup/site/
# 确认无误后正式同步
rsync -av /data/wwwroot/site/ /backup/site/
需要特别注意 --delete 参数:加上它之后,目标目录中多出来的文件会被删除,使目标与源保持完全一致,适合做镜像同步;但如果在命令里把源和目标写反,就可能删掉重要数据。因此使用 --delete 前务必反复核对方向,并先用 -n 预演。如果只想排除某些目录或文件,可以用 --exclude,例如 --exclude "*.log" 排除日志文件、--exclude "cache/" 排除缓存目录,多个排除项可以重复添加。

第二步:远程服务器同步的推送与拉取
rsync 通过 SSH 协议传输数据,默认走 22 端口,语法与 scp 类似。把本地目录推送到远程服务器使用 rsync -avz 本地目录/ user@远程IP:/目标路径/;把远程目录拉取到本地则把两端位置对调。-z 参数会在传输过程中压缩数据,适合带宽较小或跨地域同步的场景,内网大文件同步时是否开启可以视 CPU 负载决定。
# 推送:本地 → 远程服务器
rsync -avz /data/wwwroot/site/ root@192.168.1.10:/data/wwwroot/site/
# 拉取:远程服务器 → 本地备份目录
rsync -avz root@192.168.1.10:/data/wwwroot/site/ /backup/site/
如果服务器修改了 SSH 端口,需要通过 -e 参数指定,例如 rsync -avz -e "ssh -p 2222" 源 目标。这里还有一个最容易踩的坑:源路径带不带结尾斜杠含义不同。/data/wwwroot/site/ 表示同步 site 目录下的内容,而 /data/wwwroot/site 表示把 site 目录本身复制到目标路径下,同步后目标会多出一层 site 目录。第一次同步后如果发现目标目录结构不对,首先检查的就是结尾斜杠。
第三步:定时同步与带宽控制
把同步命令配置成定时任务,就能实现无人值守的自动备份。使用 crontab -e 编辑当前用户的定时任务,例如每天凌晨 2 点执行一次同步,可以写成 0 2 * * * rsync -av --delete /data/wwwroot/site/ /backup/site/。生产环境建议把执行时间安排在业务低峰期,并在命令中记录日志,方便事后排查同步是否正常。
# 每天凌晨 2 点同步,并写入日志
0 2 * * * rsync -av --delete /data/wwwroot/site/ /backup/site/ >> /var/log/rsync-site.log 2>&1
同步大文件时还可能遇到占满带宽、影响线上业务的问题,这时可以加 --bwlimit 限制传输速度,例如 --bwlimit=2048 表示限制为 2MB/s。对于需要保留历史版本的场景,可以结合日期命名备份目录,每日一个独立目录,再定期清理过期目录;更进阶的还可以使用 --link-dest 做硬链接增量备份,在节省空间的同时保留多日版本,具体参数建议以官方文档为准,先在测试环境验证后再上生产。
常见问题(FAQ)
问题一:同步后目标目录里多了一层文件夹,或者文件对不上?这大多是源路径结尾斜杠的问题。/data/site/ 同步的是目录内容,/data/site 同步的是目录本身,按上面的说明调整即可;另外检查是否误加了或漏加了 --delete,它决定了目标中多余文件是否被清理。
问题二:提示 permission denied 或权限相关错误怎么办?先确认 SSH 账号对目标目录有写权限,必要时在目标服务器上用 ls -ld 查看目录属主,或提前创建好目标目录并 chown 给对应账号;本地同步则检查是否以足够权限的用户执行。
问题三:同步中断后可以续传吗?可以。rsync 支持断点续传,网络恢复后重新执行相同命令即可,已传输的未变化文件不会重复传输。对超大目录或跨公网同步,建议在屏幕或 systemd 环境下执行,避免 SSH 断开导致任务中断。
问题四:rsync 和 scp、cp 有什么区别,该怎么选?cp 只适合本地一次性拷贝;scp 每次都会全量传输且不支持排除、增量;rsync 支持增量传输、排除规则、限速、断点续传,是目录同步和定期备份的优先选择。
总结
rsync 的核心用法可以归纳为:本地同步用 rsync -av,远程同步加 -z 并通过 SSH 账号指定两端路径,删除多余文件用 --delete,排除文件用 --exclude,正式操作前先用 -n 预演。做定期备份时再配合 crontab 与日志记录,并用 --bwlimit 控制带宽影响。
最后再强调安全习惯:涉及数据同步的操作,执行前先备份、先预演、先核对源与目标的方向,--delete 尤其要谨慎;对生产目录建议选择业务低峰期执行,并在测试环境验证命令后再上线。掌握这些要点,日常的目录同步、服务器迁移和数据备份都可以用 rsync 稳定高效地完成。











暂无评论内容