Linux 文件同步 rsync 命令详解 🔄
🚀 掌握高效可靠的文件同步工具,轻松实现本地与远程数据备份和同步
📋 目录导航
✨ rsync 简介
rsync
(remote sync) 是 Linux 系统中功能强大的文件同步工具,以其智能增量传输算法著称,能够高效地在本地或远程系统间同步文件和目录。
🎯 设计理念:只传输变化的部分,最大化节省带宽和时间!
🌟 主要优势:
- ✅ 高效增量传输,节省带宽和时间
- ✅ 支持本地和远程文件同步
- ✅ 保持文件属性(权限、时间戳等)
- ✅ 支持压缩传输和加密连接
- ✅ 灵活的过滤和排除规则
⚡ 核心特性
特性 |
图标 |
说明 |
增量同步 |
🔄 |
只传输有变动的文件部分 |
带宽优化 |
📉 |
支持压缩传输,节省带宽 |
跨平台 |
🌐 |
支持本地和远程同步 |
属性保持 |
📋 |
保留文件权限、时间戳等属性 |
安全传输 |
🔒 |
通过 SSH 加密传输 |
断点续传 |
⏯️ |
支持中断后继续传输 |
灵活排除 |
🚫 |
支持模式排除特定文件 |
🔧 安装与验证
🐧 各发行版安装方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# Debian/Ubuntu
sudo apt-get install -y rsync
# Red Hat/CentOS
sudo yum install rsync
# Arch Linux
sudo pacman -S rsync
# Fedora
sudo dnf install rsync
# openSUSE
sudo zypper install rsync
# Alpine Linux
sudo apk add rsync
|
✅ 验证安装
1
2
3
4
5
6
|
# 检查版本
rsync --version
# 查看帮助
rsync --help
man rsync # 查看详细手册
|
📝 注意:同步的双方都必须安装 rsync 才能正常工作!
🎯 基本语法与参数
📝 基本语法格式
📊 常用参数详解
参数 |
图标 |
说明 |
示例 |
-a, --archive |
🗃️ |
归档模式(保留所有属性) |
rsync -a source/ dest/ |
-v, --verbose |
📢 |
显示详细传输信息 |
rsync -av source/ dest/ |
-z, --compress |
📦 |
压缩传输数据 |
rsync -az source/ dest/ |
-r, --recursive |
📁 |
递归同步目录 |
rsync -r source/ dest/ |
-u, --update |
🔄 |
仅同步更新的文件 |
rsync -au source/ dest/ |
--delete |
🗑️ |
删除目标端多余文件 |
rsync -a --delete source/ dest/ |
--progress |
📊 |
显示传输进度 |
rsync -a --progress source/ dest/ |
-n, --dry-run |
🔍 |
试运行(不实际传输) |
rsync -an source/ dest/ |
-P |
⏯️ |
断点续传+显示进度 |
rsync -aP source/ dest/ |
-h, --human-readable |
👀 |
人类可读格式显示大小 |
rsync -ah source/ dest/ |
--stats |
📈 |
显示传输统计信息 |
rsync -a --stats source/ dest/ |
💾 本地同步场景
📂 目录同步技巧
1
2
3
4
5
6
7
8
|
# 同步目录内容(不包含目录本身)
rsync -av /path/to/source/ /path/to/destination/
# 同步目录本身
rsync -av /path/to/source /path/to/destination
# 试运行,查看将会同步的内容
rsync -avn source/ destination/
|
💡 重要区别:源目录后的斜杠/
决定是同步目录内容还是目录本身!
🚫 排除特定文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 排除单个文件类型
rsync -av --exclude='*.tmp' source/ destination/
# 排除多个模式
rsync -av --exclude={'*.tmp','.git'} source/ destination/
# 使用排除文件
rsync -av --exclude-from='exclude-list.txt' source/ destination/
# 排除隐藏文件
rsync -av --exclude='.*' source/ destination/
# 包含特定文件(即使被排除)
rsync -av --exclude='*' --include='*.txt' source/ destination/
|
📋 同步示例
1
2
3
4
5
6
7
8
9
10
11
|
# 备份家目录到外部硬盘
rsync -avhz --progress /home/user/ /mnt/backup/home/
# 同步网站文件,保持完全一致
rsync -av --delete /var/www/ /backup/www/
# 同步图片文件,排除缓存文件
rsync -av --exclude='Thumbs.db' --exclude='.DS_Store' Photos/ Backup/Photos/
# 同步时保持硬链接(节省空间)
rsync -av --delete --link-dest=/previous/backup /source/ /new/backup/
|
🌐 远程同步技巧
🔗 SSH 远程同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 推送到远程服务器
rsync -avz /local/path/ user@remote_host:/remote/path/
# 从远程服务器拉取
rsync -avz user@remote_host:/remote/path/ /local/path/
# 使用特定SSH端口
rsync -avz -e 'ssh -p 2222' /local/path/ user@remote_host:/remote/path/
# 使用SSH密钥认证
rsync -avz -e 'ssh -i ~/.ssh/id_rsa' /local/path/ user@remote_host:/remote/path/
# 使用SSH配置文件中定义的主机
rsync -avz /local/path/ remote-host:/remote/path/
|
🌍 远程服务器示例
1
2
3
4
5
6
7
8
9
10
11
|
# 备份到远程服务器
rsync -avz --progress /important/data/ user@backup-server:/backups/data/
# 从生产服务器同步网站文件
rsync -avz --delete root@web-server:/var/www/ /local/backup/www/
# 同步日志文件到分析服务器
rsync -avz /var/log/ user@log-server:/central-logs/$(hostname)/
# 使用rsync守护进程模式(需要配置rsyncd.conf)
rsync -av source/ remote-host::module/destination/
|
🚀 高级使用技巧
⏰ 定时同步任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 使用cron实现定时同步
# 编辑crontab
crontab -e
# 每天凌晨2点同步
0 2 * * * /usr/bin/rsync -av /source/ /destination/ >> /var/log/rsync.log 2>&1
# 每小时同步一次
0 * * * * /usr/bin/rsync -av /source/ /destination/
# 每周日晚上同步
0 0 * * 0 /usr/bin/rsync -av /source/ /destination/
# 每5分钟同步(高频率)
*/5 * * * * /usr/bin/rsync -av /source/ /destination/
|
📝 同步脚本示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#!/bin/bash
# backup-script.sh
LOG_FILE="/var/log/rsync-backup.log"
SOURCE_DIR="/important/data/"
DEST_DIR="/backup/data/"
MAX_RETRIES=3
RETRY_DELAY=60
echo "==========================================" >> $LOG_FILE
echo "$(date): Starting backup from $SOURCE_DIR to $DEST_DIR" >> $LOG_FILE
for ((i=1; i<=$MAX_RETRIES; i++)); do
echo "$(date): Attempt $i of $MAX_RETRIES" >> $LOG_FILE
rsync -av --delete --stats $SOURCE_DIR $DEST_DIR >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "$(date): Backup completed successfully" >> $LOG_FILE
# 发送成功通知
echo "Backup completed successfully at $(date)" | mail -s "Backup Success" admin@example.com
exit 0
else
echo "$(date): Backup attempt $i failed, retrying in $RETRY_DELAY seconds..." >> $LOG_FILE
sleep $RETRY_DELAY
fi
done
echo "$(date): All backup attempts failed" >> $LOG_FILE
# 发送失败通知
echo "Backup failed after $MAX_RETRIES attempts at $(date)" | mail -s "Backup Failure" admin@example.com
exit 1
|
🔄 双向同步方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 虽然rsync不是专门的双向同步工具,但可以这样实现:
#!/bin/bash
# 双向同步脚本
LOG_FILE="/var/log/two-way-sync.log"
DIR_A="/path/to/dirA/"
DIR_B="/path/to/dirB/"
echo "$(date): Starting two-way synchronization" >> $LOG_FILE
# 先同步A到B
echo "Syncing A -> B" >> $LOG_FILE
rsync -av --delete $DIR_A $DIR_B >> $LOG_FILE 2>&1
# 再同步B到A
echo "Syncing B -> A" >> $LOG_FILE
rsync -av --delete $DIR_B $DIR_A >> $LOG_FILE 2>&1
echo "$(date): Two-way synchronization completed" >> $LOG_FILE
|
⚙️ 性能优化
🚀 加速传输技巧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 使用压缩(适合文本文件)
rsync -avz source/ destination/
# 禁用压缩(适合已压缩文件)
rsync -av --no-compress source/ destination/
# 限制带宽使用(避免影响其他服务)
rsync -av --bwlimit=1000 source/ destination/ # 限制为1000KB/s
# 并行传输(使用多个rsync实例)
rsync -av /source/dir1/ /dest/dir1/ &
rsync -av /source/dir2/ /dest/dir2/ &
wait
# 使用更快的加密算法
rsync -avz -e 'ssh -c aes128-gcm@openssh.com' source/ user@host:destination/
# 调整块大小(对大文件优化)
rsync -av --block-size=8192 source/ destination/
|
📊 传输监控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 显示详细传输信息
rsync -av --progress source/ destination/
# 显示统计信息
rsync -av --stats source/ destination/
# 生成传输报告
rsync -av --itemize-changes source/ destination/
# 实时监控传输速度
rsync -av --progress --stats source/ destination/ | grep -E 'speedup|sent|received'
# 记录传输日志
rsync -av --log-file=/var/log/rsync.log source/ destination/
|
⚠️ 注意事项
🔴 危险操作警告
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# --delete 参数会删除目标端文件!务必先试运行
rsync -avn --delete source/ destination/ # 先检查
rsync -av --delete source/ destination/ # 再执行
# 根目录同步要特别小心!
rsync -av / /backup/ # 可能会包含特殊文件系统
# 远程同步时注意路径格式
rsync -av /local/path user@remote:/path/ # 正确
rsync -av /local/path/ user@remote:/path/ # 正确
rsync -av /local/path user@remote:/path # 可能出错
# 注意权限问题
sudo rsync -av source/ destination/ # 需要时使用sudo
|
🛡️ 安全建议
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 使用SSH加密传输
rsync -avz -e ssh source/ user@host:destination/
# 避免在命令行中暴露密码
# 使用SSH密钥认证而不是密码
# 限制rsync守护进程的访问权限
# 使用chroot限制访问范围
# 使用只读模式进行备份
rsync -av --read-only source/ destination/
# 定期检查同步完整性
rsync -av --checksum source/ destination/
|
🔍 故障排查
🐛 常见问题解决
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 权限被拒绝
sudo rsync -av source/ destination/ # 使用sudo
# 连接超时
rsync -av --timeout=30 source/ user@host:destination/
# 检查为什么某些文件被跳过
rsync -av --itemize-changes source/ destination/
# 调试模式
rsync -avvv source/ destination/ # 多个v增加详细程度
# 网络问题诊断
rsync -av --progress --stats source/ user@host:destination/ 2>&1 | tee /tmp/rsync-debug.log
# 检查SSH连接
ssh -v user@host # 先测试SSH连接
|
📋 错误处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 忽略错误继续同步
rsync -av --ignore-errors source/ destination/
# 最大重试次数
rsync -av --max-retries=3 source/ destination/
# 跳过某些错误类型
rsync -av --exclude='*.lock' source/ destination/
# 跳过已在使用中的文件
rsync -av --ignore-existing source/ destination/
# 强制覆盖特定文件
rsync -av --force source/ destination/
|
📊 总结对比
🆚 rsync vs 其他工具
特性 |
🔄 rsync |
📋 cp |
🗂️ scp |
📦 tar |
增量同步 |
✅ |
❌ |
❌ |
❌ |
带宽优化 |
✅ |
❌ |
❌ |
⚠️ |
属性保持 |
✅ |
⚠️ |
✅ |
✅ |
远程支持 |
✅ |
❌ |
✅ |
❌ |
删除同步 |
✅ |
❌ |
❌ |
❌ |
试运行 |
✅ |
❌ |
❌ |
❌ |
压缩传输 |
✅ |
❌ |
❌ |
✅ |
🎯 使用场景推荐
- 🔄 日常备份:
rsync -av --delete source/ backup/
- 🌐 远程同步:
rsync -avz -e ssh local/ user@host:remote/
- 📁 网站部署:
rsync -av --exclude='config.php' dev/ prod/
- 💾 数据迁移:
rsync -av --progress old-disk/ new-disk/
- ⏰ 定时任务:cron + rsync 自动备份
- 📊 增量备份:
rsync -av --link-dest=/yesterday/ /source/ /today/
📋 最佳实践清单
- ✅ 总是先试运行:
rsync -n
避免意外操作
- ✅ 使用归档模式:
-a
保留所有文件属性
- ✅ 启用压缩传输:
-z
节省带宽(适合文本)
- ✅ 记录操作日志:
--log-file
便于审计和排查
- ✅ 定期验证备份:
--checksum
检查数据完整性
- ✅ 使用SSH密钥:避免密码暴露,提高安全性
- ✅ 设置带宽限制:
--bwlimit
避免影响生产服务
- ✅ 实施监控告警:监控同步任务状态和性能
💡 专业提示:在使用任何破坏性操作(如 --delete
)前,总是先使用 -n
参数进行试运行,确认无误后再执行实际操作!定期验证备份的完整性和可恢复性。