作为Linux系统管理员,我每天都要处理大量文件同步任务。从最初的cp/scp命令一路用过来,直到遇到rsync才真正体会到什么叫做"专业工具干专业事"。rsync不仅仅是一个文件复制工具,而是一套完整的增量同步解决方案。
rsync的核心优势在于其差异同步算法。它通过比较源文件和目标文件的校验和,仅传输发生变化的部分。这种机制带来的直接好处是:
在实际工作中,我发现这些场景特别适合使用rsync:
提示:当目录中文件数量超过1万时,rsync的性能优势会变得非常明显。我曾用rsync同步一个包含15万个小文件的目录,相比scp节省了83%的时间。
rsync的命令格式看似简单,但包含许多细节:
bash复制rsync [OPTIONS] SRC... [DEST]
这里有几个关键点需要注意:
归档模式(-a):
这是我最常用的参数组合,相当于同时启用:
压缩传输(-z):
在网络传输时特别有用,但要注意:
进度显示(--progress):
大文件传输时的救命稻草,会显示:
这是新手最容易踩的坑,也是面试时常问的问题。看这两个命令的区别:
bash复制rsync -av /data/project /backup
rsync -av /data/project/ /backup
第一个命令会将整个project目录复制到backup目录下,结果是:
code复制/backup/project/[内容]
而第二个命令会将project目录中的内容直接复制到backup目录,结果是:
code复制/backup/[内容]
经验法则:源路径结尾带斜杠表示"目录内的内容",不带斜杠表示"整个目录"
远程路径的完整格式是:
bash复制[USER@]HOST:DEST
其中:
特别注意:
这是我常用的备份脚本框架:
bash复制#!/bin/bash
SRC="/var/www/html"
DST="/backup/web-$(date +%Y%m%d)"
LINK_DEST="/backup/web-latest"
rsync -av --delete \
--link-dest=$LINK_DEST \
$SRC/ $DST/
rm -f $LINK_DEST
ln -s $DST $LINK_DEST
这个方案的精妙之处在于:
rsync的include/exclude模式非常强大:
bash复制rsync -av \
--include='*/' \
--include='*.php' \
--include='*.js' \
--exclude='*' \
src/ dst/
这个命令实现了:
注意:include/exclude的顺序很重要,rsync会按顺序匹配
对于大文件传输,这些参数组合很有效:
bash复制rsync -av --partial --progress \
--bwlimit=5000 \
--timeout=60 \
largefile user@host:/path/
参数说明:
问题1:rsync速度突然变慢
问题2:权限被拒绝
问题3:连接中断
建议始终通过SSH使用rsync:
bash复制rsync -av -e "ssh -T -c aes256-ctr -o Compression=no" src/ dst/
这个命令:
对于备份场景,可以配置rsync守护进程:
ini复制# /etc/rsyncd.conf
[backup]
path = /data/backup
read only = yes
list = no
auth users = backup
secrets file = /etc/rsyncd.secrets
这样客户端可以通过:
bash复制rsync -av src/ backup@host::module
实现认证同步,且服务端文件不会被修改。
使用--stats参数获取详细传输统计:
bash复制rsync -av --stats src/ dst/
输出示例:
code复制Number of files: 1,234
Number of files transferred: 123
Total file size: 1.56GB
Total transferred file size: 156MB
Literal data: 156MB
Matched data: 0B
File list size: 45.67KB
File list generation time: 0.012s
File list transfer time: 0.000s
Total bytes sent: 158MB
Total bytes received: 1.25MB
建议将重要同步任务日志保存:
bash复制rsync -av --log-file=/var/log/rsync/$(date +%Y%m%d).log \
src/ dst/
日志文件可以配合logrotate进行轮转:
conf复制# /etc/logrotate.d/rsync
/var/log/rsync/*.log {
daily
rotate 30
compress
missingok
notifempty
}
虽然rsync很强大,但某些场景下其他工具可能更合适:
| 工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| cp | 简单直接 | 无增量同步 | 单机小文件复制 |
| scp | 简单加密 | 无增量同步 | 快速传输单个文件 |
| tar+ssh | 保留属性 | 需要管道操作 | 整个目录打包传输 |
| rclone | 支持云存储 | 配置复杂 | 云存储同步 |
| syncthing | 实时同步 | 资源占用高 | 多设备实时同步 |
在最近的一个项目中,我需要同步两个数据中心之间约20TB的科研数据。经过测试,rsync配合--bwlimit参数在30天内完成了初始全量同步,之后的每日增量同步只需15-30分钟,而使用scp的方案根本无法完成这个任务。