Linux rsync 增量备份实战:守护进程、自动化脚本与完整性校验

实验环境说明:示例使用
192.168.88.111作为备份客户端,使用192.168.88.222作为备份服务器。生产环境应替换为实际地址,并通过防火墙、专用备份网络或 VPN 限制访问范围。
文章目录
- 一、rsync 是什么
- 二、先理解源目录末尾的斜杠
- 三、rsync 的三种工作模式
- 四、SSH 远程同步实战
- 五、部署 rsync 守护进程
- 六、常用高级选项
- 七、网站服务器自动备份案例
- 八、备份完整性校验
- 九、常见故障与易错点
- 十、复习检查点
- 总结
- 注意事项
一、rsync 是什么
rsync 可以在本机目录之间复制文件,也可以通过 SSH 或独立守护进程在两台主机之间同步数据。它的核心优势是:目标端已经存在且没有变化的数据,后续不必反复传输。
1.1 全量与增量怎么理解
可以把第一次搬家理解为全量传输:目标房间是空的,所有箱子都要搬过去。第二次同步时,rsync 会先比较两边,只搬新增或发生变化的箱子。
| 对比项 | scp | rsync |
|---|---|---|
| 主要用途 | 简单远程复制 | 同步、镜像、备份 |
| 再次执行 | 通常重新复制指定内容 | 跳过未变化文件 |
| 保留属性 | 需要额外选项 | -a 归档模式统一处理 |
| 排除规则 | 不擅长 | 支持 --exclude、--exclude-from |
| 删除目标多余文件 | 不支持镜像语义 | 支持 --delete,但风险较高 |
需要注意,“增量传输”不等于“永远只发送文件内部发生变化的几个字节”。是否使用差异算法还会受到本地/远程模式、文件大小、版本和选项影响。对日常运维来说,最重要的现象是:未变化的文件不会反复复制。
1.2 常用选项
| 选项 | 作用 |
|---|---|
-a | 归档模式,相当于 -rlptgoD,递归并尽量保留常见属性 |
-v | 显示详细过程 |
-z | 传输时压缩,适合文本和低带宽链路;局域网或已压缩文件未必更快 |
-n、--dry-run | 只预演,不实际修改,测试危险命令时非常重要 |
--info=progress2 | 显示总体传输进度 |
--partial | 中断时保留部分文件,便于续传 |
--bwlimit=500 | 限制传输带宽,数值默认按 KiB/s 解释 |
--exclude | 排除指定路径或模式 |
--exclude-from | 从文件读取多条排除规则 |
--delete | 删除目标端源目录中不存在的内容,使两端接近镜像状态 |
官方手册明确提醒:--delete 使用错误可能删除目标端数据,正式执行前应先配合 --dry-run 查看计划删除项。-a 也不是“保留所有扩展属性”的万能选项;ACL、扩展属性和硬链接等需要按需求增加 -A、-X、-H。详细定义可查看 rsync 官方手册。
二、先理解源目录末尾的斜杠
这是 rsync 最常见的易错点。
假设 /data/source 中有 a.txt:
rsync -a /data/source /backup/
这条命令会把目录本身复制过去,结果通常是:
/backup/source/a.txt
如果源目录后面带 /:
rsync -a /data/source/ /backup/
表示复制目录里面的内容,结果通常是:
/backup/a.txt
一句话记忆:
源路径没有
/,带走目录本身;源路径有/,只同步目录里的内容。
目标路径末尾的 / 通常不会产生同样的语义变化,但为了可读性,目录目标一般也写上 /。
三、rsync 的三种工作模式

3.1 本地模式
本地模式用于同一台机器上的目录同步:
rsync -a /etc/ /opt/etc-backup/
这种方式能用于迁移目录、构建临时副本,但不能代替异机备份。如果磁盘或整台服务器损坏,源数据和本地备份可能一起丢失。
3.2 SSH 远程模式
远程路径使用一个冒号,底层通常通过 SSH 连接:
user@host:/remote/path/
它适合临时传输、少量服务器互传和已经建立 SSH 密钥体系的环境。权限由远端登录用户决定。
3.3 守护进程模式
守护进程路径使用两个冒号:
user@host::module/
这里的 module 不是 Linux 真实目录名,而是 /etc/rsyncd.conf 中定义的模块。守护进程模式适合集中备份、固定目录同步和定时任务,默认监听 TCP 873 端口。

