バックアップシステム構築
 

概要:Linuxサーバー内システムファイルやデータなどの自動バックアップを行います。(tar+GnuPG)
ここでは、サーバー内データをtarコマンドで圧縮してバックアップ先ディレクトリへ退避しておき、指定により、退避したバックアップを管理者以外が参照できないようにGnuPGコマンドで暗号化もできるようにします。 なお、サーバー内のバックアップはCronで定期的に自動で行うように設定します。

1. サーバー側(Linux)でのバックアップ設定

  1. ) バックアップスクリプト作成
    # vi backup.sh ← バックアップスクリプト作成
    
    #!/bin/bash
    
    #
    # ローカル内でバックアップ
    #
    
    LANG=C
    
    #
    # 設定開始
    #
    
    # バックアップ対象リスト名
    # ※バックアップ対象をフルパスで記述したリスト
    BACKUPLIST=/root/backuplist
    [ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit
    
    # バックアップ対象外リスト名
    # ※バックアップ対象外をフルパスで記述したリスト
    BACKUPNOLIST=/root/backupnolist
    
    # バックアップ先ディレクトリ名
    BACKUPDIR=/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 cjfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
    tar czfP $BACKUPDIR/backup.tar.gz -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1 ← gz方式の場合
    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
    
    ※tarのオプションについて
    c:新規作成
    j:bzip2形式で圧縮
    f:ファイルに出力
    P:ファイル名から先頭の'/'をを取り除かない。
    # chmod 700 backup.sh ← バックアップスクリプトへ実行権限付加
    
  2. ) バックアップ対象リスト作成 バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成する
    # echo "/home" >> backuplist ← 例としてバックアップ対象リストに
                      /homeディレクトリを追加
    # echo "/root" >> backuplist
    # echo "/var/www" >> backuplist
    
  3. ) バックアップ対象外リスト作成 バックアップ対象ディレクトリ内のバックアップ対象外ディレクトリ、ファイルを登録したバックアップ対象外リストを作成する。
    注:バックアップ対象外とするディレクトリ、ファイルがなければ作成しなくてもよい
    # echo "/var/www/error" >> backupnolist ← 例としてバックアップ対象外リストに
                           /var/www/errorディレクトリを追加
    # echo "/var/www/icons" >> backupnolist
    # echo "/var/www/manual" >> backupnolist
    

2. バックアップスクリプト確認

  1. ) バックアップスクリプト確認
    # ./backup.sh ← バックアップスクリプト実行
    # ls -lh /backup ← バックアップ先ディレクトリ照会
    合計 692K
    -rw-r--r--  1 root root 688K  6月 23 10:42 backup.tar.bz2.gpg
      ← バックアップファイル(暗号化した場合)
    -rw-r--r--  1 root root 688K  6月 23 10:42 backup.tar.bz2
      ← バックアップファイル(暗号化しない場合)
    
    注:最新バックアップのファイル名は/backup /backup.tar.bz2で、前回バックアップのファイル名は前日日付にリネームされ(例:/backup /20051126backup.tar.bz2)、7日間保存されます。

  2. ) 復号化確認(暗号化した場合のみ)
    # gpg /backup/backup.tar.bz2.gpg ← 復号化
    gpg: 鍵輪「/root/.gnupg/secring.gpg」ができました ←最初の1回のみ表示される
    gpg: CAST5暗号化済みデータ
    パスフレーズを入力:  ← 暗号化・復号化パスフレーズ応答
    gpg: 1 個のパスフレーズで暗号化
    gpg: 警告: メッセージの完全性は保護されていません
    # ls -lh /backup ← バックアップ先ディレクトリ照会
    合計 1.4M
    -rw-r--r--  1 root root 690K  6月 23 10:46 backup.tar.bz2 ← 復号化されている
    -rw-r--r--  1 root root 688K  6月 23 10:42 backup.tar.bz2.gpg
    
  3. ) バックアップ内容確認
    # tar tjvf /backup/backup.tar.bz2 ← バックアップディレクトリ、ファイル確認
    
    バックアップしたディレクトリ、ファイルが一覧表示されます。

