Debian GNU/Linux 7.1.0 サーバに自動バックアップ運用を行う方法についての記録です。
以前古いバージョンでの作業時に残していた記録を参考に作業を行い、今回更新した作業記録を貼付する形式の内容となっています。
0. 前提条件
- Debian GNU/Linux 7.1.0 での作業を想定。
- バックファイルを配置するディレクトリは “/home/bak” とする。
1. バックアップスクリプト作成
以下のような内容でバックアップスクリプト “backup.sh” を作成する。
File: backup.sh
1 #!/bin/bash
2
3 #
4 # ローカル内でバックアップ
5 #
6
7 LANG=C
8
9 #
10 # 設定開始
11 #
12
13 # バックアップ対象リスト名
14 # ※バックアップ対象をフルパスで記述したリスト
15 BACKUPLIST=/root/backuplist
16 [ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit
17
18 # バックアップ対象外リスト名
19 # ※バックアップ対象外をフルパスで記述したリスト
20 BACKUPNOLIST=/root/backupnolist
21
22 # バックアップ先ディレクトリ名
23 BACKUPDIR=/home/bak
24 mkdir -p $BACKUPDIR
25
26 # バックアップ保存世代数
27 # ※当日分を含めた過去分バックアップを保存する世代数
28 # ※過去分バックアップを保存しない場合は1を指定する
29 BACKUPGEN=8
30
31 # 暗号化・復号化パスフレーズ
32 # ※指定がないときは暗号化しない
33 PASS=''
34
35 # バックアップログファイル名
36 BACKUPLOG=/var/log/backup.log
37
38 #
39 # 設定終了
40 #
41
42 # 異常終了処理関数定義
43 error_exit () {
44 rm -f $TMPBACKUPNOLIST
45 exit 1
46 }
47
48 # バックアップファイルをバックアップ対象外リストに追加
49 # ※バックアップ先ファイルをバックアップしないようにする
50 TMPBACKUPNOLIST=`mktemp`
51 [ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
52 echo "$BACKUPDIR/*backup.tar.bz2" >> $TMPBACKUPNOLIST
53
54 # 前回バックアップをリネーム
55 cd $BACKUPDIR
56 OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
57 if [ -f $OLDBACKUPFILE ]; then
58 TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
59 mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
60 fi
61
62 # バックアップログファイル作成
63 rm -f $BACKUPLOG
64 touch $BACKUPLOG
65 chmod 400 $BACKUPLOG
66
67 # バックアップ実行
68 echo "`date` backup start" >> $BACKUPLOG
69 tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
70 code=$?
71 if [ $code -ne 0 ]; then
72 cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
73 rm -f $BACKUPDIR/backup.tar.bz2
74 error_exit
75 fi
76 echo "`date` backup end" >> $BACKUPLOG
77
78 # バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
79 if [ ! -z $PASS ]; then
80 echo "`date` encrypt start" >> $BACKUPLOG
81 mkdir -p $HOME/.gnupg
82 echo $PASS|gpg --passphrase-fd 0 --batch -c $BACKUPDIR/backup.tar.bz2 > /dev/null 2>&1
83 code=$?
84 if [ $code -ne 0 ]; then
85 cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
86 rm -f $BACKUPDIR/backup.tar.bz2*
87 error_exit
88 fi
89 rm -f $BACKUPDIR/backup.tar.bz2
90 echo "`date` encrypt end" >> $BACKUPLOG
91 fi
92
93 # バックアップ保存世代を超えた古いバックアップを削除
94 if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
95 OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
96 for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
97 do
98 rm -f $file
99 done
100 fi
101
102 # バックアップ対象外リスト削除
103 rm -f $TMPBACKUPNOLIST
2. 実行権限付与
作成したスクリプトファイルに実行権限を付与する。
1
|
|
3. バックアップ対象リスト作成
バックアップするディレクトリやファイルを一覧にしたファイル “backuplist” を以下のように作成する。(内容は適宜編集する。そして、最終行で改行しないこと)
File: backuplist
1 /home
2 /root
3 /var/www
4. バックアップ対象外リスト作成
バックアップ対象のディレクトリやファイルの中でもバックアップしたくないディレクトリやファイルを一覧にしたファイル “backupnolist” を以下のように作成する。(内容は適宜編集する。そして、最終行で改行しないこと。また、対象外にするディレクトリやファイルが無ければ作成しなくてよい)
File: backupnolist
1 /home/hoge
2 /var/www/fuga
5. バックアップ実行
以下のようにしてバックアップを実行する。
1
|
|
バックアップディレクトリにアーカイブファイルが作成されるはずである。
また、ファイルが増えれば最大8世代残すようになっている。(そういうスクリプトにしているから)
1 2 3 4 5 6 7 8 9 |
|
6. 自動実行設定
毎日定時に実行するよう cron 登録する。("/etc/cron.d/backup" を以下の内容で作成する)
以下は毎日午前5時にバックアップスクリプトを実行する例。
File: /etc/cron.d/backup
1 0 5 * * * root /root/backup.sh
参考サイト
CentOS での自動バックアップ運用を参考にしている(流用している)。
以上。