快速上手Rsync

13 阅读6分钟

快速上手Rsync

在分布式系统与灾备场景中,文件同步是基石

传统的 cpscp 是“傻瓜式”的——它们不懂变通。面对海量小文件或弱网环境的大文件,它们总是进行全量复制。这不仅打满带宽,还浪费了宝贵的 IO

你需要的是 Rsync (Remote Sync) —— 系统管理员手中的“瑞士军刀”。它的杀手锏在于:只传改动过的部分

核心机制:为什么 Rsync 这么快?

Rsync 的高性能不是玄学,而是一套严密的数学逻辑。它不同于简单的对比 mtime(修改时间)或 size(大小),而是深入到了块(Block)级别

  1. FileList 交换:客户端首先向服务端发送文件列表(包含文件名、大小、mtime 等元数据)
  2. Generator 识别:接收端根据元数据快速筛选出“可能变化”的文件
  3. Rolling Checksum & MD5:对于变化的文件,Rsync 将其分块(Block),计算滚动校验和与 MD5 摘要。通过比对两端的校验值,精准定位到发生变动的“数据块”
  4. 增量传输:仅传输差异数据块,而非整个文件

默认情况下,如果源文件与目标文件的 sizemtime 一致,Rsync 会直接跳过校验。如果你怀疑文件被篡改但时间戳被伪造了,请加上 --checksum 参数,但这会消耗更多 CPU

命令行模式:严格的操作规范

虽然 Rsync 支持本地模式(功能类似 cp),但在生产环境中,我们更关注远程传输

斜杠的艺术

在使用 Rsync 时,最容易引发“事故”的细节在于源路径末尾的 /。这是一个必须形成肌肉记忆的规范:

  • src:同步目录本身 + 目录下的内容。会在目标目录下创建一个名为 src 的子目录
  • src/同步目录下的内容。不会创建 src 子目录

生产建议:为了保持语义清晰,如果你只想同步文件夹内部,请始终加上 /

常用参数的最佳实践

在脚本化任务中,建议使用以下标准参数组合:

