バックアップ検証の自動化
目標
バックアップの整合性を3段階で検証し、段階ごとの終了コードを持つ検証スクリプトを作成します。
なぜ重要なのか
「バックアップが動いている」と「バックアップが有効である」は別のことです。検証は3段階です。存在するか、読めるか、実際に復旧できるかです。前の2つは自動化でき、それだけでも静かな失敗の大半を捕まえられます。さらに、段階ごとに異なる終了コードを返すと、監視でどこで壊れたのかがすぐにわかります。「バックアップ検証の失敗」より「圧縮ストリームの破損」のほうが、ずっと役に立つアラートです。
ステップ
/root/bvディレクトリを作成し、/root/bkの下の.tar.gzファイルに対するsha256のマニフェストを/root/bv/manifest.sha256に作成してください。- マニフェストで検証を実行し、結果を
/root/bv/check.txtに保存してください。すべての行が正常でなければなりません。 /root/bk/full.tar.gzの圧縮ストリームの整合性を検査し、終了コードを/root/bv/gzip.txtにrc=0の形式で書いてください。- 同じファイルのアーカイブ構造を検査し、終了コードを
/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を作成してください。最初の引数でアーカイブのパスを受け取り、次のように動作する必要があります。- ファイルがない、またはサイズが0なら、終了コード1
- 圧縮ストリームが壊れていれば、終了コード2
- アーカイブの構造が壊れていれば、終了コード3
- すべて通過すれば、終了コード0とともに
OKを含むメッセージを出力 採点ツールが、正常なアーカイブとステップ5の破損アーカイブの両方で実行します。
/root/bv/report.txtを次の4行で作成してください。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が警告を出すだけで通過してしまうことがあります。途中を破損させてください。
- よくある間違い2: ステップ7のスクリプトに
set -eだけを書くと、検査に失敗したとき、望みの終了コードではなくコマンドのコードで終わります。明示的にexit Nしてください。
チェックサムのマニフェストを作る
/root/bvディレクトリを作成し、/root/bkの下の.tar.gzファイルに対するsha256のマニフェストを/root/bv/manifest.sha256に作成してください。
検証するディレクトリで相対パスで作っておくと、あとの検査が楽になります。
マニフェストで検証する
マニフェストで検証を実行し、結果を/root/bv/check.txtに保存してください。すべての行が正常でなければなりません。
sha256sumには、マニフェストを読み込んで検査するオプションがあります。すべての行が正常でなければなりません。
圧縮ストリームを検査する
/root/bk/full.tar.gzの圧縮ストリームの整合性を検査し、終了コードを/root/bv/gzip.txtにrc=0の形式で書いてください。
gzipには、圧縮ファイルの整合性だけを検査するオプションがあります。成功したときは何も出力されません。
アーカイブの構造を検査する
同じファイルのアーカイブ構造を検査し、終了コードを/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を作成してください。最初の引数でアーカイブのパスを受け取り、次のように動作する必要があります。
- ファイルがない、またはサイズが0なら、終了コード1
- 圧縮ストリームが壊れていれば、終了コード2
- アーカイブの構造が壊れていれば、終了コード3
- すべて通過すれば、終了コード0とともに
OKを含むメッセージを出力 採点ツールが、正常なアーカイブとステップ5の破損アーカイブの両方で実行します。
引数でアーカイブのパスを受け取り、失敗した段階ごとに異なる終了コードを返してください。採点ツールが、正常なアーカイブと破損したアーカイブの両方で実行します。
検証レポートを作る
/root/bv/report.txtを次の4行で作成してください。
MANIFEST_OK=yes / CORRUPT_DETECTED=yes / SCRIPT_OK_RC=0 / SCRIPT_BAD_RC=<손상 아카이브에 대해 스크립트가 낸 종료 코드>(プレースホルダーは、破損したアーカイブに対してスクリプトが返した終了コードです)
値は実際の実行結果でなければなりません。終了コードは、スクリプトが実際に返した値です。