ヘルプ:自動バックアップ運用(tar+GnuPG)(CentOS8)
メインページ > ヘルプ:目次 > ヘルプ:自宅サーバー構築(CentOS8) > 自動バックアップ運用(tar+GnuPG)(CentOS8)
Linuxサーバー内データの自動バックアップを行う。
ここでは、サーバー内データをtarコマンドで圧縮してバックアップ先ディレクトリへ退避しておき、指定により、退避したバックアップを管理者以外が参照できないようにGnuPGコマンドで暗号化もできるようにする。
バックアップ設定
※tarの挙動が変わったようで、バックアップ対象外リストは使えません。
バックアップスクリプト作成
バックアップスクリプト作成
[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 ${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 ${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/