rsync -avzP --delete --bwlimit=1000 /source/ user@host:/dest/
参数说明
-a归档模式,-rlptgoD的组合,涵盖各个方面
-r递归
-l复制软链接
-p权限不变
-m修改时间不变
-o所有者不变
-g用户组不变
-D --devices --specials 设备与特殊文件
-r递归同步子目录
-v显示过程
-z传输数据时进行压缩(公网)
-h人类可读的格式输出
--bwlimit=500kb,限速,注意不要与-z一起使用
--delete删除目标端多余文件(保持严格同步
--exclude='*.log'排除所有.log文件
--progress(-P显示传输进度
--password-file=xxx指定客户端免密登陆文件

守护进程模式:生产级部署方案

相比于 SSH 隧道模式,Rsync Daemon 模式(默认端口 873)更适合自动化、定时的集中式备份任务,因为它支持细粒度的配置文件控制和免密认证

架构流程图

sequenceDiagram
    participant Client as 客户端 (Source)
    participant Daemon as 服务端 (Rsync Daemon)
    participant Auth as 认证模块
    participant FS as 文件系统

    Note over Client, Daemon: 握手阶段
    Client->>Daemon: 发起连接 (User@Host::Module)
    Daemon->>Client: 挑战 (Challenge): 询问密码
    
    Note over Client: 读取 /etc/rsync.pass
    Client-->>Daemon: 发送密码 hash
    
    Note over Daemon: 比对 /etc/rsyncd.secrets
    Daemon->>Auth: 验证 User/Pass
    
    alt 验证通过
        Auth-->>Daemon: OK
        Note over Daemon: 权限降级 (Drop Root)
        Daemon->>FS: 切换 UID/GID (rsync:rsync)
        FS-->>Daemon: 读写数据
        Daemon-->>Client: 传输数据流
    else 验证失败
        Auth-->>Daemon: Fail
        Daemon-->>Client: Connection Refused
    end

服务端标准化配置

  • 安装rsync
# 下载客户端,红帽7包含守护进程
yum install -y rsync

# 红帽8+ 服务端直接安装如下命令(rsync+守护进程)
yum install rsync-daemon -y
# 检查软件包内容
rpm -ql rsync
rpm -ql rsync-daemon

# 配置文件(服务端配置文件、守护进程模式)
/etc/rsyncd.conf
/usr/bin/rsync
# systemctl对应配置文件
/usr/lib/systemd/system/rsyncd.service

以下配置体现了权限分离(Privilege Separation)和安全基线要求:(/etc/rsyncd.conf

# --- 全局配置 (Global Settings) ---
# 虚拟用户,降低安全风险,避免使用 root 运行
uid = rsync
gid = rsync

# 安全机制:chroot 监狱,锁定进程访问范围
use chroot = yes
# 允许非 root 用户保存文件原有属性 (如 owner/group)
fake super = yes

# 性能与连接控制
max connections = 2000
timeout = 600
lock file = /var/run/rsync.lock
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log

# 容错配置
# 同步时忽略非致命错误,避免传输中断
ignore errors
read only = false
# 关闭rsync服务端列表功能
list = false

# 网络访问控制 (ACL)
# 只允许哪些IP/网段访问白名单
hosts allow = 10.0.0.0/24
# 拒绝哪些IP/网段访问白名单
hosts deny = *

# --- 模块定义 (Module Definitions) ---
[backup]
	path = /data/backup
	comment = Standard Backup Directory
	# 认证配置
	auth users = rsync_bak_user
	secrets file = /etc/rsyncd.secrets

关键点解析

  • fake super = yes:这是非 root 运行 Rsync 但仍需保留文件原有属性(如root:root)的关键。它通过扩展属性(xattr)来记录原始权限,非常适合备份系统文件
  • secrets file:权限必须严格设置为 600,否则 Rsync 为了安全会拒绝启动

部署清单

在部署时,服务端请遵循以下标准化步骤:

  • 创建虚拟用户rsync
useradd -s /sbin/nologin -M rsync
  • 权限控制
# 创建密码文件
vim /etc/rsyncd.secrets
# 内容如下:rsync_bak_user:password123

# secrets file 必须设置权限为 600,否则rsync会拒绝启动
chmod 600 /etc/rsyncd.secrets 

# 确保/data/backup 目录属主为 rsync
chown -R rsync:rsync /data/backup
  • 服务管理
systemctl start rsyncd
systemctl enable rsyncd

客户端操作

客户端无需启动服务,仅需配置密码文件(注意:仅需密码,不需要用户名)以实现免密传输:

echo "password123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
rsync -avz --password-file=/etc/rsync.pass /local/data/ rsync_bak_user@10.0.0.20::backup

数据完整性与可靠性保障

Rsync 传输完毕不代表万事大吉。在核心数据迁移(如数据库冷备、金融数据)场景下,必须引入应用层校验

MD5 校验闭环

md5sum用于计算和校验文件报文摘要的工具程序(Linux自带),MD5算法常被用来验证网路文件传输的完整性

md5sum (选项) (参数)
选项说明
-b二进制模式读取文件
-t--text把输入的文件作为文本文件看待
-c从指定文件中读取MD5校验和,并进行校验
--status验证成功时不输出任何信息
-w当校验不正确时给出警告信息

在执行关键数据迁移后,建议增加校验步骤:

  • 源端生成指纹
md5sum file.tar.gz > file.md5
  • 同步数据文件与指纹文件

  • 目标端校验

md5sum -c file.md5

# 文件没有变化输出
forsort: OK
# 文件发生变化输出
forsort: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match

如果输出 OK,则证明传输链路可靠;若出现 FAILED,则必须告警介入

自动化与实时同步

对于定时备份,结合 crontab 即可满足大部分需求。若业务对 RPO(恢复点目标)要求极高,需要毫秒级同步,则应升级架构,引入 inotifysersync。这些工具能监听文件系统事件,一旦文件发生变动立即触发 Rsync 推送,从而解决单点存储的风险

结语:Rsync 不仅仅是一个命令,它是构建稳健运维体系的基础组件。从理解 / 的细微差别,到配置 Daemon 的权限隔离,再到引入 MD5 校验闭环,每一个细节都体现了对数据安全的敬畏。掌握 Rsync 的生产级用法,是每一位运维工程师的必修课