rsync是一个快速、多功能的文件同步工具,能够在本地或通过远程Shell(如SSH)在两个位置之间高效同步文件和目录。其核心算法只传输文件的差异部分,大大减少了数据传输量,特别适合备份、镜像、大规模文件分发等场景。
rsync支持增量传输、断点续传、压缩传输、权限保留、排除模式等功能,是系统管理员进行数据备份和迁移的首选工具。与scp或cp相比,rsync在处理大量文件或大文件时效率更高,尤其适合重复同步的场景。掌握rsync是现代Linux运维的核心技能。
1. 基本语法
| 命令 | 说明 |
|---|
rsync [options] source dest | |
rsync [options] source user@host:dest | |
rsync [options] user@host:source dest | |
rsync [options] user@host:source user2@host2:dest | |
2. 本地同步示例
| 命令 | 说明 |
|---|
rsync -a src/ dest/ | |
rsync -a src dest/ | |
rsync -av src/ dest/ | |
rsync -a --delete src/ dest/ | |
rsync -av --dry-run src/ dest/ | |
rsync -a --delete --dry-run src/ dest/ | |
注意: 源路径末尾的/表示复制目录内容,不带/表示复制目录本身。
3. 远程SSH同步
| 命令 | 说明 |
|---|
rsync -a src/ user@host:/path/ | |
rsync -a user@host:/path/ dest/ | |
rsync -a -e "ssh -p 2222" src/ user@host:/path/ | |
rsync -a -P src/ user@host:/path/ | |
rsync -a --partial src/ user@host:/path/ | |
rsync -a -e "ssh -i ~/.ssh/key" src/ user@host:/path/ | |
4. 常用选项
| 选项 | 说明 |
|---|
-a | 归档模式(递归+保留权限、时间戳、符号链接、设备文件等) |
-v | |
-z | |
-P | 显示进度并保留部分传输的文件(等价于--partial --progress) |
--delete | |
--dry-run | |
-r | |
-u | |
--exclude | |
--include | |
--max-size | |
--min-size | |
5. 排除文件
| 命令 | 说明 |
|---|
rsync -a --exclude 'node_modules' src/ dest/ | |
rsync -a --exclude '*.log' src/ dest/ | |
rsync -a --exclude-from='exclude.txt' src/ dest/ | |
rsync -a --exclude '*.tmp' --exclude 'cache/' src/ dest/ | |
rsync -a --include='*.jpg' --exclude='*' src/ dest/ | |
rsync -a --exclude '/.git' src/ dest/ | |
exclude.txt 示例:
*.log
*.tmp
node_modules/
.git/
.cache/
6. 权限与所有权
| 选项 | 说明 |
|---|
-p | |
-o | |
-g | |
-t | |
-l | |
-D | |
-A | |
-X | |
--chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r | |
7. 带宽限制与性能
| 选项 | 说明 |
|---|
--bwlimit=5m | |
--bwlimit=500k | |
--partial | |
--append-verify | |
--checksum | 使用校验和判断文件变化(跳过基于时间和大小的判断) |
--whole-file | |
--compress | |
--compress-level=9 | |
8. 进度与输出
| 选项 | 说明 |
|---|
--progress | |
--info=progress2 | |
--stats | |
-v | |
-q | |
--log-file=log.txt | |
--out-format="%t %f %b" | |
9. 实用组合模式
| 命令 | 说明 |
|---|
rsync -av --delete --exclude='*.log' src/ dest/ | |
rsync -av --bwlimit=10m -e "ssh -p 2222" src/ user@host:/backup/ | |
rsync -av --partial --append-verify largefile.iso user@host:/path/ | |
rsync -av --dry-run --delete src/ dest/ | |
rsync -av --link-dest=../prev_backup src/ backup-$(date +%Y%m%d)/ | |
rsync -av -f"+ */" -f"- *" src/ dest/ | |
rsync -av --include='*.txt' --exclude='*' src/ dest/ | |
rsync -av --max-size=10m src/ dest/ | |
10. 增量备份模式
利用--link-dest实现节省空间的增量备份:
# 首次完整备份
rsync -av --delete /data/ /backup/20250421/
# 增量备份(硬链接未变化的文件)
rsync -av --delete --link-dest=/backup/20250421 /data/ /backup/20250422/
11. 故障排查
| 问题 | 解决方法 |
|---|
| rsync: connection unexpectedly closed | 检查SSH连接;验证远程路径权限;增加-vvv调试 |
| rsync: mkdir: Permission denied | |
| 权限保留失败 | 远程同步需root权限保留所有者:sudo rsync -a -o -g |
| 传输速度慢 | 使用-z压缩;增加--bwlimit;检查网络延迟 |
| 大量小文件传输慢 | |
| 符号链接同步问题 | |
| 删除操作意外执行 | |
| 文件未更新 | |
温馨提示: rsync是备份和同步的黄金工具。建议掌握以下最佳实践:1)始终先用--dry-run预览操作,尤其是使用--delete时;2)源路径末尾的/决定是否包含目录本身;3)批量同步大文件时使用-P显示进度和续传;4)远程同步时使用-z压缩节省带宽;5)创建增量备份时结合--link-dest节省空间;6)脚本中使用--log-file记录操作日志。在编写备份脚本时,建议将rsync输出重定向到日志文件,便于事后审计。对于关键的备份任务,可配合--checksum确保数据完整性,尽管这会增加传输时间。