服务器间传文件、做增量备份、镜像目录——rsync是这些任务的标准答案。它比scp聪明得多:只传输有变化的部分,速度快、省带宽。本文带你掌握这个运维必备工具。
一、rsync为什么比scp强?
scp每次都传输全部文件,而rsync的核心是增量传输:它对比源和目标,只传输有变化的文件、甚至文件中变化的部分。第一次同步一个大目录后,之后每次同步只传改动过的内容——速度快、省带宽、适合反复同步的场景(如每日备份)。
二、基础用法
# 本地目录同步
rsync -av /源目录/ /目标目录/
# 同步到远程服务器(经SSH)
rsync -av /本地目录/ user@服务器IP:/远程目录/
# 从远程拉回本地
rsync -av user@服务器IP:/远程目录/ /本地目录/
注意末尾的斜杠:源目录带 / 表示”同步目录里的内容”,不带表示”同步整个目录”。这个细节常导致同步结果不符预期,务必留意。
三、常用参数详解
- -a(归档模式):保留权限、时间、软链接等,最常用,基本必加;
- -v(verbose):显示传输过程;
- -z:传输时压缩,跨网络同步省带宽;
- -P:显示进度 + 支持断点续传(传大文件必备);
- –delete:删除目标中源没有的文件(镜像同步,危险,慎用——用错方向会删数据);
- -n / –dry-run:试运行,只显示会做什么但不真执行——用–delete前一定先加-n预演!
四、经SSH安全同步(指定端口/密钥)
rsync -avz -e "ssh -p 2222 -i ~/.ssh/key" /本地/ user@IP:/远程/
用 -e 指定SSH参数,配合密钥登录(参考博客SSH进阶篇的config,还能简化成 rsync -avz /本地/ hk-web:/远程/)。
五、排除不需要同步的文件
rsync -av --exclude 'node_modules' --exclude '*.log' /源/ /目标/
# 或用排除列表文件
rsync -av --exclude-from='exclude.txt' /源/ /目标/
同步代码时排除 node_modules、缓存、日志等,只传有意义的内容。
六、实战:定时增量备份脚本
rsync是本地增量备份的好工具(配合rclone做异地备份,参考博客备份篇):
#!/bin/bash
# 增量备份网站目录到备份盘
rsync -az --delete /www/wwwroot/ /backup/www/
# 增量同步到另一台服务器
rsync -az /www/wwwroot/ hk-backup:/backup/www/
加入crontab每日执行(参考crontab篇)。因为是增量,即使目录很大,每日同步也很快。
七、避坑要点
- –delete前必先–dry-run预演:这是防止误删的铁律;
- 注意斜杠:源目录尾部斜杠的有无决定同步结果;
- 方向别搞反:rsync 源 目标,想清楚哪个是源哪个是目标;
- 大量小文件慢:海量小文件时rsync建立文件列表较慢,可考虑先打包再传。
结论
rsync是服务器文件传输和增量备份的瑞士军刀:增量高效、经SSH安全、可排除可预演。掌握 -avzP 组合和 --dry-run 预演习惯,日常的目录同步、迁移、备份都能优雅搞定。在你的服务器之间用rsync同步一次目录,体会它增量传输的速度优势。