Rsync 详解:从入门到实战,掌握 Linux 数据同步与备份的核心工具
一、什么是 Rsync?
rsync
(remote sync)是 Linux/Unix 系统中用于高效同步文件和目录的命令行工具,它不仅可以用于本地复制,更擅长在不同主机之间进行安全、快速、增量的数据传输。
与传统的 scp
或 cp
命令相比,rsync
的最大优势在于:
增量传输:只传输发生变化的部分(新增、修改的文件),大幅提升效率
支持多种模式:本地、远程、守护进程(daemon)模式
断点续传 & 压缩传输:网络中断后可继续,节省带宽
权限保留:可保留文件的权限、时间戳、所有者等属性
一句话总结:
rsync
是 Linux 下实现数据备份、迁移、同步的“瑞士军刀”。
二、Rsync vs SCP:全量 vs 增量
对比项 | scp | rsync |
---|---|---|
传输方式 | 全量传输(每次都全部复制) | 增量传输(只传变化部分) |
效率 | 低(尤其大目录) | 高(首次全量,后续极快) |
是否压缩 | 否(除非手动加 -C ) | 支持 -z 压缩 |
是否保留属性 | 是 | 是(-a 参数) |
是否支持排除文件 | 否 | 支持 --exclude |
示例对比
# 使用 scp(全量)
scp -r /etc/ root@192.168.130.62:/tmp/# 使用 rsync(增量)du
rsync -avz /etc/ root@192.168.130.62:/tmp/
⚠️ 注意:
/etc
与/etc/
在rsync
中有区别:
/etc
→ 传输目录本身及其内容/etc/
→ 只传输目录下的内容(不包含etc
目录)
三、Rsync 的三种使用模式
模式 | 适用场景 | 是否推荐 |
---|---|---|
本地模式 | 本地文件复制(类似 cp ) | ❌ 了解即可 |
远程模式(SSH) | 临时推送/拉取数据,需密码或密钥认证 | ✅ 推荐 |
守护进程模式(daemon) | 生产环境定时备份、免密同步、自动化脚本场景 | ✅✅✅ 强烈推荐 |
四、远程模式:SSH 传输(临时使用)
适用于点对点临时数据传输,依赖 SSH 认证。
1. 推送(Push):从本地推送到远程
# 推送单个文件
rsync -avz /etc/hostname root@192.168.130.62:/tmp/# 推送整个目录(包含目录本身)
rsync -avz /etc root@192.168.130.62:/tmp/# 推送目录内容(不包含目录本身)
rsync -avz /etc/ root@192.168.130.62:/tmp/test
2. 拉取(Pull):从远程拉取到本地
# 从远程拉取文件
rsync -avz root@192.168.130.62:/etc/hosts /opt/# 拉取整个目录
rsync -avz root@192.168.130.62:/data/ /backup/
🔑 说明:
-a
:归档模式(等价于-rlptgoD
),保留权限、时间、软链接等-v
:显示详细过程-z
:压缩传输,适合公网环境-P
:显示进度条 + 断点续传(--partial --progress
)
五、守护进程模式(Daemon Mode)——生产环境首选
这是 rsync
最强大的用法,常用于定时备份、免密同步、自动化运维。
应用场景
- 定时备份数据库、配置文件
- 实时同步(配合
inotify
+sersync
/lsyncd
) - 异地容灾:将数据推送到异地服务器
- 解决存储单点问题
1. 服务端配置(以 backup
服务器为例)
(1)安装 rsync
yum install -y rsync
(2)创建虚拟用户(安全隔离)
useradd -s /sbin/nologin -M rsync
(3)创建认证密码文件
echo 'rsync_backup:123456' > /etc/rsync.password
chmod 600 /etc/rsync.password
🔐 注意:该文件存储的是 服务端认证用户和密码,格式为
用户名:密码
(4)创建共享目录
mkdir /server_data /backup
chown rsync.rsync /server_data /backup
(5)配置 /etc/rsyncd.conf
# /etc/rsyncd.conf
# created by Freed 2025-09-16
# rsyncd.conf startfake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
# hosts allow = 192.0.0.0/24 # 可选:允许的IP网段
# hosts deny = 0.0.0.0/32 # 可选:拒绝的IPauth users = rsync_backup
secrets file = /etc/rsync.password# 模块1:data
[data]
comment = Data backup module
path = server_data# 模块2:backup
[backup]
comment = Backup storage
path = /backup
(6)启动服务
systemctl enable rsyncd
systemctl start rsyncd
(7)检查服务状态
ps -ef | grep rsync
ss -lntup | grep :873
✅ 默认端口:
873
2. 客户端使用(推送/拉取)
(1)基本测试(手动输入密码)
rsync -avz /etc/hosts rsync_backup@192.168.130.62::data
💬 输入密码:
123456
(2)免密传输(生产环境必备)
创建客户端密码文件(只存密码):
echo "123456" > /etc/rsync.client
chmod 600 /etc/rsync.client
推送命令:
rsync -avz /etc/hostname rsync_backup@192.168.130.62::data --password-file=/etc/rsync.client
实现自动化脚本免交互!
3. 守护进程模式小结:部署流程
步骤 | 服务端操作 | 客户端操作 |
---|---|---|
1 | 安装 rsync | 安装 rsync |
2 | 创建虚拟用户 rsync | —— |
3 | 配置 /etc/rsyncd.conf | —— |
4 | 创建密码文件 /etc/rsync.password (权限 600) | 创建密码文件 /etc/rsync.client (权限 600) |
5 | 创建共享目录并授权 | —— |
6 | 启动并设置开机自启 | —— |
7 | 测试连接 | 使用 rsync 命令推送/拉取 |
六、常用 Rsync 参数详解
参数 | 说明 |
---|---|
-a | 归档模式,等价于 -rlptgoD (递归、保留权限、时间、所有者、组、设备) |
-v | 显示详细过程 |
-z | 压缩传输(适合公网) |
-P | 显示进度条 + 断点续传 |
--bwlimit=500 | 限速 500KB/s,避免占满带宽 |
--exclude=FILE | 排除指定文件/目录 |
--exclude-from=/path/to/file | 从文件中读取排除列表 |
--delete | 使目标目录与源目录完全一致(慎用!) |
实用示例
# 限速传输
rsync -avP --bwlimit=500k /tmp/data/ root@192.168.130.62:/backup/# 排除单个目录
rsync -av /data/ root@192.168.130.62:/backup/ --exclude=logs# 排除多个目录
rsync -av /data/ root@192.168.130.62:/backup/ --exclude={logs,cache,tmp}# 从文件读取排除规则
cat > /tmp/exclude.txt << EOF
*.log
*.tmp
/temp/
EOF
rsync -av /data/ root@192.168.130.62:/backup/ --exclude-from=/tmp/exclude.txt# 保持完全一致(源删目标也删)
rsync -avP --delete /source/ root@192.168.130.62:/target/
⚠️
--delete
非常危险!建议先用--dry-run
模拟测试。
七、常见故障与排查
故障现象 | 原因 | 解决方案 |
---|---|---|
password mismatch | 密码错误或密码文件格式不对 | 检查 /etc/rsync.password 格式和权限 |
auth failed on module ... no secrets file | 服务端未配置 secrets file | 确认配置文件路径正确,文件存在 |
@ERROR: module not found | 模块名错误 | 检查 [data] 等模块名是否拼写正确 |
permission denied | 目录权限不足或 SELinux/防火墙阻止 | chown rsync.rsync /data ,关闭 SELinux 或放行 873 端口 |
no matching rule | hosts allow 限制了 IP | 检查 hosts allow 配置,或注释掉测试 |
八、企业级应用场景总结
场景 | 方案 |
---|---|
定时备份 | crond + rsync 守护进程模式 |
实时同步 | inotify + rsync 或 lsyncd /sersync |
异地容灾 | 将数据推送到异地 rsync 服务端 |
配置文件统一管理 | 所有服务器从中心节点拉取配置 |
日志集中收集 | 各业务服务器定时推送日志到日志服务器 |
九、实战案例:Git 更新 + Rsync 同步(多服务器代码部署)
在实际运维场景中,我们经常需要将最新代码从 Git 仓库拉取后,统一部署到多个业务服务器(Server),同时保留各服务器的本地配置(如 config/
、log/
等)。
本案例结合 git pull
与 rsync
,实现一键更新 + 增量同步,大幅提升部署效率与一致性。
场景描述
- 所有服务目录以
Server*
命名(如Server01
,Server02
,Server03
) - 每个
Server*
目录是一个独立的服务实例,包含可执行程序、脚本、配置文件等 - 要求:
- 从 Git 仓库更新代码
- 将变更同步到所有其他
Server*
实例 - 保留每个实例的本地配置(
config/
)和日志(log/
) - 自动化、可脚本化
🔧 解决方案:git pull
+ rsync
联动
核心思路
- 选择一个主目录(如第一个
Server*
)作为“源” - 在该目录执行
git pull
拉取最新代码 - 使用
rsync
将更新后的文件增量同步到其他所有Server*
目录 - 排除不需要同步的敏感或本地化目录(
config/
,log/
,.git
)
实战脚本:run.sh
完整示例
#!/bin/bash# 获取所有 Server* 目录,并按名称排序
server_directories=($(find . -maxdepth 1 -type d -name "Server*" -not -path '*/\.*' -print0 | xargs -0 -n1 basename | sort))# 主函数:启动所有服务
start_all() {for dir in "${server_directories[@]}"; doecho "正在启动服务目录:$dir"(cd "$dir" && ./rungame.sh start)done
}# 停止所有服务
stop_all() {for dir in "${server_directories[@]}"; doecho "正在停止服务目录:$dir"(cd "$dir" && ./rungame.sh stop)done
}# 更新代码并同步到所有 Server 实例
update_and_sync() {if [ ${#server_directories[@]} -eq 0 ]; thenecho "未找到任何 Server* 目录。"exit 1fi# 以第一个 Server 目录作为“源”main_server=${server_directories[0]}echo "正在从 Git 更新代码,源目录:$main_server"# 拉取最新代码(cd "$main_server" && git pull) || { echo "Git 拉取失败,请检查网络或仓库状态"; exit 1; }echo "开始同步更新到其他 Server 目录..."# 遍历其余 Server 目录,使用 rsync 同步(排除 config, log, .git)for dir in "${server_directories[@]:1}"; doecho "正在同步到目录:$dir"rsync -a \--exclude='config/' \--exclude='log/' \--exclude='.git' \--delete \--itemize-changes \--out-format="%n" \"$main_server/" "$dir/"doneecho "代码更新与同步已完成!"
}# 显示帮助信息
show_help() {echo "用法: $0 [start|stop|up]"echo "start 启动所有 Server 服务"echo "stop 停止所有 Server 服务"echo "up 拉取最新代码并同步到所有 Server 实例"
}# 主命令分发
case "$1" instart)start_all;;stop)stop_all;;up)update_and_sync;;*)show_help;;
esac
脚本功能说明
命令 | 功能 |
---|---|
./run.sh start | 启动所有 Server* 服务 |
./run.sh stop | 停止所有 Server* 服务 |
./run.sh up | 从 Git 拉取最新代码 → 同步到所有 Server(核心功能) |
关键安全与同步策略
排除项 | 说明 |
---|---|
--exclude='config/' | 保留每个 Server 的本地配置(数据库地址、端口等) |
--exclude='log/' | 避免日志文件被覆盖或误删 |
--exclude='.git' | 防止 .git 元数据污染目标目录 |
--delete | 确保目标目录与源代码完全一致(删除已移除的旧文件) |
⚠️ 建议:首次使用前可添加
--dry-run
参数测试同步效果:rsync -a --exclude='config/' --delete --dry-run "$main_server/" "$dir/"
部署流程图
[Git Repo]↓ git pull
Main Server (Server01)↓ rsync (exclude: config, log, .git)
├── Server02
├── Server03
├── Server04
└── Server05
📈 企业级扩展建议
- 结合 CI/CD:将此脚本集成到 Jenkins/GitLab CI,实现自动化发布
- 版本标记:在
git pull
后记录 commit ID,便于回滚 - 灰度发布:先同步到测试 Server,验证后再推送到生产
- 备份机制:同步前自动备份关键目录(如
config/
)
总结
通过 git pull
+ rsync
的组合,我们实现了:
- 高效更新:只传输变化的代码文件
- 配置隔离:保留每个
Server
的本地配置 - 一键部署:简化多实例管理
- 可审计性:结合 Git 历史追踪变更
💡 适用场景:游戏服务器集群、微服务多实例、测试环境批量更新等。
十、总结
rsync
是 Linux 系统中不可或缺的数据同步工具。掌握其三种模式,尤其是守护进程模式,是每个运维工程师的基本功。
核心要点回顾:
- 增量传输是
rsync
的灵魂/etc
与/etc/
有区别- 守护进程模式 = 免密 + 自动化 + 高效
- 配置文件、虚拟用户、密码文件、权限缺一不可
--exclude
和--delete
是高级但危险的功能