tarでバックアップセットを作る
目標
tarでフルバックアップと増分バックアップを作り、除外ルール、権限の保存、分割まで扱います。
なぜ重要なのか
tarのオプション1つで、復元の結果が変わります。-Cなしで絶対パスを保存すると復元先を選べず、--numeric-ownerなしで復元すると別のシステムで所有者が意図しないものにマッピングされ、--selinuxなしで復元するとSELinuxのシステムではサービスがまったく起動しません。さらに--listed-incrementalのスナップショットファイルが増分チェーンの状態を保持しているので、そのファイルも一緒に保管しなければなりません。これを失うと、次の増分は事実上フルバックアップになります。
ステップ
/root/bk/srcの下に次のファイルを作成してください。app/main.py、app/conf.yaml、data/records.csv、logs/app.log、logs/old.log。各ファイルに1行以上入れますが、data/records.csvだけは200KB以上で埋めてください。 ステップ7でアーカイブを64KBに分割しますが、1行だけのファイルでは圧縮後が1KBにもならず、断片が1つしかできません。base64 /dev/urandom | head -c 240000 > data/records.csvのようなものなら十分です。/root/bk/full.tar.gzにフルバックアップを作成してください。アーカイブ内のパスがsrc/で始まる必要があります(絶対パスは不可)。- アーカイブの項目数を、数字1行で
/root/bk/count.txtに書いてください。 - 増分バックアップを作成してください。スナップショットファイルは
/root/bk/snap.snarです。まず/root/bk/inc0.tar.gzを作成し、src/app/new.pyファイルを追加してから/root/bk/inc1.tar.gzを作成してください。inc1の項目数はinc0より少なくなければなりません。 logs/を除外したバックアップ/root/bk/nolog.tar.gzを作成してください。一覧にlogsがあってはいけません。/root/bk/src/app/conf.yamlの権限を640に変更してから、もう一度フルバックアップ(/root/bk/perm.tar.gz)を作成し、/root/bk/restore-perm/に権限を保存したまま復元してください。復元したファイルの権限を、数字1行で/root/bk/perm.txtに書いてください。640でなければなりません。/root/bk/full.tar.gzを64KB単位で分割して/root/bk/split/full.partという接頭辞で保存し、もう一度結合して/root/bk/rejoined.tar.gzを作成してください。元のファイルとsha256が同じでなければなりません。/root/bk/report.txtを次の5行で作成してください。FULL_ENTRIES=<3번 값>/INC0_ENTRIES=<inc0 항목 수>/INC1_ENTRIES=<inc1 항목 수>/NOLOG_HAS_LOGS=no/REJOIN_OK=yes(プレースホルダーは、順にステップ3の値、inc0の項目数、inc1の項目数です)
参考
tar -czf /root/bk/full.tar.gz -C /root/bk srcの形で作ると、アーカイブ内のパスがsrc/...になります。- 項目数は
tar -tzf <파일> | wc -lで数えます(プレースホルダーはアーカイブファイルです)。 - 増分は
tar --listed-incremental=/root/bk/snap.snar -czf <출력> -C /root/bk srcで作ります(プレースホルダーは出力ファイルです)。 - 分割は
split -b 64K <파일> /root/bk/split/full.part、再結合はcat /root/bk/split/full.part* > <출력>です(プレースホルダーは、順に分割するファイルと出力ファイルです)。 - よくある間違い1: ステップ4でスナップショットファイルを毎回削除すると、ずっとフルバックアップになります。
- よくある間違い2: ステップ6で復元時に権限を保存するオプションを忘れると、umaskが適用されて値が変わります。
バックアップ対象を作る
/root/bk/srcの下に次のファイルを作成してください。app/main.py、app/conf.yaml、data/records.csv、logs/app.log、logs/old.log。各ファイルに1行以上入れますが、data/records.csvだけは200KB以上で埋めてください。ステップ7でアーカイブを64KBに分割しますが、1行だけのファイルでは圧縮後が1KBにもならず、断片が1つしかできません。base64 /dev/urandom | head -c 240000 > data/records.csvのようなものなら十分です。
サブディレクトリとログを混ぜておくと、あとのステップの除外ルールに意味が出ます。
フルバックアップを取る
/root/bk/full.tar.gzにフルバックアップを作成してください。アーカイブ内のパスがsrc/で始まる必要があります(絶対パスは不可)。
絶対パスがアーカイブに入らないようにするオプションがあります。そうすれば復元先を選べます。
一覧を確認する
アーカイブの項目数を、数字1行で/root/bk/count.txtに書いてください。
展開せずに内容だけを見るオプションがあります。項目数を数えてファイルに書いてください。
増分バックアップを2回取る
増分バックアップを作成してください。スナップショットファイルは/root/bk/snap.snarです。まず/root/bk/inc0.tar.gzを作成し、src/app/new.pyファイルを追加してから/root/bk/inc1.tar.gzを作成してください。inc1の項目数はinc0より少なくなければなりません。
スナップショットファイルが状態を保持しています。同じスナップショットファイルを使い続けると、増分チェーンがつながります。
除外ルールを適用する
logs/を除外したバックアップ/root/bk/nolog.tar.gzを作成してください。一覧にlogsがあってはいけません。
除外パターンは、複数回指定することも、ファイルから読み込むこともできます。結果の一覧にその項目がないようにしてください。
権限の保存を確認する
/root/bk/src/app/conf.yamlの権限を640に変更してから、もう一度フルバックアップ(/root/bk/perm.tar.gz)を作成し、/root/bk/restore-perm/に権限を保存したまま復元してください。復元したファイルの権限を、数字1行で/root/bk/perm.txtに書いてください。640でなければなりません。
復元するときに権限と所有者を正確に再現するオプションがあります。復元後にstatで比較してください。
アーカイブを分割して再結合する
/root/bk/full.tar.gzを64KB単位で分割して/root/bk/split/full.partという接頭辞で保存し、もう一度結合して/root/bk/rejoined.tar.gzを作成してください。元のファイルとsha256が同じでなければなりません。
splitは接頭辞を受け取って、断片のファイルを作ります。再結合はcatで行います。
バックアップセットを要約する
/root/bk/report.txtを次の5行で作成してください。
FULL_ENTRIES=<3번 값> / INC0_ENTRIES=<inc0 항목 수> / INC1_ENTRIES=<inc1 항목 수> / NOLOG_HAS_LOGS=no / REJOIN_OK=yes(プレースホルダーは、順にステップ3の値、inc0の項目数、inc1の項目数です)
各アーカイブのサイズと項目数を集めてください。値は実際の測定値でなければなりません。