Fedoraサーバーにおけるバックアップの方法

投稿日: 2009年4月26日 | カテゴリ:『自宅サーバー』>メンテナンス

本稿では、システム全体の再現に必要な部分的バックアップの方法について紹介いたします。システムがハングアップした場合には部分的修復を行い、それでもだめな場合にはインストール・ディスクによってシステムを再インストールすることを前提にしています。

バックアップの基本構造
  1. 万が一にシステム全体がハングアップした場合には、インストール・ディスクで復元します(システムをアップグレードする時と同じです)。全体的復元では回復できないファイル(自分で変更した設定ファイル、時間の経過と共に変化するファイルや新たにインストールしたアプリケーションなど)のバックアップについては、次の方法で行います。
  2. バックアップの保存デバイスは、移動可能なUSBハードデスクとします。この設置方法については以下の記事を参照してください。
    Fedoraサーバーで複数のUSBを使用する方法

  3. 定期的に(例えば1日に1回)、バックアップ対象のディレクトリのファイルの更新状況を調べて、更新されていれば、当該ディレクトリのバックアップをtar.gz方式で行う。ファイル名には、後でその数を調整するためにバックアップ時の日付を識別子として付加しておく。
  4. 定期的に(例えば、1週間に1回)、バックアップ・ディレクトリに保存されているファイルの数を調べて、規定の数以上のファイルは古い順から削除する。
部分的バックアップ用のプログラム

次のようなスクリプトを書いて定期的にバックアップを行います。ここでは、自作プログラム・ファイルのバックアップを例にとって説明いたします。

#!/bin/sh
#文字コード=UTF-8
log=/var/log/prog_backup.log
#Backup元Directory
folder=/root/program
#Backup先Directory
bk_dir=/media/backup/test
#File Name Prefix
fname=program_backup
#現在の時刻を取得
ndate=`date "+%Y-%m-%d"`
echo "">>$log
echo "***** $fname *****">>$log
echo "開始 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log
#1日前までに変更されたファイルがなければ終了
num=`find $folder -type f -ctime -1 | wc -l`
if [ $num -eq 0 ]; then
 echo "変更されたファイルはありません。">>$log
 echo "終了 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log
exit 0
fi
#cd backup directory
cd $bk_dir > /dev/null 2>&1
if [ $? -ne 0 ]; then
 echo "ディレクトリが違います。">>$log
 echo "終了 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log
 exit 1
fi
tar czf $fname-$ndate.tar.gz $folder > /dev/null 2>&1
chmod -R 700 $bk_dir
echo  "$fnameを実施しました。" >>$log
echo "終了 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log

3行目:logを記録するファイルのパスを指定します。
5行目:Backup対象のディレクトリをフルパスで指定します。
7行目:Backup先のディレクトリのパスを指定します。ここではUSBハードディスクが使用されています。
9行目:Backupファイルのファイル名の接頭語を指定します。この接頭語は、後にファイルの属性を識別するために使用しますので保存ディレクトリとは異なる名前にしてください。
11行目:現在の時刻を取得します。バックアップファイルの識別子として使用します。
12~14行目:logに記述する内容の先頭部
16行目:バックアップ元のディレクトリ内のファイルの属性(更新時間、ファイル名やパーミッションの変更など)を調査し、変更されているファイルの数を変数に格納する。
17~21行目:変更されたファイルが存在しない場合には、その旨logに記述してプログラムを終了する。
23行目:バックアップ先ディレクトリに移動
24~28行目:移動が失敗(バックアップ先ハードディスクがマウントされていない、等)したら、終了。
29行目:$fname(ファイル名接頭語)+$ndate(現在の日付)をファイル名にしてtar+gzipで圧縮しバックアップファイルを作成するコマンドです。
30行目:セキュリティ確保のために、バックアップ・ディレクトリのパーミッションをrootのみのアクセスに限定します。
31~32行目:logに記述する内容の最後の部分です。

他のディレクトリのバックアップ用のプログラムは、3・5・7・9行目の変数を変更すれば作成できるようになっています。

