Rsync:高效的文件同步工具完全指南

Rsync:高效的文件同步工具完全指南

Rsync 使用指南

1. 基础概念

rsync(remote synchronization)是一个高效的文件同步和传输工具,它的主要特点是:

  • 增量传输:只传输变化的部分
  • 支持压缩传输
  • 保持文件属性
  • 支持本地和远程同步

2. 基本用法

2.1 本地同步

# 基本语法
rsync [选项] 源目录/ 目标目录/

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

# 同步多个目录
rsync -av /source1/ /source2/ /destination/

# 排除某些文件
rsync -av --exclude '*.tmp' /source/ /destination/

2.2 常用选项

# 归档模式(保持所有属性)
rsync -a /source/ /destination/

# 显示详细信息
rsync -v /source/ /destination/

# 显示传输进度
rsync -P /source/ /destination/

# 压缩传输
rsync -z /source/ /destination/

3. 远程同步

3.1 SSH方式

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

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

# 使用自定义SSH端口
rsync -avz -e "ssh -p 2222" /local/directory/ user@remote:/remote/directory/

3.2 守护进程方式

# 连接到rsync服务器
rsync -avz /local/directory/ rsync://server/module/

# 列出可用模块
rsync rsync://server/

# 使用用户名密码
rsync -avz --password-file=/etc/rsync.pass /local/directory/ rsync://user@server/module/

4. 高级特性

4.1 增量备份

# 使用硬链接创建增量备份
rsync -av --link-dest=/backup/previous /source/ /backup/current/

# 创建时间戳目录
backup_dir="/backup/$(date +%Y%m%d)"
rsync -av --link-dest=/backup/latest /source/ "$backup_dir"
ln -snf "$backup_dir" /backup/latest

4.2 过滤规则

# 使用模式过滤
rsync -av --include='*.txt' --exclude='*' /source/ /destination/

# 使用过滤文件
cat > filter-list.txt << EOF
+ /important/
- /temp/
- *.tmp
EOF
rsync -av --filter="merge filter-list.txt" /source/ /destination/

5. 性能优化

5.1 传输优化

# 使用压缩传输(适用于慢速网络)
rsync -avz --compress-level=9 /source/ /destination/

# 限制带宽使用
rsync -av --bwlimit=1000 /source/ /destination/

# 并行传输(使用多个rsync进程)
for i in {1..4}; do
    rsync -av --include="part$i/*" --exclude="*" /source/ /destination/ &
done
wait

5.2 IO优化

# 使用较大的块大小
rsync -av --block-size=128K /source/ /destination/

# 修改IO优先级
ionice -c2 -n7 rsync -av /source/ /destination/

6. 安全配置

6.1 SSH密钥认证

# 生成SSH密钥
ssh-keygen -t ed25519 -C "rsync-key"

# 复制公钥到远程服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote

# 使用指定密钥
rsync -av -e "ssh -i ~/.ssh/id_ed25519" /source/ user@remote:/destination/

6.2 rsync守护进程配置

# /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes

[backup]
path = /backup
comment = Backup Directory
read only = no
auth users = backupuser
secrets file = /etc/rsyncd.secrets

7. 监控和日志

7.1 日志配置

# 启用详细日志
rsync -av --log-file=/var/log/rsync.log /source/ /destination/

# 使用syslog
rsync -av --log-file-format='%t %f %b' /source/ /destination/

7.2 监控脚本

#!/bin/bash
# rsync监控脚本

LOG_FILE="/var/log/rsync_monitor.log"
ALERT_EMAIL="admin@example.com"

monitor_rsync() {
    if ! pgrep -x "rsync" > /dev/null; then
        echo "$(date): Rsync process not found!" >> $LOG_FILE
        echo "Rsync process not running!" | mail -s "Rsync Alert" $ALERT_EMAIL
    fi
}

# 检查传输速度
check_speed() {
    speed=$(rsync -av --stats /source/ /destination/ | grep "bytes/sec" | awk '{print $NF}')
    if [[ $speed -lt 1000000 ]]; then
        echo "$(date): Low transfer speed: $speed bytes/sec" >> $LOG_FILE
    fi
}

8. 自动化任务

8.1 定时备份

# 创建每日备份脚本
cat > daily-backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/$DATE"
SOURCE_DIR="/data"
LOG_FILE="/var/log/backup-$DATE.log"

rsync -av --link-dest=/backup/latest "$SOURCE_DIR/" "$BACKUP_DIR/" >> "$LOG_FILE" 2>&1
ln -snf "$BACKUP_DIR" /backup/latest
EOF

# 添加到crontab
0 2 * * * /path/to/daily-backup.sh

8.2 同步脚本

#!/bin/bash
# 多目标同步脚本

SERVERS=(
    "server1:/backup"
    "server2:/backup"
    "server3:/backup"
)

for server in "${SERVERS[@]}"; do
    rsync -avz --delete /source/ "user@$server/" &
done
wait

9. 故障排除

9.1 常见问题

# 检查连接问题
rsync -av --stats --dry-run /source/ destination/

# 检查权限问题
rsync -av --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r /source/ /destination/

# 恢复中断的传输
rsync -av --partial --progress /source/ /destination/

9.2 调试方法

# 启用调试输出
rsync -avvv --stats /source/ /destination/

# 测试模式(不实际传输)
rsync -av --dry-run /source/ /destination/

# 检查文件列表
rsync -av --list-only /source/ /destination/

Linux下rsync同步的简单使用介绍

date: 2022-07-10T18:10:14+08:00
tags: ["linux","rsync","ssh"]

rsync简单使用

Rsync粗浅使用指南

假设有两台机器 ServerA(待备份目录的机器),Backup(往这台机器上备份)

1. 安装

两台机器都需要安装rsync

sudo apt-get install rsync

2. 同步目录

rsync -r source destination
rsync -a source destination

-r 必须;

-a 还可以同步元信息(比如修改时间、权限等)

目标目录destination如果不存在,rsync 会自动创建。执行上面的命令后,源目录source被完整地复制到了目标目录destination下面,即形成了destination/source的目录结构。

rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录;

如果要使得目标目录成为源目录的镜像副本,则必须使用--delete参数

rsync -av --delete source/ destination

上面命令中,--delete参数会使destinationsource保持一致。

3. 远程同步

和scp类似,可以同步远程的过来,也可以同步到远程去

rsync -av source/ username@Backup:destination
rsync -av username@Backup:/destination source

如果ssh端口号非22,需要特殊指定

-e 'ssh -p 2234'

此处应使用ssh-copy-id 把ServerA的sshkey上传到Backup服务器上,这样就可以免密进行ssh传输,方便定时任务、定时脚本