rsync

title

rsync是一个强大的文件同步和备份工具,支持本地和远程文件同步,具有增量传输和断点续传功能。

基本语法

rsync [选项] 源路径 目标路径
rsync [选项] 源路径 用户@主机:目标路径
rsync [选项] 用户@主机:源路径 目标路径

常用选项

基本选项

  • -a : 归档模式,等价于-rlptgoD
  • -r : 递归复制目录
  • -l : 复制符号链接
  • -p : 保留权限
  • -t : 保留时间戳
  • -g : 保留组
  • -o : 保留所有者
  • -D : 保留设备文件

传输选项

  • -v : 显示详细信息
  • -z : 压缩传输
  • -P : 显示进度,等价于--partial --progress
  • --progress : 显示传输进度
  • --partial : 支持断点续传

控制选项

  • -n--dry-run : 模拟运行,不实际执行
  • --delete : 删除目标目录中源目录没有的文件
  • --exclude=PATTERN : 排除匹配模式的文件
  • --include=PATTERN : 包含匹配模式的文件

基本用法

本地同步

# 同步目录
rsync -av /source/directory/ /destination/directory/

# 同步文件
rsync -av file1.txt file2.txt /destination/

# 显示进度
rsync -avP /source/ /destination/

# 模拟运行
rsync -avn /source/ /destination/

远程同步

# 推送到远程服务器
rsync -avz /local/data/ user@remote:/remote/data/

# 从远程服务器拉取
rsync -avz user@remote:/remote/data/ /local/data/

# 指定SSH端口
rsync -avz -e "ssh -p 2222" /local/data/ user@remote:/remote/data/

# 使用SSH密钥
rsync -avz -e "ssh -i ~/.ssh/id_rsa" /local/data/ user@remote:/remote/data/

高级功能

增量备份

# 基础备份
rsync -av /source/ /backup/full/

# 增量备份(硬链接)
rsync -av --link-dest=/backup/full/ /source/ /backup/incremental/

# 带时间戳的备份
DATE=$(date +%Y%m%d_%H%M%S)
rsync -av /source/ /backup/backup_$DATE/

排除和包含

# 排除特定文件类型
rsync -av --exclude='*.log' --exclude='*.tmp' /source/ /destination/

# 使用排除文件
rsync -av --exclude-from=exclude_list.txt /source/ /destination/

# 复杂的包含/排除规则
rsync -av \
  --include='*.txt' \
  --include='*/' \
  --exclude='*' \
  /source/ /destination/

删除策略

# 镜像同步(删除目标中多余的文件)
rsync -av --delete /source/ /destination/

# 删除前备份
rsync -av --delete --backup --backup-dir=/backup/deleted/ /source/ /destination/

# 在传输后删除
rsync -av --delete-after /source/ /destination/

实用脚本示例

自动备份脚本

#!/bin/bash

# 配置变量
SOURCE="/home/user/documents"
DESTINATION="/backup/documents"
LOG_FILE="/var/log/backup.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

# 执行备份
echo "[$DATE] 开始备份..." >> $LOG_FILE

rsync -av \
  --delete \
  --exclude='.cache/' \
  --exclude='*.tmp' \
  --log-file=$LOG_FILE \
  $SOURCE/ $DESTINATION/

if [ $? -eq 0 ]; then
    echo "[$DATE] 备份完成" >> $LOG_FILE
else
    echo "[$DATE] 备份失败" >> $LOG_FILE
fi

网站同步脚本

#!/bin/bash

# 同步网站文件到多台服务器
SERVERS=("web1.example.com" "web2.example.com" "web3.example.com")
LOCAL_PATH="/var/www/html/"
REMOTE_PATH="/var/www/html/"

for server in "${SERVERS[@]}"; do
    echo "同步到 $server..."
    rsync -avz \
      --delete \
      --exclude='.git/' \
      --exclude='logs/' \
      $LOCAL_PATH root@$server:$REMOTE_PATH
done

性能优化

带宽限制

# 限制带宽为1000KB/s
rsync -av --bwlimit=1000 /source/ user@remote:/destination/

压缩等级

# 设置压缩等级(1-9)
rsync -av --compress-level=6 /source/ user@remote:/destination/

并发传输

# 使用多个SSH连接
rsync -av -e "ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p" \
  /source/ user@remote:/destination/

监控和日志

详细日志

# 生成详细日志
rsync -av --log-file=/var/log/rsync.log --log-file-format="%t %f %b" \
  /source/ /destination/

统计信息

# 显示传输统计
rsync -av --stats /source/ /destination/

# 只显示变化的文件
rsync -av --itemize-changes /source/ /destination/

常见问题和解决

权限问题

# 保持原有权限但忽略所有者
rsync -rlptgD --no-owner --no-group /source/ /destination/

# 使用超级用户权限
sudo rsync -av /source/ /destination/

网络问题

# 设置超时
rsync -av --timeout=30 /source/ user@remote:/destination/

# 重试机制
for i in {1..3}; do
    rsync -av /source/ user@remote:/destination/ && break
    sleep 5
done

相关工具

  • tar - 归档工具
  • scp - 安全复制
  • cp - 本地复制
  • rclone - 云存储同步
  • unison - 双向同步工具

rsync是Linux系统中最重要的文件同步和备份工具,掌握其用法对系统管理员来说非常重要。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""