一、基础介绍
1. Rsync 概述
rsync 是开源轻量级增量数据同步工具 ,支持本地、远程、守护进程三种工作模式;只同步变化的数据 ,传输效率远高于 cp/scp,常用于服务器备份、集群文件同步。
- 全量同步:完整复制所有文件
- 增量同步:仅同步新增、修改、删除的文件
2. 三大工作模式
- 本地同步 :等价于
cp命令,本机目录 / 文件互相同步 - 远程同步 :等价于
scp命令,跨主机传输(基于 SSH 协议) - 守护进程模式(rsyncd) :服务端监听 873 端口,客户端主动拉取 / 推送数据,企业主流备份方案
3. 辅助查询命令
bash
运行
cat /etc/os-release # 查看系统发行版本(CentOS/RedHat等)
uname -r # 查看Linux内核版本
二、Rsync 常用参数 & 符号规则
1. 核心高频参数
表格
| 参数 | 作用 |
|---|---|
-a |
归档模式,等价 -rlptgoD,保留权限、属主、时间、软链接等属性 |
-v |
可视化输出,显示同步详情 |
-z |
传输时压缩数据,节省带宽 |
--delete |
删除目标端多余文件(以源目录为准,只增减文件,不修改文件内容) |
--exclude=文件/目录 |
同步时排除指定文件 / 目录 |
--bwlimit=数值 |
限制传输速度,单位 KB/s |
2. 目录尾部 / 关键区别(必考)
源目录/:只同步目录内所有内容,不同步目录本身源目录(无/):将整个目录 + 内部文件一起同步
示例:
data/同步内容;data同步整个 data 目录
三、模式一:本地数据同步(实操)
环境准备
bash
运行
# 创建测试目录与文件
mkdir data yunjisuan
touch data/file{1..5}.txt
ls data/
1. 基础本地同步
bash
运行
# 同步 data 目录内所有内容 到 yunjisuan
rsync -avz data/ yunjisuan/
2. 加上 --delete(以源为准,清理目标多余文件)
bash
运行
# 在目标目录创建多余文件
touch yunjisuan/del.txt
# 同步并删除目标端多余文件
rsync -avz --delete data/ yunjisuan/
效果 :yunjisuan/del.txt 会被自动删除,两端目录完全一致。
3. 排除指定文件同步
bash
运行
# 同步时排除 file3.txt
rsync -avz --exclude=file3.txt data/ yunjisuan/
4. 限制传输速度
bash
运行
# 限速 100KB/s 同步
rsync -avz --bwlimit=100 data/ yunjisuan/
四、模式二:远程 SSH 同步(等价 scp,无需配置服务)
环境说明
- 服务端 IP:
192.168.91.140 - 客户端:当前主机
- 前提:两台机器网络互通、SSH 互通、关闭防火墙 / 放行 22 端口
1. 推送数据(本地 → 远程服务器)
bash
运行
# 格式:rsync -avz 本地目录 远程用户@远程IP:远程目录
rsync -avz yunjisuan/ root@192.168.91.140:/root
执行后输入对方主机 root 密码,完成同步。
2. 拉取数据(远程服务器 → 本地)
bash
运行
# 格式:rsync -avz 远程用户@远程IP:远程目录 本地目录
rsync -avz root@192.168.91.140:/root/yunjisuan/ ./data/
3. 组合参数(删除多余文件 + 限速 + 排除文件)
bash
运行
rsync -avz --delete --exclude=file1.txt --bwlimit=200 yunjisuan/ root@192.168.91.140:/root
五、模式三:Rsync 守护进程模式(rsyncd,企业重点)
架构说明
- 服务端(监听 873 端口):配置 rsyncd、密码文件、共享目录
- 客户端:免密推送 / 拉取数据,无需登录 SSH
- 端口:默认
873/tcp
前置准备(服务端 & 客户端均执行)
bash
运行
# 安装rsync(系统一般默认自带)
yum install rsync -y
# 关闭防火墙/放行873端口(二选一)
systemctl stop firewalld
# 或永久放行873端口
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reload
🔹 第一步:服务端完整配置(IP:192.168.91.146)
1. 创建程序专用用户(不可登录系统)
bash
运行
# -M 不创建家目录 -s 指定禁止登录shell
useradd -M -s /sbin/nologin rsync
# 查看用户
id rsync
2. 创建共享目录,并修改属主属组
bash
运行
mkdir -p /backup
# 递归修改目录所有者为 rsync
chown -R rsync:rsync /backup/
ls -ld /backup/
3. 编写 Rsync 主配置文件 /etc/rsyncd.conf
bash
运行
vi /etc/rsyncd.conf
粘贴以下完整配置(带注释):
ini
# 全局配置段
fake super = yes # 允许非root用户操作备份目录文件
uid = rsync # 运行进程的用户
gid = rsync # 运行进程的组
use chroot = no # 不锁定根目录(内网环境关闭)
max connections = 200 # 最大客户端连接数
timeout = 300 # 连接超时时间,单位秒
pid file = /var/run/rsyncd.pid # 进程PID文件
lock file = /var/run/rsync.lock # 进程锁文件
log file = /var/log/rsyncd.log # 日志文件路径
# 模块配置段 [backup] 模块名,客户端调用必须一致
[backup]
path = /backup/ # 模块对应的真实共享目录
ignore errors # 传输过程忽略无关错误
read only = false # false=可读可写;true=只读
list = false # 禁止客户端查看模块列表(安全加固)
hosts allow = 192.168.91.0/24 # 允许192.168.91网段所有主机访问
hosts deny = 0.0.0.0/32 # 拒绝所有其他IP
auth users = rsync_backup # 虚拟认证用户(系统不存在该用户)
secrets file = /etc/rsync.password # 虚拟用户密码文件
4. 创建虚拟用户密码文件
bash
运行
vi /etc/rsync.password
# 格式:虚拟用户名:密码
rsync_backup:123456
5. 密码文件降权(权限必须 600,否则同步失败)
bash
运行
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password
6. 启动 Rsync 守护进程 & 开机自启
bash
运行
# 启动守护进程
rsync --daemon
# 设置开机自启(CentOS7+)
echo "rsync --daemon" >> /etc/rc.local
chmod +x /etc/rc.local
# 检查进程 & 监听端口(873)
ss -antup | grep rsync
ps aux | grep rsync
7. 查看日志(排错用)
bash
运行
tail -f /var/log/rsyncd.log
🔹 第二步:客户端配置(免密同步)
客户端无需启动 rsync 服务,只需要创建纯密码文件。
bash
运行
# 创建密码文件,只写密码,不要写用户名
echo "123456" > /etc/rsync.password
# 强制降权为600(必填项)
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password
🔹 第三步:客户端实操同步命令
1. 推送数据(客户端目录 → 服务端 backup 模块)
格式 : rsync -avz 本地目录 虚拟用户@服务端IP::模块名 --password-file=密码文件
bash
运行
# 把本地 yunjisuan/ 内容推送到服务端 /backup
rsync -avz yunjisuan/ rsync_backup@192.168.91.146::backup --password-file=/etc/rsync.password
2. 追加常用参数组合
bash
运行
# 推送 + 删除服务端多余文件 + 限速100KB/s + 排除file2.txt
rsync -avz --delete --bwlimit=100 --exclude=file2.txt yunjisuan/ rsync_backup@192.168.91.146::backup --password-file=/etc/rsync.password
3. 拉取数据(服务端模块 → 客户端本地)
bash
运行
rsync -avz rsync_backup@192.168.91.146::backup/ ./data/ --password-file=/etc/rsync.password
六、Inotify 文件实时监控(搭配 Rsync 实现实时同步)
1. Inotify 介绍
inotify 是 Linux 内核自带的文件 / 目录实时监控工具 ,可监控:文件创建、删除、修改、移动、权限变更等事件。 常和 rsync 结合:监控目录变化 → 触发 rsync 自动同步,实现准实时备份。
2. 安装工具
bash
运行
yum install inotify-tools -y
3. inotifywait 核心参数详解
表格
| 参数 | 作用 |
|---|---|
-m |
持续监控(默认监控一次就退出) |
-r |
递归监控子目录 |
-q |
静默模式,减少冗余输出 |
-e |
指定要监控的事件 |
--timefmt |
自定义时间输出格式 |
--format |
自定义监控日志输出格式 |
4. 监控事件(Events)
plaintext
create # 文件/目录被创建
delete # 文件/目录被删除
modify # 文件内容被修改
attrib # 文件权限/属性变更
move_to # 文件移入监控目录
move_from # 文件移出监控目录
close_write # 可写文件关闭(修改完成,最常用触发同步)
七、Inotify 基础实操案例
环境准备
bash
运行
mkdir data
touch data/test.txt
案例 1:基础持续监控(创建、删除、修改事件)
bash
运行
# 持续递归监控 data 目录,监控 创建/删除/修改 事件
inotifywait -mqr -e create,delete,modify data/
测试 :新开终端,在 data 里新建 / 删除 / 修改文件,查看监控输出。
案例 2:自定义时间 + 输出格式
bash
运行
inotifywait -mqr \
--timefmt "%Y-%m-%d %H:%M:%S" \
--format "%T 事件:%e 文件:%w%f" \
-e create,delete,modify,move data/
%T:调用时间格式%w:文件所在目录%f:文件名
案例 3:后台运行监控,日志写入文件
bash
运行
# 后台监控删除事件,日志存入 inotify.log
nohup inotifywait -mq -e delete --timefmt %Y-%m-%d --format '%T-%w%f' data/ &> inotify.log &
# 查看监控日志
tail -f inotify.log
八、企业组合方案:Inotify + Rsync 实时同步脚本(重点)
需求:监控客户端 yunjisuan 目录,一旦文件变化,自动调用 rsync 推送到服务端。
1. 编写实时同步脚本 inotify_rsync.sh
bash
运行
vi /root/inotify_rsync.sh
写入内容:
bash
运行
#!/bin/bash
# 定义监控目录
MON_DIR="/root/yunjisuan"
# 定义rsync同步命令
RSYNC_CMD="rsync -avz --delete $MON_DIR/ rsync_backup@192.168.91.146::backup --password-file=/etc/rsync.password"
# 持续监控目录变化,触发同步
inotifywait -mqr -e create,delete,modify,move,attrib $MON_DIR | while read line
do
# 每次事件触发,执行同步
$RSYNC_CMD
done
2. 授权 & 后台运行脚本
bash
运行
chmod +x /root/inotify_rsync.sh
# 后台执行
nohup /root/inotify_rsync.sh &
# 查看后台进程
ps aux | grep inotify_rsync
3. 功能测试
- 在客户端
yunjisuan目录 新建 / 修改 / 删除文件 - 查看服务端
/backup目录,文件自动同步 - 查看 rsync 日志排查问题:
tail -f /var/log/rsyncd.log
4. 脚本开机自启
bash
运行
echo "/root/inotify_rsync.sh &" >> /etc/rc.local
chmod +x /etc/rc.local
九、常见报错 & 排错总结
-
rsync 密码文件权限报错 现象:
password file must not be other-accessible解决:服务端 + 客户端密码文件必须chmod 600 -
连接不上 873 端口 解决:放行防火墙 873 端口、检查 rsync --daemon 是否启动
-
目录同步带 / 和不带 / 混淆 记忆:有斜杠同步内容,无斜杠同步整个目录
-
inotify 监控无输出 解决:检查目录路径、事件参数、是否加
-m持续监控
十、知识点总结
- Rsync 三种模式:本地同步、远程 SSH 同步、守护进程 873 端口同步
- 核心参数:
-avz --delete --exclude --bwlimit - 守护进程关键点:专用系统用户、虚拟用户、密码文件 600 权限、模块名一致
- Inotify 核心:
-mqr持续静默监控,搭配事件触发动作 - 企业经典组合:
Inotify(监控变化) + Rsync(增量同步)实现实时备份