备份校验的自动化
目标
分三个层次验证 backup 的完整性,并编写一个按验证阶段返回不同退出码的脚本。
为什么重要
“backup 正在运行”与“backup 有效”是两回事。验证分为三个层次:文件是否存在、是否能读取、是否真的能恢复。前两项可以自动化,仅凭它们就能发现大多数静默失败。而且,为不同阶段设置不同退出码,监控就能立即知道故障发生在哪里——“压缩流损坏”远比“backup 验证失败”更有用。
步骤
- 创建
/root/bv目录,并为/root/bk下的.tar.gz文件生成 sha256 manifest/root/bv/manifest.sha256。 - 使用 manifest 进行验证,将结果保存到
/root/bv/check.txt。每一行都必须正常。 - 检查
/root/bk/full.tar.gz的压缩流完整性,并把退出码写入/root/bv/gzip.txt,格式为rc=0。 - 检查同一文件的 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。 - 编写
/root/bv/verify.sh,它必须通过第一个参数接收 archive 路径并按以下规则运行:- 文件不存在或大小为 0:退出码 1
- 压缩流损坏:退出码 2
- archive 结构损坏:退出码 3
- 全部通过:退出码 0,并输出包含
OK的消息 评分器会分别用正常 archive 和第 5 步的损坏 archive 执行脚本。
- 创建包含以下 4 行的
/root/bv/report.txt:MANIFEST_OK=yes/CORRUPT_DETECTED=yes/SCRIPT_OK_RC=0/SCRIPT_BAD_RC=<손상 아카이브에 대해 스크립트가 낸 종료 코드>
参考
- 制造损坏:执行
cp <원본> <사본>,然后执行dd if=/dev/urandom of=<사본> bs=1 seek=200 count=32 conv=notrunc - 压缩检查使用
gzip -t <파일>,结构检查使用tar -tzf <파일> >/dev/null。 - 文件年龄可通过
find <파일> -mtime -1,或比较stat -c %Y与当前时间来检查。 - 常见错误 1:第 5 步在文件末尾追加字节,gzip 可能只给出 warning 而仍然通过。必须破坏中间位置。
- 常见错误 2:第 7 步脚本只使用
set -e,检查失败时会以命令自身的 code 退出,而不是所需退出码。请显式执行exit N。
创建 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 路径并按以下规则运行:
- 文件不存在或大小为 0:退出码 1
- 压缩流损坏:退出码 2
- archive 结构损坏:退出码 3
- 全部通过:退出码 0,并输出包含
OK的消息 评分器会分别用正常 archive 和第 5 步的损坏 archive 执行脚本。
通过参数接收 archive 路径,并为每个失败阶段返回不同退出码。评分器会同时测试正常和损坏两种情况。
编写验证报告
创建包含以下 4 行的 /root/bv/report.txt:
MANIFEST_OK=yes / CORRUPT_DETECTED=yes / SCRIPT_OK_RC=0 / SCRIPT_BAD_RC=<손상 아카이브에 대해 스크립트가 낸 종료 코드>
值必须来自实际执行结果,退出码也必须是脚本真正返回的值。