rsync备份(实操篇)
相关参考内容
- rsync备份(理论篇)
- Linux SCP传输文件免密配置
- 说明文档结合AI生成
安装
rsync 并不是所有 Linux 发行版默认自带的程序,但大多数主流发行版会预装它,或者可以通过官方软件仓库轻松安装
- 检查是否已安装
运行以下命令:
rsync --version
- 或检查安装路径:
which rsync
如果提示 command not found,则说明未安装。
- Debian/Ubuntu安装:
sudo apt update && sudo apt install rsync -y
- RHEL/CentOS安装:
sudo yum install rsync -y # CentOS 7 或更早
sudo dnf install rsync -y # CentOS 8+/RHEL 8+
本地工作模式
rsync
本地模式 vs cp
区别对比
特性 | rsync | cp |
---|---|---|
增量同步 | ✅ 仅传输变化的部分,节省时间和带宽 | ❌ 总是完整复制文件 |
校验机制 | ✅ 通过校验和确保数据一致性 | ❌ 仅依赖时间戳或大小 |
保留属性 | ✅ 保留权限、时间戳、所有者等 | ❌ 需加 -p 等选项 |
删除目标多余文件 | ✅ 可用 --delete 清理目标 | ❌ 无法自动清理 |
试运行(dry-run) | ✅ 支持模拟操作,避免误操作 | ❌ 不支持 |
中断恢复 | ✅ 支持断点续传 | ❌ 需重新开始 |
本地模式实操示例
场景1:基本同步(类似 cp
)
# 同步本地目录(递归复制)
rsync -av /source/path/ /destination/path/
-a
:归档模式(保留权限、时间戳等,相当于 -rlptgoD
)。
-v
:显示详细过程。
注意:源路径末尾的 / 表示同步目录内容(不含目录本身),不加 / 会同步整个目录。
场景2:增量同步(仅传输变化部分)
rsync -av --progress /source/path/ /destination/path/
--progress
:显示传输进度。
场景3:删除目标多余文件(保持严格一致)
rsync -av --delete /source/path/ /destination/path/
--delete
:删除目标中存在但源中不存在的文件(谨慎使用!)。
场景4:试运行(dry-run)
rsync -avn --delete /source/path/ /destination/path/
-n
:模拟操作,不实际执行,用于检查哪些文件会被同步或删除。
场景5:校验文件一致性(确保数据正确)
rsync -avc /source/path/ /destination/path/
-c
:基于校验和(而非时间戳/大小)检查文件差异,更可靠但更慢。
场景6:排除文件(避免同步大量不必要的临时文件或临时日志信息)
- 排除单个目录
rsync -av --exclude='目录名' /源路径/ /目标路径/
- 示例:排除 tmp目录
rsync -av --exclude='tmp' /project/ /backup/
- 排除多个目录
用多个--exclude
或逗号分隔(需结合 --exclude-from):
rsync -av --exclude='dir1' --exclude='dir2' /源路径/ /目标路径/
- 或使用通配符排除某一类目录(如所有以 .cache 结尾的目录):
rsync -av --exclude='*.cache' /源路径/ /目标路径/
- 使用
--exclude-from
从文件读取排除规则 - 如果排除规则较多,可以将其写入文件(每行一个规则):
rsync -av --exclude-from='排除规则文件' /源路径/ /目标路径/
- 示例文件内容(exclude-list.txt):
tmp
d1
*.tmp
- 执行命令:
rsync -av --exclude-from='exclude-list.txt' /源路径/ /目标路径/
对比rsync -avc
和 rsync -av --delete
rsync -avc
和 rsync -av --delete
是两种常用的 rsync 操作模式,它们在功能和用途上有显著区别。
rsync -avc
:校验模式(Checksum)
-
功能
-c
(–checksum):基于文件内容的校验和(而非文件大小或修改时间)判断是否需要同步。即使文件大小和时间戳相同,只要内容变化就会触发同步。
确保数据一致性,但会消耗更多 CPU 和 I/O 资源(需计算校验和)。
-
典型用途
-
关键数据备份:确保目标文件与源文件内容完全一致(例如数据库备份)。
-
防篡改检查:检测文件内容是否被意外修改(如恶意软件感染)。
-
跨系统同步:不同文件系统可能导致时间戳不可靠时(如 NTFS → ext4)。
-
示例
rsync -avc /source/ /backup/
同步 /source/ 到 /backup/,强制校验文件内容差异。
-
rsync -av --delete
:删除模式
-
功能
-
--delete
:删除目标目录中存在但源目录中不存在的文件。 -
严格保持目标与源目录的完全一致(包括删除多余文件)。
-
高风险操作:误用可能导致数据丢失!
-
-
典型用途
-
镜像同步:让目标目录成为源的精确副本(例如网站部署、CDN 缓存更新)。
-
清理旧文件:定期同步时自动删除目标端已废弃的文件。
-
磁盘空间管理:避免冗余文件占用空间。
-
-
示例
rsync -av --delete /source/ /backup/
同步 /source/ 到 /backup/,并删除 /backup/ 中所有不在 /source/ 的文件。
核心区别总结
对比项 | rsync -avc | rsync -av --delete |
---|---|---|
核心功能 | 通过校验和确保内容一致 | 强制目标与源结构完全一致(删除多余文件) |
资源消耗 | 高(需计算校验和) | 低(仅对比文件名和属性) |
风险等级 | 低(只读操作) | 高(可能误删数据) |
组合使用场景
两者可结合使用,实现 高可靠性同步 + 严格一致性:
rsync -avc --delete /source/ /backup/
-
效果:
-
基于校验和同步内容变化的文件。
-
删除目标端的多余文件。
-
-
适用场景:
-
金融数据备份(内容必须一致且无冗余)。
-
生产环境代码部署(需完全匹配仓库状态)。
-
关键注意事项
- 路径斜杠 / 的含义:
rsync /source/path/ /dest/
→ 同步源目录下的所有文件到 /dest/。
rsync /source/path /dest/
→ 同步整个源目录到 /dest/path/。
- 保留符号链接:
默认情况下,rsync -a
会保留符号链接。若需跟随链接(复制实际文件),改用-L
选项:
rsync -avL /source/ /destination/
为什么选择 rsync
而非 cp
?
-
大数据/频繁更新:
rsync
的增量同步显著减少传输量。 -
关键备份:校验和(
-c
)和试运行(-n
)降低风险。 -
网络同步扩展性:同一命令格式可直接用于远程同步(如
rsync -av user@remote:/path/ /local/
)。
远程 Shell 模式(Remote Shell Mode)
rsync
Shell模式 vs scp
区别对比
特性 | Rsync | SCP |
---|---|---|
传输方式 | 增量传输,只传输变化的部分 | 全量传输,每次传输整个文件 |
速度 | 通常更快(尤其对于大文件或多次传输) | 较慢 |
功能 | 支持排除、包含、压缩、权限保持等 | 功能较为简单 |
带宽使用 | 更高效,可限速 | 无带宽控制选项 |
恢复传输 | 支持断点续传 | 不支持 |
目录处理 | 自动递归目录 | 需要-r选项才能递归目录 |
链接处理 | 可配置如何处理符号链接 | 默认跟随符号链接 |
校验 | 传输后进行校验 | 无校验机制 |
使用场景 | 适合备份、同步、大文件传输 | 适合简单的一次性文件传输 |
何时使用哪个工具
-
使用
SCP
:当需要简单快速地传输少量文件,且不需要增量同步时 -
使用
Rsync
:当需要同步大量文件、需要增量备份、需要保留权限或需要排除某些文件时
Shell模式实操示例
使用shell模式,一般会配置秘钥免密码登录方式,可以参考Linux SCP传输文件免密配置
# 本地 → 远程(推文件)
rsync -avz -e ssh /local/path/ user@remote:/remote/path/
# 远程 → 本地(拉文件)
rsync -avz -e ssh user@remote:/remote/path/ /local/path/
# 指定SSH端口(如2222)
rsync -avz -e "ssh -p 2222" /local/ user@remote:/remote/
场景 1: 基本增量同步(保留权限、时间戳)
rsync -avz /source/ user@remote:/destination/
场景 2:限速增量备份(排除临时文件)
rsync -avz --bwlimit=500 --exclude='*.log' /data/ backup@server:/backups/
场景 3:本地打包后同步(避免小文件延迟)
tar czf - /data/ | rsync -avz --bwlimit=1000 - user@remote:/backups/data.tar.gz
注意事项
- 确保远程服务器安装了
rsync
如前所述,远程服务器需要安装 rsync,否则无法处理同步请求。可以通过 SSH 连接到远程服务器并执行以下命令来检查:
rsync --version
如果没有安装,可以通过相应的包管理器安装它。
- 确保权限正确
确保你有足够的权限来访问和写入远程服务器上的目标目录。如果目标目录没有写权限,rsync
将无法完成同步操作。
你可以使用 sudo 来以管理员身份执行命令,或者确保目标文件夹的权限设置正确。
- 防火墙和端口
确保远程服务器的防火墙允许通过 SSH 协议(默认端口22
)进行连接。如果防火墙阻止了端口22
的访问,你需要在防火墙中允许该端口。
守护进程模式(Daemon Mode)
配置参数说明
Linux下可以用man rsyncd.conf
进行查看
常用全局参数(影响整个rsync守护进程)
参数 | 说明 | 示例值 |
---|---|---|
pid file | 指定存储进程ID的文件路径 | pid file = /var/run/rsyncd.pid |
port | 指定守护进程监听端口(默认873 ) | port = 873 |
address | 绑定到特定IP地址 | address = 192.168.1.100 |
uid/gid | 设置运行rsync的用户/组(默认nobody ) | uid = root |
gid = root | ||
use chroot | 是否将客户端锁定到模块路径(安全建议启用) | use chroot = yes |
max connections | 最大并发连接数 | max connections = 10 |
timeout | 空闲超时时间(秒) | timeout = 300 |
lock file | 锁文件路径(用于控制并发) | lock file = /var/run/rsync.lock |
log file | 日志文件路径 | log file = /var/log/rsyncd.log |
syslog facility | 设置syslog日志级别(如daemon, local0等) | syslog facility = local3 |
dont compress | 禁止压缩的文件类型(默认已压缩文件不重复压缩) | dont compress = *.gz *.zip |
hosts allow | 白名单 允许访问的客户端IP/网段(逗号分隔) | hosts allow = 192.168.1.0/24 |
hosts deny | 黑名单 拒绝访问的客户端IP(优先级高于hosts allow) | hosts deny = *(拒绝所有未明确允许的) |
常用模块参数(定义每个备份目录的配置)
部分模块参数也可以写在全局参数中,如果在全局则对全局生效
参数 | 说明 | 示例值 |
---|---|---|
[module_name] | 模块声明(必须用方括号括起 ) | [web_backup] |
path | 模块对应的实际路径(必须参数 ) | path = /backups/web |
comment | 模块描述信息 | comment = “Web Server Backup” |
auth users | 允许访问的用户(逗号分隔,需配合secrets file) | auth users = backup_user |
secrets file | 用户名密码文件路径(格式:user:pass ) | secrets file = /etc/rsyncd.secrets |
read only | 是否只读(yes=客户端不能上传) | read only = no |
write only | 是否只写(yes=客户端不能下载) | write only = no |
list | 是否允许列出模块列表(yes=客户端可查看) | list = yes |
exclude | 排除的文件/目录(支持通配符)多个文件时,与空格 作为分隔符 | exclude = *.tmp cache/ |
include | 包含的文件(优先级高于exclude) | include = *.php *.html |
transfer logging | 是否记录文件传输日志 | transfer logging = yes |
log format | 自定义日志格式(%o=操作类型,%f=文件名) | log format = “%o %f %l” |
timeout | 模块级别的超时设置(覆盖全局 ) | timeout = 600 |
dont compress | 模块级别的压缩排除(覆盖全局 ) | dont compress = *.jpg |
pre-xfer exec | 传输前执行的命令 | pre-xfer exec = /scripts/check_space.sh |
post-xfer exec | 传输后执行的命令 | post-xfer exec = /scripts/send_email.sh |
配置示例
配置目录文件/etc/rsyncd.conf
,如果不存在,需要手动创建
touch /etc/rsyncd.conf
# 全局配置
pid file = /var/run/rsyncd.pid
port = 873
use chroot = yes
hosts allow = 192.168.1.0/24
# 模块1:数据库备份
[db_backup]
path = /backups/db
auth users = db_user
secrets file = /etc/rsyncd_db.secrets
read only = no
comment = "MySQL Database Backup"
# 模块2:Web文件备份
[web_backup]
path = /backups/web
exclude = *.tmp *.log
hosts allow = 192.168.1.20
transfer logging = yes
关键注意事项
- 权限控制:
确保secrets file
权限为600
:
chmod 600 /etc/rsyncd.secrets
- 路径安全:
启用use chroot
时,模块路径必须是绝对路径且无符号链接。 - 调试命令:
rsync --daemon --config=/etc/rsyncd.conf --no-detach -v
- 日志查看:
tail -f /var/log/rsyncd.log
实操示例
测试环境说明
服务器类型 | IP地址 | 角色 | 模块路径 |
---|---|---|---|
Backup Server | 10.0.0.203 | rsync守护进程(服务端) | /rsync/backup/db /rsync/backup/web |
数据库服务器 | 10.0.0.201 | 客户端 | /data/mysql |
Web服务器 | 10.0.0.200 | 客户端 | /var/www/html |
服务器配置
创建rsync
用户和用户组(避免直接使用root账号)
groupadd -r rsync
useradd -r -s /sbin/nologin -g rsync rsync
创建相关目录
mkdir -pv /rsync/backup/web
mkdir -pv /rsync/backup/db
# 修改所属组和属主
chown -R rsync:rsync /rsync/backup/web
chown -R rsync:rsync /rsync/backup/db
注意:创建的文件夹,需要修改文件夹为rsync配置的属组和属主
配置rsyncd.conf
文件
# 全局配置
uid = rsync
gid = rsync
pid file = /var/run/rsyncd.pid
lock file = /var/lock/rsyncd.lock
log file = /var/log/rsyncd.log
hosts allow = 10.0.0.0/24
port = 873
use chroot = yes
max connections = 100
# 模块1:数据库备份
[db_backup]
path = /rsync/backup/db
auth users = db_user
secrets file = /etc/rsyncd.passwd
read only = no
comment = "MySQL Database Backup"
# 模块2:Web文件备份
[web_backup]
path = /rsync/backup/web
auth users = web_user
exclude = *.tmp *.log
transfer logging = yes
secrets file = /etc/rsyncd.passwd
comment = "Web Server Backup"
创建虚拟用户
根据配置文件中的配置,在/rsync
目录下,创建一个rsyncd.passwd
文件(名字可以自定义),用来存储虚拟账号的账号:密码
touch /rsync/rsyncd.passwd
chmod 600 /rsync/rsyncd.passwd
#vim /rsync/rsyncd.passwd
db_user:123456
web_user:123456
注意:该文件的权限必须是600
启动rsync
rsync --daemon
默认是使用/etc/rsyncd.conf
文件,如果需要自定文件,可以在启动时,使用--config=/path/to/confFile
例如:
rsync --daemon --config=/home/myrsyncd.conf
检查启动情况
ss -ntl | grep 873
# 或
netstat -an | grep 873
重启rsync
修改rsyncd.conf
配置文件时,需要重启rsync
。先杀进程,在启动
# kill进程
killall rsync
# 确认是否已关闭
ss -tnl | grep 873
# 重新启动
rsync --daemon
配置客户端
推送格式(push)
rsync [options] /path/sourcefile [user@]host::moduleName
连接收,需要输密码
拉取格式(pull)
rsync [options] [user@]host::moduleName /path/sourcefile
[user@]
表示虚拟用户,moduleName
表示模块名称
auth users
创建虚拟账号的密码文件,解决输入认证密码步骤
echo "123456" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
注意:密码文件需要600权限
rsync [options] /path/sourcefile [user@]host::moduleName --password-file=/etc/rsync.passwd
# 或
rsync [options] [user@]host::moduleName /path/sourcefile --password-file=/etc/rsync.passwd
实操遇到的问题
授权文件没有设置600
导致认证失败
执行chmod 600 /etc/rsyncd.passwd
解决
#####目录模块为只读模式,无法传输文件
配置文件增加read only = no
解决
文件传输成功,但是提醒一下警告信息
-
解决方案
- 方案1:忽略组权限同步(推荐)
在 rsync 命令中添加--no-group
选项:
rsync -avz --no-group /source/path user@remote:/target/path
- 方案2:忽略所有者和组信息
如果也不需保留所有者信息,可以加上--no-owner
:
rsync -avz --no-owner --no-group /source/path user@remote:/target/path
- 方案3:使用超级用户权限(
需谨慎
)
如果确实需要保留组信息且你有 sudo 权限:
sudo rsync -avz /source/path user@remote:/target/path
- 方案4:修改目标目录权限
在目标服务器上:
sudo chown -R youruser:yourgroup /target/path
- 方案1:忽略组权限同步(推荐)
-
预防措施
-
预先创建组:确保目标服务器上存在源服务器上的所有用户组
-
统一环境:保持开发、测试、生产环境的用户/组ID一致
-
使用标准化部署:考虑使用容器化部署避免此类问题
-