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
# chmod +x backup.sh

3. バックアップ対象リスト作成

バックアップするディレクトリやファイルを一覧にしたファイル “backuplist” を以下のように作成する。(内容は適宜編集する。そして、最終行で改行しないこと)

File: backuplist

1 /home
2 /root
3 /var/www

4. バックアップ対象外リスト作成

バックアップ対象のディレクトリやファイルの中でもバックアップしたくないディレクトリやファイルを一覧にしたファイル “backupnolist” を以下のように作成する。(内容は適宜編集する。そして、最終行で改行しないこと。また、対象外にするディレクトリやファイルが無ければ作成しなくてよい)

File: backupnolist

1 /home/hoge
2 /var/www/fuga

5. バックアップ実行

以下のようにしてバックアップを実行する。

1
# ./backup.sh

バックアップディレクトリにアーカイブファイルが作成されるはずである。
また、ファイルが増えれば最大8世代残すようになっている。(そういうスクリプトにしているから)

1
2
3
4
5
6
7
8
9
# ls -l /home/bak/
-rw-r--r-- 1 root root 410671605  9月 30 05:16 2013 20130930backup.tar.bz2
-rw-r--r-- 1 root root 425441694 10月  1 05:14 2013 20131001backup.tar.bz2
-rw-r--r-- 1 root root 427763272 10月  2 05:16 2013 20131002backup.tar.bz2
-rw-r--r-- 1 root root 427990094 10月  3 05:15 2013 20131003backup.tar.bz2
-rw-r--r-- 1 root root 442118583 10月  4 05:17 2013 20131004backup.tar.bz2
-rw-r--r-- 1 root root 442686574 10月  5 05:13 2013 20131005backup.tar.bz2
-rw-r--r-- 1 root root 456433706 10月  6 05:16 2013 20131006backup.tar.bz2
-rw-r--r-- 1 root root 471558945 10月  7 05:15 2013 backup.tar.bz2

6. 自動実行設定

毎日定時に実行するよう cron 登録する。("/etc/cron.d/backup" を以下の内容で作成する)
以下は毎日午前5時にバックアップスクリプトを実行する例。

File: /etc/cron.d/backup

1 0 5 * * * root /root/backup.sh

参考サイト

CentOS での自動バックアップ運用を参考にしている(流用している)。


以上。