rsync 命令详解

目录

rsync 传输备份工作原理详解

一、核心算法:差异传输
二、传输流程
三、关键技术
四、与cp/scp复制的本质区别

rsync的使用

基本语法

常用选项
常用组合案例

1. **本地目录同步**
2. **远程同步(SSH协议)**
3. **删除目标端多余文件**
4. **排除特定文件**
5. **限速传输(避免占用带宽)**
6. **仅同步修改时间不同的文件**

关键注意事项

rsync 同步方式

1. 完整备份 (Full Backup)
2. 差量备份 (Differential Backup)
3. 增量备份 (Incremental Backup)
常见问题

rsync实现远程增量备份的方案

rsync + inotify 实时同步案例

1. 安装 inotify-tools
2. 实时同步脚本 (rsync_inotify.sh)
3. 启动脚本(后台运行)
4. 系统服务配置(可选)

rsync 传输备份工作原理详解

rsync是一个快速和非常方便的文件复制工具。 它能本地复制,远程复制,或者远程守护进程方式复制 ,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制。

rsync监听端口:873
其核心工作原理可以分为以下几个关键方面:

一、核心算法:差异传输

分块校验机制

rsync 将文件分割成固定大小的块(默认约700字节)
对每个块计算两个校验值:

弱校验(rolling checksum):32位的快速校验
强校验(MD5):128位的精确校验

差异检测过程

发送方计算源文件的校验值
接收方计算目标文件的校验值
双方比较校验值,仅传输不匹配的块

二、传输流程

扫描:扫描需要传输的文件列表。
检查:对比源和目标文件的时间戳和大小。
分块:将文件分割成固定大小的数据块。
校验:通过滚动校验算法计算数据块的特征值。
传输:仅传输变化的数据块。
重组:在目标端重组完整文件。

三、关键技术

双通道设计

控制通道:传输命令和元数据
数据通道:实际文件数据传输

滚动校验算法

/* 简化版滚动校验计算 */
uint16_t weak_checksum(char *buf, int len) {
              
    uint16_t s1 = 0, s2 = 0;
    for (int i = 0; i < len; i++) {
              
        s1 += buf[i];
        s2 += s1;
    }
    return (s2 << 16) | s1;
}

这种算法可以高效计算滑动窗口的校验值

三次文件处理

文件列表生成
差异比较
文件更新

四、与cp/scp复制的本质区别

操作 cp/scp rsync
文件比较 校验和比较
传输单位 整个文件 文件块
网络使用 优化
CPU使用 较高
适合场景 简单复制 重复同步

rsync的使用

基本语法

rsync [选项] 源文件 目标文件

常用选项

选项 作用解释
-a (–archive) 归档模式,保留所有文件属性(权限、时间、所有者等),等同于 -rlptgoD
-v (–verbose) 显示详细传输过程
-z (–compress) 压缩传输,节省带宽(适合远程同步)
-h (–human-readable) 以易读格式(KB/MB/GB)显示文件大小
-n (–dry-run) 模拟运行,只显示会做什么但不实际执行
-e 指定远程 shell 命令 (如 -e "ssh -p 2222",默认为ssh)
-P 组合选项,等同于 --partial --progress(显示进度 + 支持断点续传)
--exclude 排除特定文件或目录
--include 包含特定文件或目录
--delete 删除目标目录中存在但源目录中不存在的文件(保持严格同步)
--checksum 基于校验和同步 通过计算文件的校验和(而非时间戳和大小)判断是否需要同步,确保数据一致性
--progress 显示传输进度 实时显示文件传输百分比和速度

常见问题解答
Q1: -a-r 有什么区别?

-r 仅递归同步,不保留文件属性。
-a = -r + 保留权限、时间戳、属主等(等同于 -rlptgoD)。

Q2: --delete 会误删数据吗?

会!确保目标目录路径正确,建议先使用 --dry-run 模拟运行:

rsync -avz --delete --dry-run /source/ user@remote:/target/

Q3: --checksum 会导致性能下降吗?

会。校验和计算增加 CPU 开销,但适合对一致性要求高的场景。
如果文件改动不频繁,可用默认的“修改时间+大小”判断(去掉 --checksum)。

Q4: 如何限速传输?

添加 --bwlimit=5000(单位:KB/s,示例中限速 5MB/s):

rsync -avz --bwlimit=5000 /source/ user@remote:/target/

常用组合案例

1. 本地目录同步
rsync -av /source/ /destination/

作用:将 /source/ 下的内容同步到 /destination/(保留所有属性)
注意:源路径末尾的 / 表示同步目录内容(不含目录本身),不加 / 会同步目录本身。

2. 远程同步(SSH协议)
rsync -avzP -e "ssh -p 22" /local/path/ user@remote:/remote/path/

-e "ssh -p 22":指定 SSH 端口(默认 22 可省略)
-z:压缩传输加速

3. 删除目标端多余文件
rsync -av --delete /source/ /destination/

危险操作:确保目标路径正确,否则可能误删数据!

4. 排除特定文件
rsync -av --exclude='*.tmp' --exclude='logs/' /source/ /destination/

