LabHub
学习 学习路径 课程

备份与恢复

备份校验的自动化

在 LabHub 中继续学习

目标

分三个层次验证 backup 的完整性,并编写一个按验证阶段返回不同退出码的脚本

为什么重要

“backup 正在运行”与“backup 有效”是两回事。验证分为三个层次:文件是否存在、是否能读取、是否真的能恢复。前两项可以自动化,仅凭它们就能发现大多数静默失败。而且,为不同阶段设置不同退出码,监控就能立即知道故障发生在哪里——“压缩流损坏”远比“backup 验证失败”更有用。

步骤

  1. 创建 /root/bv 目录,并为 /root/bk 下的 .tar.gz 文件生成 sha256 manifest /root/bv/manifest.sha256
  2. 使用 manifest 进行验证,将结果保存到 /root/bv/check.txt。每一行都必须正常。
  3. 检查 /root/bk/full.tar.gz 的压缩流完整性,并把退出码写入 /root/bv/gzip.txt,格式为 rc=0
  4. 检查同一文件的 archive 结构,并把退出码写入 /root/bv/tarlist.txt,格式为 rc=0
  5. 创建 /root/bv/corrupt.tar.gz。复制 /root/bk/full.tar.gz 后,必须破坏中间位置的字节。确认压缩检查失败,并把输出保存到 /root/bv/corrupt-detected.txt
  6. /root/bv/last-success 中以 ISO 格式(date -Is)记录当前时间,并判断该文件是否在 24 小时以内,把结果写入 /root/bv/fresh.txt,格式为 FRESH=yes
  7. 编写 /root/bv/verify.sh,它必须通过第一个参数接收 archive 路径并按以下规则运行:
    • 文件不存在或大小为 0:退出码 1
    • 压缩流损坏:退出码 2
    • archive 结构损坏:退出码 3
    • 全部通过:退出码 0,并输出包含 OK 的消息 评分器会分别用正常 archive 和第 5 步的损坏 archive 执行脚本。
  8. 创建包含以下 4 行的 /root/bv/report.txtMANIFEST_OK=yes / CORRUPT_DETECTED=yes / SCRIPT_OK_RC=0 / SCRIPT_BAD_RC=<손상 아카이브에 대해 스크립트가 낸 종료 코드>

参考

创建 checksum manifest

创建 /root/bv 目录,并为 /root/bk 下的 .tar.gz 文件生成 sha256 manifest /root/bv/manifest.sha256

在待验证目录中使用相对路径创建,后续检查会更方便。

验证 manifest

使用 manifest 进行验证,将结果保存到 /root/bv/check.txt。每一行都必须正常。

sha256sum 有读取 manifest 并执行检查的选项。每一行都必须正常。

检查压缩流

检查 /root/bk/full.tar.gz 的压缩流完整性,并把退出码写入 /root/bv/gzip.txt,格式为 rc=0

gzip 有一个只检查压缩文件完整性的选项,成功时不会输出内容。

检查 archive 结构

检查同一文件的 archive 结构,并把退出码写入 /root/bv/tarlist.txt,格式为 rc=0

输出文件列表时把内容丢弃,只检查退出码。

复现并检测损坏

创建 /root/bv/corrupt.tar.gz。复制 /root/bk/full.tar.gz 后,必须破坏中间位置的字节。确认压缩检查失败,并把输出保存到 /root/bv/corrupt-detected.txt

创建副本后追加或翻转字节。不得修改原文件。

记录最近成功时间

/root/bv/last-success 中以 ISO 格式(date -Is)记录当前时间,并判断该文件是否在 24 小时以内,把结果写入 /root/bv/fresh.txt,格式为 FRESH=yes

把成功时间写入文件,再检查该文件年龄。ISO 格式更容易处理。

编写分阶段验证脚本

编写 /root/bv/verify.sh,它必须通过第一个参数接收 archive 路径并按以下规则运行:

通过参数接收 archive 路径,并为每个失败阶段返回不同退出码。评分器会同时测试正常和损坏两种情况。

编写验证报告

创建包含以下 4 行的 /root/bv/report.txtMANIFEST_OK=yes / CORRUPT_DETECTED=yes / SCRIPT_OK_RC=0 / SCRIPT_BAD_RC=<손상 아카이브에 대해 스크립트가 낸 종료 코드>

值必须来自实际执行结果,退出码也必须是脚本真正返回的值。