3.4 PUSH 和 PULL
PUSH 是本机把数据推给远端:
rsync -av /etc/sysconfig/ root@192.168.88.222:/mnt/sysconfig/
PULL 是本机从远端拉取数据:
rsync -av root@192.168.88.222:/mnt/sysconfig/ /etc/sysconfig/
判断方向时不要死记命令,先看源和目标:左边是源,右边是目标。
四、SSH 远程同步实战
4.1 环境准备
| 角色 | 主机名 | IP 地址 |
|---|---|---|
| 数据源 | rsync-client | 192.168.88.111 |
| 备份端 | rsync-server | 192.168.88.222 |
两端安装 rsync:
yum install -y rsync
在较新的 RHEL、Rocky Linux 或 AlmaLinux 中也可以使用:
dnf install -y rsync
4.2 第一次同步
客户端执行:
rsync -av --info=progress2 /etc/sysconfig/ root@192.168.88.222:/opt/sysconfig/
第一次目标目录中没有数据,大部分文件都需要传输。
4.3 验证增量效果
再次执行同一条命令,正常情况下传输内容会明显减少。然后创建一个测试文件:
touch /etc/sysconfig/rsync-test.conf
rsync -av /etc/sysconfig/ root@192.168.88.222:/opt/sysconfig/
这一次主要传输新文件和目录元数据。完成验证后删除测试文件:
rm -f /etc/sysconfig/rsync-test.conf
五、部署 rsync 守护进程
5.1 服务端配置文件
在 rsync-server 上创建 /etc/rsyncd.conf:
fake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 600
pid file = /run/rsyncd.pid
lock file = /run/rsyncd.lock
log file = /var/log/rsyncd.log
read only = false
list = false
hosts allow = 192.168.88.0/24
hosts deny = *
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = centralized backup
path = /opt/module
这里要区分两个用户:
uid = rsync:Linux 系统用户,决定守护进程读写文件时使用的身份;auth users = rsync_backup:rsync 模块认证名,不要求系统中存在同名登录用户。
fake super = yes 允许非 root 守护进程用扩展属性保存更完整的文件元数据,但目标文件系统和 rsync 版本必须支持。对 ACL 和扩展属性有要求时,还要在客户端评估 -A -X。
5.2 创建系统用户、共享目录和密码文件
useradd -r -M -s /sbin/nologin rsync
mkdir -p /opt/module
chown -R rsync:rsync /opt/module
printf '%s\n' 'rsync_backup:111111' > /etc/rsync.password
chmod 600 /etc/rsync.password
实验密码 111111 只为展示格式。生产环境应生成高强度随机密码,并通过配置管理或密钥系统分发,不能把真实密码提交到 Git 仓库。
5.3 启动并检查服务
systemctl enable --now rsyncd
systemctl status rsyncd --no-pager
ss -lntp | grep ':873'
保持防火墙启用,只允许备份网段访问 TCP 873:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.88.0/24" port protocol="tcp" port="873" accept'
firewall-cmd --reload
如果系统启用了 SELinux 且 /opt/module 无法写入,不要直接关闭 SELinux。先查看 /var/log/audit/audit.log,再根据发行版策略为备份目录设置合适的文件上下文。
5.4 客户端免交互认证
客户端密码文件只保存密码,不写用户名:
printf '%s\n' '111111' > /etc/rsync.client
chmod 600 /etc/rsync.client
测试推送:
rsync -av /etc/ rsync_backup@192.168.88.222::backup/etc/ \
--password-file=/etc/rsync.client
服务端验证:
find /opt/module -maxdepth 2 -type f | head
tail -n 50 /var/log/rsyncd.log
六、常用高级选项
6.1 限速与断点续传
创建一个 1 GiB 稀疏测试文件:
truncate -s 1G /tmp/1g.test
限制为大约 500 KiB/s,并保留未完成文件:
rsync -av --partial --bwlimit=500 /tmp/1g.test \
rsync_backup@192.168.88.222::backup/ \
--password-file=/etc/rsync.client
-z 和 --bwlimit 可以同时使用,但是否值得取决于文件类型和 CPU、网络条件。日志和文本通常容易压缩,视频、压缩包、镜像文件再次压缩收益很小。
6.2 排除单个或多个文件
rsync -av /data/ rsync_backup@192.168.88.222::backup/data/ \
--exclude='cache/' \
--exclude='*.tmp' \
--password-file=/etc/rsync.client
排除规则较多时,写入文件:
cat /etc/rsync.exclude
cache/
*.tmp
*.swp
rsync -av /data/ rsync_backup@192.168.88.222::backup/data/ \
--exclude-from=/etc/rsync.exclude \
--password-file=/etc/rsync.client
6.3 安全使用 --delete
先预演:
rsync -avn --delete /data/ rsync_backup@192.168.88.222::backup/data/ \
--password-file=/etc/rsync.client
确认输出中的删除列表没有问题后,再去掉 -n:
rsync -av --delete /data/ rsync_backup@192.168.88.222::backup/data/ \
--password-file=/etc/rsync.client
高风险提示:
--delete会让目标端删除源端不存在的内容。源目录写错、挂载丢失或变量为空,都可能造成严重数据损失。镜像同步不等于历史备份,重要数据还需要快照、版本保留或离线副本。
七、网站服务器自动备份案例

