自動バックアップ運用(tar+GnuPG)

最終更新日: 2017.02.18

<<トップページ <<新着情報 <<リンク集 <<サイト内検索 <<Scientific Linuxで自宅サーバー構築 <<Fedoraで自宅サーバー構築

■概要

Linuxサーバー内データの自動バックアップを行う。
ここでは、サーバー内データをtarコマンドで圧縮してバックアップ先ディレクトリへ退避しておき、指定により、退避したバックアップを管理者以外が参照できないようにGnuPGコマンドで暗号化もできるようにする。


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

(1)バックアップスクリプト作成
[root@centos ~]# 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=1

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

#
# 設定終了
#

# 後処理関数定義
cleanup () {
    rm -rf ${TMPBACKUPTO}
    rm -f ${TMPBACKUPNOLIST}
    rm -f ${BACKUPLOG}
}

# 異常終了処理関数定義
error_exit () {
    logger -t `basename ${0}` "backup aborted."
    cleanup
    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

# バックアップ実行
logger -t `basename ${0}` "backup started."
TMPBACKUPTO=`mktemp -d`
mkdir -p ${TMPBACKUPTO}
for i in `cat ${BACKUPLIST}`
do
    cp -a --parents $i ${TMPBACKUPTO}
done
BACKUPLOG=`mktemp`
tar cjvfP $BACKUPDIR/backup.tar.bz2 ${TMPBACKUPTO} -X $TMPBACKUPNOLIST > ${BACKUPLOG} 2>&1
code=$?
if [ ${code} -ne 0 ]; then
    # バックアップ異常時はroot宛に結果をメール通知する
    cat ${BACKUPLOG} | mail -s "BACKUP NG CODE IS ${code}" root
    rm -f ${BACKUPDIR}/backup.tar.bz2
    error_exit
fi
cat ${BACKUPLOG} | logger -t `basename ${0}`
logger -t `basename ${0}` "backup ended."

# バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
if [ ! -z ${PASS} ]; then
    logger -t `basename ${0}` "backup encrypt started."
    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
    logger -t `basename ${0}` "backup encrypt ended."
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

# 後処理
cleanup

exit 0

[root@centos ~]# chmod 700 backup.sh ← バックアップスクリプトへ実行権限付加

(2)バックアップ対象リスト作成
バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成する
[root@centos ~]# echo "/home" >> backuplist ← 例としてバックアップ対象リストに/homeディレクトリを追加

[root@centos ~]# echo "/root" >> backuplist ← 例としてバックアップ対象リストに/rootディレクトリを追加

[root@centos ~]# echo "/var/www" >> backuplist ← 例としてバックアップ対象リストに/var/wwwディレクトリを追加

(3)バックアップ対象外リスト作成
バックアップ対象ディレクトリ内のバックアップ対象外ディレクトリ、ファイルを登録したバックアップ対象外リストを作成する
※バックアップ対象外とするディレクトリ、ファイルがなければ作成しなくてもよい
[root@centos ~]# echo "/var/www/error" >> backupnolist ← 例としてバックアップ対象外リストに/var/www/errorディレクトリを追加

[root@centos ~]# echo "/var/www/icons" >> backupnolist ← 例としてバックアップ対象外リストに/var/www/iconsディレクトリを追加

[root@centos ~]# echo "/var/www/manual" >> backupnolist ← 例としてバックアップ対象外リストに/var/www/manualディレクトリを追加

(4)バックアップスクリプト確認
[root@centos ~]# ./backup.sh ← バックアップスクリプト実行

[root@centos ~]# 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)、バックアップ保存世代数で指定した分保存される。

(5)復号化確認※暗号化した場合のみ
[root@centos ~]# gpg /backup/backup.tar.bz2.gpg ← 復号化
gpg: 鍵輪「/root/.gnupg/secring.gpg」ができました ←最初の1回のみ表示される
gpg: CAST5暗号化済みデータ
パスフレーズを入力:  ← 暗号化・復号化パスフレーズ応答
gpg: 1 個のパスフレーズで暗号化
gpg: 警告: メッセージの完全性は保護されていません

[root@centos ~]# 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

(6)バックアップ内容確認
[root@centos ~]# tar tjvf /backup/backup.tar.bz2 ← バックアップディレクトリ、ファイル確認
バックアップしたディレクトリ、ファイルが一覧表示される

(7)バックアップ定期自動実行設定
[root@centos ~]# echo "0 5 * * * root /root/backup.sh" > /etc/cron.d/backup ← バックアップ定期自動実行設定追加
※毎日5:00にバックアップを実行する

(8)データベースバックアップとの連携
[root@centos ~]# echo "/backup/mysql" >> backuplist ← バックアップ対象リストに/backup/mysqlディレクトリを追加

[root@centos ~]# echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup ← 毎日5:00にデータベースバックアップ、バックアップの順に実行する

■バックアップ・リストア確認

バックアップからディレクトリ単位、ファイル単位でリストア(復元)できるか確認する

(1)テスト用ディレクトリ、ファイル作成
[root@centos ~]# touch /home/centos/test.cgi ← centosのホームディレクトリにテスト用ファイルを作成

[root@centos ~]# chmod 755 /home/centos/test.cgi ← 上記テスト用ファイルのパーミッションをCGIのように755に変更

[root@centos ~]# mkdir /home/centos/test ← centosのホームディレクトリにテスト用ディレクトリ作成

[root@centos ~]# cp /home/centos/test.cgi /home/centos/test/ ← 上記テスト用ディレクトリにテスト用ファイルコピー

[root@centos ~]# chown -R centos:centos /home/centos/ ← 作成したテスト用ディレクトリ、ファイルの所有者を変更

[root@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)バックアップ実行
[root@centos ~]# ./backup.sh ← バックアップスクリプト実行

(3)テスト用ディレクトリ、ファイル削除
[root@centos ~]# rm -rf /home/centos/test/ ← テスト用ディレクトリ削除

[root@centos ~]# rm -f /home/centos/test.cgi ← テスト用ファイル削除

[root@centos ~]# ll -R /home/centos/ ← テスト用ディレクトリ、ファイル削除確認
/home/centos/:
合計 0

(4)テスト用ディレクトリ、ファイル復元
[root@centos ~]# tar jxvfP /backup/backup.tar.bz2 */home/centos/test ← テスト用ディレクトリ復元
※一時ディレクトリに集約後にバックアップしているため、展開時は展開対象ディレクトリまたはファイルの先頭に*を付ける
/tmp/tmp.89c2ybeTP0/home/centos/test/
/tmp/tmp.89c2ybeTP0/home/centos/test/test.cgi

[root@centos ~]# /bin/mv /tmp/tmp.89c2ybeTP0/home/centos/test/ /home/centos/ ← 元の場所へ移動

[root@centos ~]# tar jxvfP /backup/backup.tar.bz2 */home/centos/test.cgi ← テスト用ファイル復元
※一時ディレクトリに集約後にバックアップしているため、展開時は展開対象ディレクトリまたはファイルの先頭に*を付ける
/tmp/tmp.89c2ybeTP0/home/centos/test.cgi

[root@centos ~]# /bin/mv /tmp/tmp.89c2ybeTP0/home/centos/test.cgi /home/centos/ ← 元の場所へ移動

[root@centos ~]# 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 ← テスト用ディレクトリ内ファイルがパーミッション、所有者も含めて復元されてる

(5)遠隔地バックアップ
ディスク故障や被災に備えて、バックアップデータを遠隔地へバックアップする。⇒遠隔地バックアップ



▲このページのトップへ戻る

LPIロゴ Copyright© 2005-2017 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします