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 才能正常工作!


🎯 基本语法与参数

📝 基本语法格式

1
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/

📋 最佳实践清单

  1. ✅ 总是先试运行rsync -n 避免意外操作
  2. ✅ 使用归档模式-a 保留所有文件属性
  3. ✅ 启用压缩传输-z 节省带宽(适合文本)
  4. ✅ 记录操作日志--log-file 便于审计和排查
  5. ✅ 定期验证备份--checksum 检查数据完整性
  6. ✅ 使用SSH密钥:避免密码暴露,提高安全性
  7. ✅ 设置带宽限制--bwlimit 避免影响生产服务
  8. ✅ 实施监控告警:监控同步任务状态和性能

💡 专业提示:在使用任何破坏性操作(如 --delete)前,总是先使用 -n 参数进行试运行,确认无误后再执行实际操作!定期验证备份的完整性和可恢复性。