rsync 从入门到精通:超详细教程(逐句解析)
一、rsync 是什么?
rsync(Remote Sync)是 Linux/Unix 系统中用于高效同步文件和目录的工具。它通过差异传输算法,仅传输源文件与目标文件的差异部分,大幅减少数据传输量。
1.1 rsync核心特性
- 增量同步:只同步变化内容
- 保留属性:权限、时间戳、符号链接等
- 断点续传:中断后可继续传输
- 远程同步:支持 SSH、NFS、Rsync 守护进程
- 压缩传输:减少网络流量
1.2 rsync核心优势对比表
| 特性 | rsync | scp | FTP | NFS |
|---|
| 传输方式 | 增量传输(仅变化部分) | 全量传输 | 全量传输 | 块级读写 |
| 效率 | 高(适合大目录) | 低 | 低 | 高(局域网) |
| 压缩 | 支持(-z) | 支持(手动) | 不支持 | 不支持 |
| 权限保留 | 支持(-a) | 支持 | 不支持 | 支持 |
| 断点续传 | 支持(--partial) | 不支持 | 不支持 | 不支持 |
| 安全性 | SSH 加密 | SSH 加密 | 明文(FTPS/SFTP 可加密) | 需配置加密 |
二、安装 rsync
2.1 Linux 安装命令:
sudo apt install rsync
sudo yum install rsync
sudo dnf install rsync
sudo pacman -S rsync
三、基础语法详解
3.1 rsync基本语法
rsync [选项] 源路径 目标路径
3.2 路径末尾 / 的影响对比表
| 命令 | 行为 | 示例结果 |
|---|
rsync -a dir1 dir2/ | 同步 dir1 目录本身 | dir2/dir1/... |
rsync -a dir1/ dir2/ | 同步 dir1 内容 | dir2/file1, dir2/file2... |
3.3 rsync示例命令拆解:
rsync -avz /home/user/docs/ user@remote:/backup/
| 参数 | 功能说明 |
|---|
-a | 归档模式(递归、保留权限、时间戳等) |
-v | 详细输出(显示同步过程) |
-z | 压缩传输(减少网络流量) |
/home/user/docs/ | 源路径(本地目录) |
user@remote:/backup/ | 目标路径(远程服务器目录) |
四、关键选项详细解析
4.1 -a(archive):保留文件属性
- 等价于组合选项:
-rlptgoD
-r:递归同步目录-l:保留符号链接-p:保留权限-t:保留时间戳-g:保留所属组-o:保留所有者(需 root 权限)-D:保留设备文件和特殊文件
4.2 -v(verbose):显示详细信息
- 级别控制:
-v:显示同步的文件名-vv:显示更多调试信息(如跳过原因)
4.3 -z(compress):压缩传输
4.4 --progress:显示进度条
rsync -av --progress source/ dest/
4.5 --delete:删除目标多余文件
rsync -av --delete source/ dest/
4.6 --exclude 和 --include:过滤文件
rsync -av \
--exclude='*.tmp' \
--exclude='.git/' \
source/ dest/
4.7 -u(update):仅同步更新的文件
4.8 --partial:断点续传
rsync -avz --partial source.iso user@remote:/backup/
4.9 常用选项总结表
| 选项 | 功能 | 是否必要 | 示例 |
|---|
-a | 归档模式(递归、保留属性) | ✅ 必须 | rsync -a source/ dest/ |
-v | 详细输出 | ✅ 建议 | rsync -av source/ dest/ |
-z | 压缩传输 | ✅ 网络传输时建议 | rsync -avz source/ user@remote:/dest/ |
--progress | 显示进度条 | ✅ 大文件时建议 | rsync -av --progress source/ dest/ |
--delete | 删除目标多余文件 | ⚠️ 谨慎使用 | rsync -av --delete source/ dest/ |
--exclude=PATTERN | 排除匹配文件 | ✅ 灵活过滤 | rsync -av --exclude='*.tmp' source/ dest/ |
--partial | 断点续传 | ✅ 大文件建议 | rsync -av --partial file.iso user@remote:/dest/ |
-n 或 --dry-run | 模拟运行 | ✅ 测试命令前必须 | rsync -avn source/ dest/ |
-e "ssh -p PORT" | 自定义 SSH 端口 | ✅ 非默认端口时必须 | rsync -avz -e "ssh -p 2222" source/ user@remote:/dest/ |
五、本地同步 vs 远程同步
5.1 本地同步(Local)
rsync -av /path/to/source/ /path/to/destination/
5.2 远程同步(Remote)
(1)推送(Push):本地 → 远程
rsync -avz /local/data/ user@remote:/remote/backup/
(2)拉取(Pull):远程 → 本地
rsync -avz user@remote:/remote/data/ /local/backup/
六、高级用法与实战案例
案例 1:增量备份网站目录
rsync -avz \
--exclude='cache/' \
--exclude='*.log' \
/var/www/html/ \
backup@backup-server:/backups/www-$(date +%F)/
案例 2:限速同步大文件
rsync -avz --bwlimit=1000 /data/large_files/ user@remote:/backup/
--bwlimit=1000:限制带宽为 1000 KB/s(约 8 Mbps)
案例 3:断点续传
rsync -avzP --partial /huge_file.iso user@remote:/backup/
-P = --partial --progress
案例 4:自定义 SSH 端口
rsync -avz -e "ssh -p 2222" /data/ user@remote:/backup/
七、守护进程模式(Daemon Mode)
7.1 配置文件 /etc/rsyncd.conf
[backup]
path = /srv/backup
comment = Backup Area
read only = no
auth users = backupuser
secrets file = /etc/rsyncd.secrets
7.2 启动服务
rsync --daemon
7.3 客户端同步
rsync -av /data/ backupuser@remote::backup/
八、性能优化技巧
| 技巧 | 说明 |
|---|
-W | 全文件复制(跳过差异计算,适合小文件多的场景) |
--block-size=8192 | 调整 block 大小(默认 700B) |
| 并行同步 | 使用 parallel 工具分目录同步 |
| 关闭压缩 | 本地同步时去掉 -z 提高速度 |
九、常见问题与解决方案
Q1:Permission denied?
- 检查目标目录写权限
- 若使用
-o,需 root 权限 - SSH 用户是否有权限写入远程目录?
Q2:文件未同步?
- 使用
-n -v 先 dry-run 测试 - 检查
--exclude 是否误排除 - 时间戳是否一致?(用
-I 强制同步)
Q3:速度慢?
- 关闭压缩(去掉
-z) - 使用
-W 跳过差异算法 - 检查网络带宽或磁盘 I/O
十、总结:rsync 使用模板
| 场景 | 推荐命令 | 说明 |
|---|
| 日常备份 | rsync -av --delete source/ dest/ | 保留属性并删除多余文件 |
| 网络传输 | rsync -avz source/ user@host:dest/ | 压缩传输 |
| 安全测试 | rsync -avn --delete source/ dest/ | 模拟运行前测试 |
| 大文件续传 | rsync -avzP --partial file user@host:path/ | 支持断点续传 |
| 精细过滤 | rsync -av --include='*.jpg' --exclude='*' source/ dest/ | 仅同步指定文件类型 |
附录:常用选项速查表
| 选项 | 说明 | 示例 |
|---|
-a | 归档模式(递归+保留属性) | rsync -a source/ dest/ |
-v | 详细输出 | rsync -av source/ dest/ |
-z | 压缩传输 | rsync -avz source/ user@remote:/dest/ |
-n | 模拟运行 | rsync -avn source/ dest/ |
--delete | 删除目标多余文件 | rsync -av --delete source/ dest/ |
--exclude | 排除文件 | rsync -av --exclude='*.tmp' source/ dest/ |
-P | 显示进度 + 断点续传 | rsync -avP source/ dest/ |
-e "ssh -p 2222" | 自定义 SSH 端口 | rsync -avz -e "ssh -p 2222" source/ user@remote:/dest/ |