7.1 备份哪些内容
常见备份对象包括:
/etc/中经过筛选的系统与服务配置;/var/www/、/srv/www/中的网站文件;/home/中的用户数据;/etc/cron.d/、用户 crontab 和运维脚本;- 证书、密钥和应用配置,但必须加强备份端权限控制与加密;
- 数据库通过
mysqldump、pg_dump或厂商工具产生的一致性备份文件。
不要在数据库持续写入时直接 rsync /var/lib/mysql/ 并把它当作可靠逻辑备份。数据库物理备份需要遵循数据库自身的一致性机制。
7.2 客户端备份脚本
创建 /usr/local/sbin/backup-client.sh:
#!/usr/bin/env bash
set -Eeuo pipefail
rsync_server_user='rsync_backup'
rsync_server_ip='192.168.88.222'
rsync_server_module='backup'
rsync_server_password='/etc/rsync.client'
date_tag=$(date +%F_%w)
client_ip=$(hostname -I | awk '{print $1}')
backup_dir="/backup/${client_ip}"
backup_file="backup-${date_tag}.tar.gz"
checksum_file="${backup_file}.sha256"
mkdir -p "${backup_dir}"
tar -C / -czf "${backup_dir}/${backup_file}" etc var/spool/cron
(
cd "${backup_dir}"
sha256sum "${backup_file}" > "${checksum_file}"
)
rsync -a --partial "${backup_dir}" \
"${rsync_server_user}@${rsync_server_ip}::${rsync_server_module}" \
--password-file="${rsync_server_password}"
find "${backup_dir}" -type f -name '*.tar.gz*' -mtime +7 -delete
赋予执行权限并手动测试:
chmod 700 /usr/local/sbin/backup-client.sh
/usr/local/sbin/backup-client.sh
服务端应该出现类似目录:
/opt/module/192.168.88.111/
├── backup-2026-09-11_5.tar.gz
└── backup-2026-09-11_5.tar.gz.sha256
7.3 配置定时任务
先用较短周期验证,确认无误后再改为正式时间。例如每天凌晨 1 点执行:
crontab -e
0 1 * * * /usr/local/sbin/backup-client.sh >>/var/log/backup-client.log 2>&1
不要在生产环境长期使用 * * * * *。每分钟打包 /etc 和 cron 目录会持续产生文件、日志和负载。
7.4 服务端保留策略与通知
服务端可以保留 180 天内的日备份,同时长期保留星期一产生的 _1 文件:
find /opt/module/ -type f -name 'backup-*.tar.gz*' \
! -name '*_1.tar.gz*' -mtime +180 -print
先检查 -print 输出,再改成 -delete:
find /opt/module/ -type f -name 'backup-*.tar.gz*' \
! -name '*_1.tar.gz*' -mtime +180 -delete
邮件通知依赖本机已经正确配置 MTA 或 SMTP 中继:
tree /opt/module/ | mail -s "$(date +%F) backup inventory" ops@example.com
原资料中的邮件结果可以作为验证参考:

