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

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

rsync 增量备份实战封面

实验环境说明:示例使用 192.168.88.111 作为备份客户端,使用 192.168.88.222 作为备份服务器。生产环境应替换为实际地址,并通过防火墙、专用备份网络或 VPN 限制访问范围。

文章目录

一、rsync 是什么

rsync 可以在本机目录之间复制文件,也可以通过 SSH 或独立守护进程在两台主机之间同步数据。它的核心优势是:目标端已经存在且没有变化的数据,后续不必反复传输。

1.1 全量与增量怎么理解

可以把第一次搬家理解为全量传输:目标房间是空的,所有箱子都要搬过去。第二次同步时,rsync 会先比较两边,只搬新增或发生变化的箱子。

对比项scprsync
主要用途简单远程复制同步、镜像、备份
再次执行通常重新复制指定内容跳过未变化文件
保留属性需要额外选项-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 的三种工作模式

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 端口。

rsync PUSH 与 PULL 原始示意图

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-client192.168.88.111
备份端rsync-server192.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 会让目标端删除源端不存在的内容。源目录写错、挂载丢失或变量为空,都可能造成严重数据损失。镜像同步不等于历史备份,重要数据还需要快照、版本保留或离线副本。

七、网站服务器自动备份案例

rsync 自动备份流程

7.1 备份哪些内容

常见备份对象包括:

  • /etc/ 中经过筛选的系统与服务配置;
  • /var/www//srv/www/ 中的网站文件;
  • /home/ 中的用户数据;
  • /etc/cron.d/、用户 crontab 和运维脚本;
  • 证书、密钥和应用配置,但必须加强备份端权限控制与加密;
  • 数据库通过 mysqldumppg_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,并对失败结果告警。

十、复习检查点

  1. rsync -a /data /backup/rsync -a /data/ /backup/ 的结果有什么区别?
  2. 一个冒号和两个冒号分别代表什么连接方式?
  3. 为什么第一次 rsync 通常仍然是全量传输?
  4. uid = rsyncauth users = rsync_backup 为什么不是同一种用户?
  5. 为什么密码文件必须设置为 600
  6. 使用 --delete 前为什么必须先运行 --dry-run
  7. -a 默认没有包含哪些常见高级文件属性?
  8. 为什么不能直接同步正在运行的数据库数据目录作为通用备份方案?
  9. 校验和成功为什么仍然不能代替恢复演练?
  10. 自动备份任务为什么不应长期设置为每分钟执行?

总结

rsync 的核心价值可以概括为三点:同步未变化数据时减少重复传输、灵活控制目录与排除规则、方便接入脚本和定时任务。

一个完整的备份链路不应停在“命令执行成功”,而应该包含:

选择数据 → 生成一致性副本 → rsync 传输 → 历史保留 → 校验 → 告警 → 恢复演练

只会运行 rsync -av,解决的是文件传输;把权限、网络、日志、保留周期和恢复验证都补齐,才算真正建立了备份流程。

注意事项

  • 正式执行 --delete 前必须加 -n 预演,并确认源目录没有因挂载失败而变空。
  • 守护进程认证口令不是 Linux 登录密码,客户端密码文件中不要写用户名。
  • 密码文件必须限制为 600,备份目录和日志也要遵循最小权限原则。
  • -a 不自动包含 ACL、扩展属性和硬链接,必要时评估 -A -X -H
  • 已经压缩的文件不一定需要 -z,高速局域网中压缩可能增加 CPU 消耗。
  • 实时镜像、定时同步和历史备份不是同一个概念,不能相互替代。
  • 备份端要监控磁盘空间、任务退出码、日志和校验结果。
  • 至少保留一份与生产故障域隔离的副本,并定期执行恢复演练。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值