一、先明确备份项目里的主机分工

原始笔记在正式写脚本前先给出了环境介绍:

主机 角色
harbor01 存放备份,作为服务端
nfs01 生成备份,作为客户端

这说明整个项目是一个典型的“客户端生成备份、服务端集中存放与校验”的模式。

二、客户端备份脚本要解决什么问题

客户端脚本的核心目标并不复杂,主要就是完成下面五件事:

1、定义备份变量 2、生成备份目录 3、打包压缩关键内容 4、生成校验信息 5、把备份推送到服务端

这五步串起来,就是一套完整的自动化备份流程。

三、客户端备份脚本实战

3.1 创建脚本目录

mkdir /scripts

3.2 客户端脚本示例

原始笔记中的客户端脚本如下:

#!/bin/bash
#author: zq
#desc: 系统备份脚本
#version: v1.0

#1、变量
ip=`hostname -I | awk '{print $1}'`
time=`date +%F_%w`
backup_dir=/backup/${ip}
backup_server=192.168.1.67
backup_file=conf-${time}.tar.gz

#2、备份
if [ ! -d ${backup_dir} ]
then
    mkdir -p ${backup_dir}
fi
tar zcf ${backup_dir}/${backup_file} /etc/ /var/spool/cron/

#3、md5校验
md5sum ${backup_dir}/${backup_file} > ${backup_dir}/print.md5

#4、推送
rsync -a ${backup_dir} rsync_backup@${backup_server}::backup --password-file=/etc/rsync.client

#5、清理
find $backup_dir -type f -name "*.tar.gz" -mtime +7 | xargs rm -f

3.3 这个脚本的关键点

3.3.1 备份目录按主机 IP 分开

脚本里使用:

backup_dir=/backup/${ip}

这样每台客户端的备份都能按 IP 独立归档,后续服务端统计会更清晰。

3.3.2 备份文件名里带日期和星期

time=`date +%F_%w`
backup_file=conf-${time}.tar.gz

这样做的好处是:

  • 文件名可读性强
  • 便于按天定位备份
  • 同名覆盖风险更低

3.3.3 备份内容以配置和计划任务为主

脚本打包的是:

/etc/
/var/spool/cron/

这和项目背景中的思路一致:优先备份配置文件和定时任务等关键系统信息。

3.3.4 生成 MD5 校验文件

md5sum ${backup_dir}/${backup_file} > ${backup_dir}/print.md5

这样服务端后续就能对备份完整性做自动校验。

3.3.5 自动清理旧备份

find $backup_dir -type f -name "*.tar.gz" -mtime +7 | xargs rm -f

这表示把 7 天前的历史备份自动删除,避免客户端本地备份目录无限膨胀。

四、服务端备份脚本实战

4.1 创建脚本目录

mkdir /scripts

4.2 服务端脚本示例

原始笔记中的服务端脚本如下:

#!/bin/bash
#author: zq
#desc: 系统备份脚本
#version: v1.0

#0、变量
result_file=/scripts/result.txt

#1、清理旧的备份
find /backup -type f -name "*.tar.gz" -mtime +7 | xargs rm -f

#2、统计备份结果
find /backup -type f -name "*.tar.gz" | xargs ls -lhd | awk -F '[ /]+' 'BEGIN{print "IP地址","备份文件名字","大小"} {print $(NF-1),$NF,$5}' | column -t > ${result_file}

#3、MD5校验
echo "#下面信息为备份的MD5校验信息" >> ${result_file}
find /backup -name "print.md5" | xargs md5sum -c >> ${result_file}

#4、发送邮件
mail -s "每日备份结果" 1904763431@qq.com < ${result_file}

4.3 服务端脚本在做什么

服务端脚本主要负责四件事:

  • 清理过期备份
  • 汇总当前备份结果
  • 做 MD5 校验
  • 把结果通过邮件发出去

这意味着服务端不只是“放文件”,还承担了校验与汇总职责。

五、定时任务怎么安排

5.1 客户端定时执行备份

crontab -e
00 01 * * * sh /scripts/client_bak.sh > /backup/result-`date +%F`.txt 2>&1

表示每天 01:00 执行客户端备份。

5.2 服务端定时执行校验与汇总

crontab -e
00 02 * * * sh /scripts/server_bak.sh > /backup/result-`date +%F`.txt 2>&1

表示每天 02:00 执行服务端汇总。

这样的顺序很合理:

  • 先让客户端完成备份
  • 再让服务端统一统计和校验

六、如何验证备份项目是否真的成功

原始笔记给出了两种验证方式。

6.1 看邮箱通知

如果邮件发送配置正常,可以直接在邮箱里查看备份结果通知。

6.2 在服务端查看结果文件

cat /scripts/result.txt

原始笔记中的结果示例包括:

  • IP 地址
  • 备份文件名
  • 文件大小
  • MD5 校验结果

例如:

IP地址        备份文件名字              大小
192.168.1.66  conf-2023-12-03_0.tar.gz  12M
#下面信息为备份的MD5校验信息
/backup/192.168.1.66/conf-2023-12-03_0.tar.gz: OK

七、这个备份项目里都用到了哪些技术

原始笔记在总结里提到,这个项目串联了不少基础技术:

  • rsync
  • 定时任务 cron
  • md5sum
  • 邮件通知
  • Shell 脚本
  • 三剑客
  • tar
  • find

这也是这类项目非常适合练手的原因:它既不只是一条命令,也不是特别重型的系统,而是把很多基础能力串成了完整方案。

八、小结

这个自动化备份项目最值得学习的地方,不只是“怎么备份”,而是它体现出了一套标准运维流程:

  • 客户端负责生成备份
  • 服务端负责集中保存
  • 脚本负责自动执行
  • MD5 负责完整性校验
  • 邮件负责结果反馈
  • 定时任务负责让整个流程每天稳定运行

把这套链路吃透之后,后面再去扩展数据库备份、异地容灾和更复杂的归档策略,就有了很好的基础。