八、备份完整性校验
8.1 md5sum 能做什么
md5sum 可以检测文件在传输或存储后是否发生变化:
echo 123 > test.txt
md5sum test.txt > test.txt.md5
md5sum -c test.txt.md5
修改文件后再次校验:
echo 456 >> test.txt
md5sum -c test.txt.md5
MD5 可以用于普通传输损坏检查,但不再适合对抗恶意篡改。新的备份流程更推荐 sha256sum:
sha256sum backup-2026-09-11_5.tar.gz > backup-2026-09-11_5.tar.gz.sha256
sha256sum -c backup-2026-09-11_5.tar.gz.sha256
8.2 服务端批量校验
find /opt/module -type f -name '*.sha256' -print0 |
while IFS= read -r -d '' checksum_file; do
(
cd "$(dirname "${checksum_file}")"
sha256sum -c "$(basename "${checksum_file}")"
)
done | tee /opt/module/backup-result.txt
校验成功只说明文件内容与生成校验值时一致,不代表备份一定能够恢复。真正可靠的流程还要定期抽取备份,在隔离环境完成解压、配置检查或业务恢复演练。
九、常见故障与易错点
9.1 @ERROR: auth failed on module
重点检查:
cat /etc/rsync.password
cat /etc/rsync.client
stat -c '%a %n' /etc/rsync.password /etc/rsync.client
服务端文件格式是 用户名:密码,客户端文件只有密码;两者必须一致,权限必须是 600。
9.2 Permission denied
依次检查模块目录的属主、父目录执行权限、SELinux 拒绝日志和守护进程身份:
namei -l /opt/module
id rsync
ls -ld /opt/module
journalctl -u rsyncd --since '-10 min'
9.3 Connection refused
systemctl status rsyncd --no-pager
ss -lntp | grep ':873'
firewall-cmd --list-all
一个冒号走 SSH,两个冒号走 rsync daemon。把两种语法混用,也会造成连接端口和认证方式不符合预期。
9.4 目录层级多了一层或少了一层
检查源路径最后的 /。执行正式任务前,可以先同步到临时目录观察结果:
mkdir -p /tmp/rsync-check
rsync -anv /data/ /tmp/rsync-check/
9.5 备份脚本显示成功但没有可恢复数据
常见原因包括:源目录其实是空挂载点、数据库文件处于不一致状态、脚本错误被重定向吞掉,或者目标端磁盘已满。脚本建议启用 set -Eeuo pipefail,并对失败结果告警。
十、复习检查点
rsync -a /data /backup/与rsync -a /data/ /backup/的结果有什么区别?- 一个冒号和两个冒号分别代表什么连接方式?
- 为什么第一次 rsync 通常仍然是全量传输?
uid = rsync与auth users = rsync_backup为什么不是同一种用户?- 为什么密码文件必须设置为
600? - 使用
--delete前为什么必须先运行--dry-run? -a默认没有包含哪些常见高级文件属性?- 为什么不能直接同步正在运行的数据库数据目录作为通用备份方案?
- 校验和成功为什么仍然不能代替恢复演练?
- 自动备份任务为什么不应长期设置为每分钟执行?
总结
rsync 的核心价值可以概括为三点:同步未变化数据时减少重复传输、灵活控制目录与排除规则、方便接入脚本和定时任务。
一个完整的备份链路不应停在“命令执行成功”,而应该包含:
选择数据 → 生成一致性副本 → rsync 传输 → 历史保留 → 校验 → 告警 → 恢复演练
只会运行 rsync -av,解决的是文件传输;把权限、网络、日志、保留周期和恢复验证都补齐,才算真正建立了备份流程。
注意事项
- 正式执行
--delete前必须加-n预演,并确认源目录没有因挂载失败而变空。 - 守护进程认证口令不是 Linux 登录密码,客户端密码文件中不要写用户名。
- 密码文件必须限制为
600,备份目录和日志也要遵循最小权限原则。 -a不自动包含 ACL、扩展属性和硬链接,必要时评估-A -X -H。- 已经压缩的文件不一定需要
-z,高速局域网中压缩可能增加 CPU 消耗。 - 实时镜像、定时同步和历史备份不是同一个概念,不能相互替代。
- 备份端要监控磁盘空间、任务退出码、日志和校验结果。
- 至少保留一份与生产故障域隔离的副本,并定期执行恢复演练。

342

被折叠的 条评论
为什么被折叠?