このプログラムを定期的に実行するには、cronに登録します。以下の設定は毎日3時30分にプログラムを実行する設定です。

[root@localhost ~]# crontab -e
30 03 * * * /root/program/prog_backup.sh

このプログラムが正常に実行されれば、/root/programディレクトリのプログラム・ファイルの属性に変更があった場合にだけバックアップが実施されます。しかし、時間が経過するにつれてバックアップファイルの数が増えてきます。次のこのファイルの数を規定の数だけ残して古い順から削除するプログラムを紹介いたします。

部分的バックアップ・ファイルの調整プログラム
#!/bin/sh
#文字コード=UTF-8
log=/var/log/rm_sys-backup-file.log
#保存ファイル名Prefix
fname=program_backup
#BK対象ファイル名を一時保存しておくファイル
dummy="/root/temp/$fname.temp"
#BKUPディレクトリ名
bk_dir=/media/backup/program
#保留するファイルの数
hold_num=3
echo "">>$log
echo "**** $fname Expired ****">>$log
echo "開始 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log
#If directory wrong, exit
cd $bk_dir > /dev/null 2>&1
if [ $? -ne 0 ]; then
 echo "ディレクトリが違います。">>$log
 echo "終了 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log
 exit 1
fi
#if directory's files < $hold_num, exit
num=`find $bk_dir -name "$fname-*" | wc -l`
if [ $num -le $hold_num ]; then
 echo "ファイルの数が$hold_num以下です。">>$log
 echo "終了 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log
 exit 0
fi
diff=`expr $num - $hold_num`
nn=$diff
#対象ファイル名をソートして$dummyに出力
find $bk_dir -name "$fname-*" | sort > $dummy
while [ $diff -gt 0 ]; do
rm_file=`head -n $diff $dummy | tail -n 1`
rm -f $rm_file
diff=`expr $diff - 1`
done
echo "$fname バックアップファイルを古いものから$nn個削除しました">>$log
echo "終了 (`date '+%Y年%m月%d日 %H時%M分%S秒'`)">>$log

3行目:logファイルのパス
5行目:バックアップ時に指定したファイル名の接頭語を記入します。
7行目:バックアップファイル名を古い順にソートして保存する一時ファイルのパスを指定します
9行目:バックアップ先ディレクトリのパスを指定します。
11行目:保留するバックアップ・ファイルの数。
12~14行目:ログの内容の先頭部分
16行目:バックアップ先ディレクトリに移動
17~21行目:移動に失敗したら、その旨をログに出力して強制終了。
23行目:バックアップ先ディレクトリを検索して該当するファイル(バックアップ時に指定した接頭語を持つファイル)の数を変数$numに出力する。
24~28行目:ファイルの数が規定数以下ならば、終了。
26行目:存在するファイルの数から規定数の差を計算し、変数$diffに格納する。
29行目:$diffの値を変数$nnに退避(→後にLogで使用)。
32行目:バックアップ・ファイル接頭語で検索し、見付かったファイル名を昇順にソートして一時ファイルに格納する。
33~37行目:一時ファイルの上から$diff番目のファイル名を取得し、このファイルを削除する。この操作をファイルの数が規定数に達するまで繰り返す。
38~39行目:ログの出力

他のディレクトリのファイル数調整用プログラムは、3・5・7・9・11行目の変数を変更するだけで作成できます。

このプログラムを週に一回実行するようにcronに登録します。以下は、日曜日の4時35分に実行する設定です。

[root@localhost ~]# crontab -e
35 04 * * 0 /root/program/rm_prog_bk.sh

以上の2つのプログラムを実行すれば、バックアップ・ディレクトリに、時間の経過と共に新しいバックアップ・ファイルが保存されていき、その数は規定の数に制限されます(すなわち、ディレクトリの使用ボリューム・サイズをほぼ一定に保ちます)。


関連記事



コメントを残す




空欄に計算式を満たす数値を記入してください(必須)