--exclude:排除匹配的文件或目录(支持通配符)
*:匹配零个或多个字符,例如,*.txt 匹配所有以 .txt 结尾的文件。
?:匹配一个字符,例如,file?.txt 匹配 file1.txt、file2.txt 等。
[abc]:匹配方括号内的任意字符,例如,file[1-3].txt 匹配 file1.txt、file2.txt、file3.txt

5. 限速传输(避免占用带宽)
rsync -avz --bwlimit=1000 /source/ user@remote:/destination/

--bwlimit=1000:限制带宽为 1000 KB/s(单位:KB)

6. 仅同步修改时间不同的文件
rsync -avu /source/ /destination/

-u (–update):跳过目标端已存在且更新的文件。

关键注意事项

路径斜杠 / 的区别

rsync -av /source/ /dest/ → 同步 source/ 下的内容到 dest/ 中。
rsync -av /source /dest/ → 同步 source 目录本身到 dest/ 中。

--delete 风险

同步前先用 -n 模拟运行,确认无误后再执行真实操作。

远程同步需配置 SSH 免密登录

ssh-keygen -t rsa
ssh-copy-id user@remote

大文件或网络不稳定时

使用 -P 支持断点续传。
添加 --partial-dir=/tmp/rsync-partial 指定暂存目录。

rsync 同步方式

1. 完整备份 (Full Backup)

全量比较所有文件,复制所有差异文件

# 完全复制源目录到目标位置
rsync -av /source/ /backup/full_backup/

2. 差量备份 (Differential Backup)

将指定目录作为比较基准

目标目录中只保留差异文件

# 基于完整备份后,只备份变化的部分(相比完整备份)
rsync -av --compare-dest=/backup/full_backup/ /source/ /backup/diff_backup_$(date +%F)/

--compare-dest 用于在同步时参考另一个目录的内容,但不会在新备份中创建硬链接。
例如:rsync -av --compare-dest=/data/ /tmp/shyn/ root@192.168.159.133:/data/,源目录中有1、2、3,这三个文件,/data/为空,执行过前面的命令后三个文件同步至/data/,而后我更改了1文件的内容,然后再执行一次rsync命令,查看/data目录中就只有1文件还在/data目标目录中。

3. 增量备份 (Incremental Backup)

对于未修改文件

目标路径 (/backup/current/) 已存在该文件
直接跳过(既不新建硬链接,也不删除原文件)

对于修改/新增文件

正常复制到目标目录(覆盖原有文件)

# 只备份自上次备份以来变化的部分(不管是哪种类型的备份,有变化的数据就备份,且会清除存档属性)
rsync -av --link-dest=/backup/last_backup/ /source/ /backup/incr_backup_$(date +%F)/

--link-dest 用于创建增量备份时,通过硬链接复用未修改的文件,从而节省磁盘空间。指定的基准目录是指目标主机中的目录,例如: rsync -av --delete --link-dest=/data/ /tmp/yana/ root@192.168.159.133:/data/,是以159.133主机/data为参照,检测本机/tmp/yana的文件变化。

常见问题

–link-dest不能跨文件系统

# 尝试跨分区使用会失败(无提示)
rsync -a --link-dest=/mnt/disk1/backup/ /source/ /mnt/disk2/new_backup/

基准目录必须存在

如果/基准目录/不存在,--link-dest会被静默忽略
不会报错,但会退化为全量复制

时间戳敏感性

默认依赖修改时间判断文件是否变化
可通过-c改用校验和比对(更可靠但更耗资源)

rsync实现远程增量备份的方案

首次完整备份:

rsync -avz /local/source/ user@remote:/backups/full_20230601/

后续增量备份:

rsync -avz --link-dest=/backups/full_20230601/ 
/local/source/ user@remote:/backups/incr_20230602/

rsync + inotify 实时同步案例

1. 安装 inotify-tools

# CentOS/RHEL
yum install inotify-tools -y

# Debian/Ubuntu
apt-get install inotify-tools -y

2. 实时同步脚本 (rsync_inotify.sh)

#!/bin/bash

# 配置参数
SRC_DIR="/data/www/"
DEST_HOST="backup-server"
DEST_DIR="/backup/www/"
LOG_FILE="/var/log/rsync_inotify.log"

# 监控并同步
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' 
-e modify,delete,create,attrib,move ${SRC_DIR} | while read file
do
    # 记录事件
    echo "${file} was changed" >> ${LOG_FILE}
    
    # 执行同步
    rsync -avz --delete ${SRC_DIR} ${DEST_HOST}:${DEST_DIR} >> ${LOG_FILE} 2>&1
    
    # 可选:触发后续操作
    # /path/to/other_script.sh
done

3. 启动脚本(后台运行)

chmod +x rsync_inotify.sh
nohup ./rsync_inotify.sh > /dev/null 2>&1 &

4. 系统服务配置(可选)

创建 /etc/systemd/system/rsync-inotify.service

[Unit]
Description=Rsync with Inotify real-time sync
After=network.target

[Service]
Type=simple
ExecStart=/path/to/rsync_inotify.sh
Restart=always

[Install]
WantedBy=multi-user.target

然后启用服务:

systemctl daemon-reload
systemctl enable rsync-inotify
systemctl start rsync-inotify
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容