CentOS 6.5 - 自動バックアップ運用!

Updated:


前回は CentOS 6.5 サーバに Ruby 2.0 のインストール(ソースビルド)を行いました。
今回は自動バックアップ運用の設定を行います。

0. 前提条件

  • CentOS 6.5(x86_64) を Minimal で最小インストールしている。
  • クライントマシンは Linux Mint 14(64bit) を想定。
  • バックアップ先ディレクトリは “/home/backup” を想定。
  • バックアップファイルの暗号化は行わない。
  • 主に「CentOSで自宅サーバー構築」を参考にしている。
    (実際は、過去にこのサイトを参考にして作業した際に記録していたものを参照している)

1. バックアップスクリプト作成

バックアップアーカイブファイルの暗号化を行いたければ PASS にパスワードを設定すればよい。

File: backup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/bash

#
# ローカル内でバックアップ
#

LANG=C

#
# 設定開始
#

# バックアップ対象リスト名
# ※バックアップ対象をフルパスで記述したリスト
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit

# バックアップ対象外リスト名
# ※バックアップ対象外をフルパスで記述したリスト
BACKUPNOLIST=/root/backupnolist

# バックアップ先ディレクトリ名
BACKUPDIR=/home/backup
mkdir -p $BACKUPDIR

# バックアップ保存世代数
# ※当日分を含めた過去分バックアップを保存する世代数
# ※過去分バックアップを保存しない場合は1を指定する
BACKUPGEN=8

# 暗号化・復号化パスフレーズ
# ※指定がないときは暗号化しない
PASS=''

# バックアップログファイル名
BACKUPLOG=/var/log/backup.log

#
# 設定終了
#

# 異常終了処理関数定義
error_exit () {
    rm -f $TMPBACKUPNOLIST
    exit 1
}

# バックアップファイルをバックアップ対象外リストに追加
# ※バックアップ先ファイルをバックアップしないようにする
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo "$BACKUPDIR/*backup.tar.bz2" >> $TMPBACKUPNOLIST

# 前回バックアップをリネーム
cd $BACKUPDIR
OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
if [ -f $OLDBACKUPFILE ]; then
    TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
    mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
fi

# バックアップログファイル作成
rm -f $BACKUPLOG
touch $BACKUPLOG
chmod 400 $BACKUPLOG

# バックアップ実行
echo "`date` backup start" >> $BACKUPLOG
tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
code=$?
if [ $code -ne 0 ]; then
    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
    rm -f $BACKUPDIR/backup.tar.bz2
    error_exit
fi
echo "`date` backup end" >> $BACKUPLOG

# バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
if [ ! -z $PASS ]; then
    echo "`date` encrypt start" >> $BACKUPLOG
    mkdir -p $HOME/.gnupg
    echo $PASS|gpg --passphrase-fd 0 --batch -c $BACKUPDIR/backup.tar.bz2 > /dev/null 2>&1
	code=$?
	if [ $code -ne 0 ]; then
	    cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
	    rm -f $BACKUPDIR/backup.tar.bz2*
	    error_exit
	fi
    rm -f $BACKUPDIR/backup.tar.bz2
    echo "`date` encrypt end" >> $BACKUPLOG
fi

# バックアップ保存世代を超えた古いバックアップを削除
if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
    OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
    for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
    do
        rm -f $file
    done
fi

# バックアップ対象外リスト削除
rm -f $TMPBACKUPNOLIST

2. バックアップスクリプト権限設定

# chmod 700 backup.sh  # <= 実行権限付与

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

バックアップの対象となるディレクトリ・ファイルをバックアップ対象リストファイルに列記する。(最終行が改行のみにならないよう注意)
また、存在しないディレクトリ・ファイルを記載するとバックアップに失敗するので注意。(# などでコメント化しても効かない)
(以下は一例)

File: backuplist

1
2
3
4
5
6
7
/root
/etc/cron.d
/etc/dovecot/dovecot.conf
/etc/logrotate.d
/etc/my.cnf

  :

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

上記のバックアップ対象ディレクトリ内で、バックアップの対象から外したいディレクトリ・ファイルがあれば、対象外リストを作成する。(最終行が改行のみにならないよう注意)(バックアップの対象から外したいディレクトリ・ファイルがなければ作成不要)
(以下は一例)

File: backupnolist

1
2
3
4
5
/var/www/rails/mk-mode/log/
/var/www/rails/mk-mode/public/webcam
*.sock

  :

5. バックアップ実行

# ./backup.sh

6. バックアップ確認

バックアップスクリプト内で指定したバックアップ先にアーカイブファイルができているか確認する。
最大でバックアップスクリプトで指定した世代分アーカイブファイルが保存される。
最新が “backup.tar.bz2” で、これ以外は “yyyymmdd” + “backu.tar.bz2” である。(暗号化した場合は末尾に “.gpg” が追加される)

# ls -lh /home/backup
合計 14G
-rw-r--r-- 1 root root 1.6G 12月  8 05:51 2013 20131208backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月  9 05:50 2013 20131209backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月 10 05:51 2013 20131210backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月 11 05:58 2013 20131211backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月 12 06:01 2013 20131212backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月 13 06:01 2013 20131213backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月 14 06:03 2013 20131214backup.tar.bz2
-rw-r--r-- 1 root root 1.6G 12月 15 06:12 2013 backup.tar.bz2

    :

7. バックアップ内容確認

バックアップしたディレクトリ・ファイルの一覧は以下のようにして確認できる。

# tar tjvf /home/backup/backup.tar.bz2

8 バックアップ自動化

毎日決まった時間にバックアップスクリプトが実行されるよう cron 登録(”/etc/cron.d/backup” を作成)する。

File: /etc/cron.d/backup

1
0 5 * * * root /root/backup.sh  # <= 毎日 5:00 に自動実行

当方の場合は、このバックアップスクリプト以外にデータベースをダンプさせたりするスクリプト等も同じ cron に登録している。

9. リストア

リストアは以下のようにすればよい。
以下は、バックアップアーカイブファイル内から “/etc/my.cnf” というファイルをリストアする例。
-P オプションはファイル名の先頭から “/” を取り除かないオプションなので、同じディレクトリ構成でリストアされ、最新の実ファイルが上書きされるので注意。(特定のディレクトリ内にリストアしたければ、適当なディレクトリへ移動して -P オプションを付けずに展開する)

# tar jxvfP /home/backup/backup.tar.bz2 /etc/my.cnf

ちなみに、バックアップファイルを暗号化するようにしている場合は、以下のように一旦復号化してからリストアを行うことになる。

# gpg /home/backup/backup.tar.bz2.gpg

参考サイト


次回は、rsync で CentOS サーバを同期先としてファイル・ディレクトリを同期する方法について紹介する予定です。

以上。





 

Sponsored Link

 

Comments