3. バックアップ定期自動実行設定

  1. ) 定期自動実行設定
    クーロンにバックアップを定期自動実行するように設定を追加します。
    例:毎日5:00にバックアップを実行する場合。
    # echo "0 5 * * * root /root/backup.sh" > /etc/cron.d/backup
    
  2. ) データベースバックアップとの連携
    # echo "/backup/mysql" >> backuplist
      ← バックアップ対象リストに/backup/mysqlディレクトリを追加。
    # echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup
      ← 毎日5:00にデータベースバックアップ、バックアップの順に実行する。
    

4. バックアップ・リストア確認
 バックアップからディレクトリ単位、ファイル単位でリストア(復元)できるか確認しておきます。

  1. ) テスト用ディレクトリ、ファイル作成
    # su - apladmin
    $ touch /home/apladmin/test.cgi
    $ chmod 755 /home/apladmin/test.cgi
    $ mkdir /home/apladmin/test
    $ cp /home/apladmin/test.cgi /home/apladmin/test/
    $ ll -R /home/apladmin/
    # touch /home/centos/test.cgi ← centosのホームディレクトリにテスト用ファイルを作成
    
    # chmod 755 /home/centos/test.cgi
      ← 上記テスト用ファイルのパーミッションをCGIのように755に変更
    
    # mkdir /home/centos/test ← centosのホームディレクトリにテスト用ディレクトリ作成
    # cp /home/centos/test.cgi /home/centos/test/
      ← 上記テスト用ディレクトリにテスト用ファイルコピー
    # chown -R centos:centos /home/centos/
      ← 作成したテスト用ディレクトリ、ファイルの所有者を変更
    # ll -R /home/centos/ ← テスト用ディレクトリ、ファイル作成確認
    /home/centos/:
    /home/centos/:
    合計 4
    drwxr-xr-x  2 centos centos 4096 10月 27 14:19 test ← テスト用ディレクトリ
    -rwxr-xr-x  1 centos centos    0 10月 27 14:19 test.cgi ← テスト用ファイル
    
    /home/centos/test:
    合計 0
    -rwxr-xr-x  1 centos centos 0 10月 27 14:19 test.cgi ← テスト用ディレクトリ内ファイル
    
  2. ) バックアップ実行
    # ./backup.sh ← バックアップスクリプト実行
    
  3. ) テスト用ディレクトリ、ファイル削除
    # rm -rf /home/centos/test/ ← テスト用ディレクトリ削除
    # rm -f /home/centos/test.cgi ← テスト用ファイル削除
    # ll -R /home/centos/ ← テスト用ディレクトリ、ファイル削除確認
    /home/centos/:
    合計 0
    
  4. ) テスト用ディレクトリ、ファイル復元
    # tar jxvfP /backup/backup.tar.bz2 /home/centos/test ← テスト用ディレクトリ復元
    /home/centos/test/
    /home/centos/test/test.cgi
    # tar jxvfP /backup/backup.tar.bz2 /home/centos/test.cgi ← テスト用ファイル復元
    /home/centos/test.cgi
    # ll -R /home/centos/ ← テスト用ディレクトリ、ファイル復元確認
    /home/centos/:
    合計 4
    drwxr-xr-x  2 centos centos 4096 10月 27 14:19 test
      ← テスト用ディレクトリがパーミッション、所有者も含めて復元されること。
    -rwxr-xr-x  1 centos centos    0 10月 27 14:19 test.cgi
      ← テスト用ファイルがパーミッション、所有者も含めて復元されること。
    
    /home/centos/test:
    合計 0
    -rwxr-xr-x  1 centos centos 0 10月 27 14:19 test.cgi
      ← テスト用ディレクトリ内ファイルがパーミッション、所有者も含めて復元されること。
    
    ※tarの解凍先のオプションについて
    P:絶対パス(先頭の/が取り除かれない)で解凍(上記の場合)
    C:解凍先のDirectoryを指定する場合。圧縮ファイル名の後に解凍先を指定する。
    上記P,Cが無い場合カレントDirectoryに解凍
     
    前へ? 一覧へ 次へ

最終更新のRSS
Last-modified: 2014-04-11 (金) 02:08:26 (3658d)