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

提供:あわ自由帳

メインページ > Category:自宅サーバー > AlmaLinux 8 で自宅サーバー構築  > 自動バックアップ運用(tar+GnuPG)(AlmaLinux)

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

バックアップ設定

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

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

[root@host4 ~]# 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=/tmp/backup
rm -rf ${TMPBACKUPTO} ; mkdir -p ${TMPBACKUPTO}
for i in `cat ${BACKUPLIST}`
do
    cp -a --parents $i ${TMPBACKUPTO}
done
BACKUPLOG=`mktemp`
tar cjvfP $BACKUPDIR/backup.tar.bz2 -X $TMPBACKUPNOLIST ${TMPBACKUPTO} > ${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

※エラーが出るため、上記の行を下記のように変更しています。引数の順番を変えました。

tar cjvfP $BACKUPDIR/backup.tar.bz2 ${TMPBACKUPTO} -X $TMPBACKUPNOLIST > ${BACKUPLOG} 2>&1
↓
tar cjvfP $BACKUPDIR/backup.tar.bz2 -X $TMPBACKUPNOLIST ${TMPBACKUPTO} > ${BACKUPLOG} 2>&1

バックアップスクリプトへ実行権限付加

[root@host4 ~]# chmod 700 backup.sh

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

バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成する

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

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

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

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

バックアップ対象ディレクトリ内のバックアップ対象外ディレクトリ、ファイルを登録したバックアップ対象外リストを作成する
※バックアップ対象外とするディレクトリ、ファイルがなければ作成しなくてもよい

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

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

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

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

バックアップスクリプト実行

[root@host4 ~]# ./backup.sh

バックアップ先ディレクトリ照会

[root@host4 ~]# ls -lh /backup
合計 9.2G
-rw-r--r-- 1 root root 1.5G  7月  1 05:25 20190701backup.tar.bz2
-rw-r--r-- 1 root root 1.5G  7月  2 05:24 20190702backup.tar.bz2
-rw-r--r-- 1 root root 1.5G  7月  3 05:23 20190703backup.tar.bz2
-rw-r--r-- 1 root root 1.5G  7月  4 05:24 20190704backup.tar.bz2
-rw-r--r-- 1 root root 1.5G  7月  5 05:28 20190705backup.tar.bz2
-rw-r--r-- 1 root root 1.9G  7月  6 08:42 backup.tar.bz2
drwxr-xr-x 2 root root 4.0K  7月  6 05:00 mysql

※最新バックアップのファイル名は/backup/backup.tar.bz2で、前回バックアップのファイル名はバックアップ日付付にリネームされ(例:/backup/20051126backup.tar.bz2)、バックアップ保存世代数で指定した分保存される。

バックアップ内容確認

バックアップディレクトリ、ファイル確認

[root@host4 ~]# tar tjvf /backup/backup.tar.bz2
バックアップしたディレクトリ、ファイルが一覧表示される

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

バックアップ定期自動実行設定追加

[root@host4 ~]# echo "0 5 * * * root /root/backup.sh" > /etc/cron.d/backup

※毎日5:00にバックアップを実行する

データベースバックアップとの連携

バックアップ対象リストに/backup/mysqlディレクトリを追加

[root@host4 ~]# echo "/backup/mysql" >> backuplist

毎日5:00にデータベースバックアップ、バックアップの順に実行する

[root@host4 ~]# echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup

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

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

テスト用ディレクトリ、ファイルは、別サーバーに移動したバーチャルホストデータを使用する。

バックアップ実行

[root@host4 ~]# ./backup.sh

バックアップ内容確認

バックアップディレクトリ、ファイル確認

[root@host4 ~]# tar tjvf /backup/backup.tar.bz2
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.feedback.js
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.feedback.spinner.gif
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.feedlink.css
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.filewarning.js
・
・

バックアップしたディレクトリ、ファイルが一覧表示される

ディレクトリ復元

ディレクトリ削除

[root@host4 ~]# rm -fr /var/www/html/sudachinet.jp/w

ディレクトリ復元

[root@host3 ~]# tar jxvfP /backup/backup.tar.bz2 */var/www/html/sudachinet.jp/w
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.feedback.js
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.feedback.spinner.gif
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.feedlink.css
/tmp/backup/var/www/html/sudachinet.jp/w/resources/src/mediawiki/mediawiki.filewarning.js
・
・

元の場所へ移動

[root@host4 ~]# mv /tmp/backup/var/www/html/sudachinet.jp/w/ /var/www/html/sudachinet.jp/

復元確認

[root@host4 ~]# ls /var/www/html/sudachinet.jp/w/

CODE_OF_CONDUCT.md    cache                       mw-config
COPYING               composer.json               opensearch_desc.php
CREDITS               composer.local.json-sample  opensearch_desc.php5
FAQ                   docs                        phpcs.xml
Gemfile.lock          extensions                  profileinfo.php
Gruntfile.js          favicon.ico                 profileinfo.php5
HISTORY               htmlets                     resources
INSTALL               images                      serialized
LocalSettings.php     img_auth.php                sitemap
README                img_auth.php5               skins
RELEASE-NOTES-1.31    includes                    tests
RELEASE-NOTES-1.32    index.php                   thumb.php
SECURITY              index.php5                  thumb.php5
StartProfiler.sample  jsduck.json                 thumb_handler.php
UPGRADE               languages                   thumb_handler.php5
api.php               load.php                    vendor
api.php5              load.php5                   wiki.phtml
autoload.php          maintenance

ファイル復元

ファイル削除

[root@host4 ~]# rm -f /var/www/html/sudachinet.jp/w/LocalSettings.php

ファイル復元

[root@host4 ~]# tar jxvfP /backup/backup.tar.bz2 */var/www/html/sudachinet.jp/w/LocalSettings.php
/tmp/backup/var/www/html/sudachinet.jp/w/LocalSettings.php

元の場所へ移動

[root@host4 ~]# mv /tmp/backup/var/www/html/sudachinet.jp/w/LocalSettings.php /var/www/html/sudachinet.jp/w/