2016年4月30日土曜日

システムバックアップその13

さて、次は「古いバックアップの削除」だ。
バックアップデータをどんどん蓄えていくと、HDDがいくらあっても足りないし、あまりにも古いバックアップは、利用価値がほとんど無い。
そのため、保持世代数を決めておいて、それより古い世代は、自動的に削除するようにしよう。

保持世代数に関しては、設定ファイル上で持っておいて、自由に変更が出来るようにしておきたい。
また、保持世代数はバックアップシステム全体に関する情報のため、バックアップシステムの設定ファイル( etc/config )に持つようにしよう。
いつもどおり、 sudo su - して、configファイルに追記しよう。
# cd
# cd backup/bin
# vi ../etc/config

--以下の内容を追記--
#
# NUMBERS:
# Backup retention number of generations.
# Backup in excess of this number of generations is automatically deleted.
#
NUMBERS=5

--追記ココまで--
変数名は、そのものズバリの${NUMBERS}だ。
中身を見てもらえば分かる通り、とりあえず5世代にしている。
バックアップサイズやバックアップ先の容量を見ながら、必要に合わせて変更して欲しい。
実際には、6世代目のバックアップが完了した後に、古い世代を消す、という処理になるため、バックアップ先には一時的に「保持世代数+1」のバックアップが格納される。その分の容量も見込んで決めて欲しい。
さて、スクリプト本体だ。
いつも通り記載する。
# vi 0090_remove_oldarchive
--スクリプトここから--
#!/bin/sh
 
BINDIR=`/usr/bin/dirname $0`
BINDIR=`/usr/bin/realpath ${BINDIR}`
ETCDIR=`/usr/bin/realpath ${BINDIR}/../etc`
 
. ${ETCDIR}/config
 
N=1
 
for i in `/bin/ls ${BACKUPPOINT} | /bin/grep -e "^[0-9]\{14\}$" | /usr/bin/sort -r`
do
  if [ ${N} -gt ${NUMBERS} ]
  then
    /bin/rm -rf ${BACKUPPOINT}/$i
  fi
 
  N=`/usr/bin/expr ${N} + 1`
done

--ココまで--
前半はいつも通りの変数読み込み。
先ほど設定した${NUMBERS}も、序盤で読み込まれる。
後半は、forループ。
ここでは、ループの条件を、
  • バックアップ先ディレクトリにあるファイル・ディレクトリ(/bin/ls ${BACKUPPOINT})
  • そのうち、数字14桁のみで構成されているファイル・ディレクトリ(/bin/grep -e "^[0-9]\{14\}$")
  • それらを、数字逆順で(/usr/bin/sort -r)
としている。
ぶっちゃけ、バックアップ先ディレクトリに、数字14桁のみのファイルが合った場合、それもバックアップディレクトリと同じ扱いにしている。本来なら、ディレクトリかファイルか?も判定する必要があるだろうけど、完全な手抜きだ。
また、数字14桁固定にしている。バックアップディレクトリは数字14桁のディレクトリ、と決め打ちしているんだ。
逆に言うと、長期保存しておきたいバックアップディレクトリは、数字14桁以外のディレクトリ名にしておけば、削除対象から排除され、手で削除しない限り永遠に残り続ける。

ループの前に1に初期化している変数${N}は、ループカウンタだ。
ループ後半のN=`/usr/bin/expr ${N} + 1`で1つずつカウントアップしている。

このループカウンタと、${NUMBERS}を比較して、ループカウンタ(${N})の方が大きい場合、保持世代数を超えた古いバックアップだと判断(if [ ${N} -gt ${NUMBERS} ])し、削除(/bin/rm -rf ${BACKUPPOINT}/$i)している。

ちょっと複雑に見えるが、実際に動かしてみると大したことはやっていないことが分かる。

出来上がったら、いつも通り実行パーミッションを付与して、動かしてみよう。
現時点では、過去のバックアップは1つしか無いはずだから、何も削除されないはず。
そのため、5回以上実行して、古いバックアップが削除されるのを確認してみよう。
# chmod +x 0090_remove_oldarchive
# ./0010_mount
# ./0020_mkdir
# ./0030_create_config
# ./0040_create_snapshot
# ./0050_create_archive
# ./0060_remove_snapshot
# ./0070_get_fsmetadata
# ./0080_rename_backup
# ./0090_remove_oldarchive
# ls -l /media/backup

(ここでは2世代残っているはず)
# ./0020_mkdir
# ./0030_create_config
# ./0040_create_snapshot
# ./0050_create_archive
# ./0060_remove_snapshot
# ./0070_get_fsmetadata
# ./0080_rename_backup
# ./0090_remove_oldarchive
# ls -l /media/backup

(ここでは3世代残っているはず)
# ./0020_mkdir
# ./0030_create_config
# ./0040_create_snapshot
# ./0050_create_archive
# ./0060_remove_snapshot
# ./0070_get_fsmetadata
# ./0080_rename_backup
# ./0090_remove_oldarchive
# ls -l /media/backup

(ここでは4世代残っているはず)
# ./0020_mkdir
# ./0030_create_config
# ./0040_create_snapshot
# ./0050_create_archive
# ./0060_remove_snapshot
# ./0070_get_fsmetadata
# ./0080_rename_backup
# ./0090_remove_oldarchive
# ls -l /media/backup

(ここでは5世代残っているはず)
# ./0020_mkdir
# ./0030_create_config
# ./0040_create_snapshot
# ./0050_create_archive
# ./0060_remove_snapshot
# ./0070_get_fsmetadata
# ./0080_rename_backup
# ./0090_remove_oldarchive
# ls -l /media/backup

(ここでは一番古い世代が消えて、5世代残っているはず)

どうだろうか?期待した動きはしているだろうか?
後は、元に戻して終わりだ。
# umount /media/backup

次は、いつもテストの最後に実行しているumountをスクリプト化するところだ。
今回はココまで。

0 件のコメント:

コメントを投稿