Mondo RescueでCentOS6のフル/増分バックアップを行う

ローカルCentOSサーバのイメージバックアップを行うためにMondo Rescueを使っています。フリーはあるものの歴史も安定性もあり、リカバリ実績もあるので重宝してます。
CentOSならインストールにyumを使えるので導入も簡単です。

Mondo Rescueのインストール

Mondo Rescueは専用レポジトリが用意されていますので、yumにrepoファイルを登録してインストールします。サーバ毎のダウンロード先詳細についてはDownload Mondo Rescueで確認してください。

レポジトリの公開鍵を組み込む

# wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mondorescue.pubkey
# rpm --import mondorescue.pubkey

CentOS6(64bit)用レポジトリファイル「mondorescue Vanilla Packages」をダウンロードしyumに登録する。

# wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mondorescue.repo
# cat mondorescue.repo
[mondorescue]
name=rhel 6 x86_64 - mondorescue Vanilla Packages
baseurl=ftp://ftp.mondorescue.org//rhel/6/x86_64
enabled=1
gpgcheck=1
gpgkey=ftp://ftp.mondorescue.org//rhel/6/x86_64/mondorescue.pubkey

# cp mondorescue.repo /etc/yum.repos.d/mondorescue.repo

mondorescueレポジトリを読み込んでいるか確認する

# yum check-update
読み込んだプラグイン:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
mondorescue                                              | 1.3 kB     00:00
mondorescue/primary                                      |  51 kB     00:01
mondorescue                                                             208/208

Mondo Rescueをインストールする。
※インストール結果を見てみるとepelレポジトリが必須なようです

# yum install mondo
依存性を解決しました

================================================================================
 パッケージ               アーキテクチャ
                                     バージョン           リポジトリー     容量
================================================================================
インストールしています:
 mondo                    x86_64     3.2.2-1.rhel6        mondorescue     925 k
依存性関連でのインストールをします。:
 afio                     x86_64     2.5-1.rhel6          mondorescue      81 k
 buffer                   x86_64     1.19-4.rhel6         mondorescue      24 k
 genisoimage              x86_64     1.1.9-12.el6         base            348 k
 mindi                    x86_64     3.0.2-1.rhel6        mondorescue     205 k
 mindi-busybox            x86_64     1.21.1-1.rhel6       mondorescue     291 k
 mtools                   x86_64     4.0.12-1.el6         base            194 k
 perl-IO-Interface        x86_64     1.05-2.el6           epel             28 k
 perl-Module-ScanDeps     noarch     0.95-2.el6           base             41 k
 perl-MondoRescue         noarch     3.2.2-1.rhel6        mondorescue      80 k
 perl-Net-IPv4Addr        noarch     0.10-6.el6           epel             16 k
 perl-ProjectBuilder      noarch     0.13.2-1.rhel6       mondorescue     130 k
 syslinux                 x86_64     4.04-3.el6           base            346 k
 syslinux-nonlinux        noarch     4.04-3.el6           base            584 k
 wodim                    x86_64     1.1.9-12.el6         base            369 k

完了しました!

バックアップファイルをISOイメージ化するためにmkisofsを導入する。
※今回は導入済でした。これも依存関係に出てくればいいのに。

# yum install mkisofs
パッケージ genisoimage-1.1.9-12.el6.x86_64 はインストール済みか最新バージョンで す
何もしません
フルバックアップ/増分バックアップスクリプトを作成する

Mondo Rescueをインストールしたら次にバックアップジョブを作成する必要があります。今回は以下のルールで作成します。

  1. 週1でフルバックアップ、他の日は増分バックアップを行う
  2. バックアップデータは4世代分残す
  3. バックアップデータは外部ファイルサーバに保存する
  4. 外部ファイルサーバは必要な時のみマウントする
  5. バックアップデータは光学メディア(BD-R)に保存できるようにする
  6. バックアップデータは日付・サーバ名・フル/増分が分かるファイル名にする

ということでまずはフルバックアップ用のスクリプトを作成します。

mondo_fb.sh

#!/bin/bash
# フルバックアップスクリプト

export LANG=C

# 各種変数定義
MAIL=mail@example.net # バックアップ結果のメール保存先
HOSTNAME=Server # バックアップデータに付与するサーバ名

# バックアップ保存先
DSTDIR=/mnt/backup         # 外部ファイルサーバをサーバのどこにマウントするか指定する
DSTSRV=//192.0.2.86/backup # 外部ファイルサーバのIPアドレス & ディレクトリなど
SRVUSR=backupuser          # ファイルサーバをマウントする際の認証ユーザ
SRVPASS=backuppass         # ファイルサーバをマウントする際のパスワード

# バックアップファイルの最大サイズ。この値を超えると次のファイルが作成される。
# DVD-Rは4gまたは4200m BD-Rは22g
ISOSIZE=22g

# バックアップファイル保持期間(日)
KEEP=21

# バックアップ領域にある自サーバ名のディレクトリをマウントする。(nfsの場合はcifsをnfsに変更する。)
mount -t cifs ${DSTSRV}/${HOSTNAME}/ ${DSTDIR} -o username=${SRVUSR},password=${SRVPASS}

# mondoarchiveコマンドでバックアップを作成し、実行結果からresult=0の文字を検索
# result=0の文字がある場合は、バックアップ正常と判断
# 正常異常ともに処理結果をメールで送信

# -OiはISOモード、-NはNFS除外、-dは保存先ディレクトリ、-Eは除外ディレクトリ、-sはサイズ。
if /usr/sbin/mondoarchive -OiN -d ${DSTDIR} -E ${DSTDIR} -s ${ISOSIZE} -p `date +%Y%m%d`_${HOSTNAME}_full | grep "result=0";
then
echo -e "Full backup succeed"
else
echo -e "Full backup Failed!!!! Type 'less /var/log/mondoarchive.log' to see the output log"| mail -s "[Warning] result of mondoarchive backup (${HOSTNAME})" ${MAIL}
fi

# バックアップディレクトリのファイルのタイムスタンプがKEEPで設定した日数以上前のものを自動削除する
find ${DSTDIR} -mindepth 0 -mtime +${KEEP} -exec rm -f {} \;

# バックアップ領域マウント解除
umount ${DSTDIR}

exit

次に増分バックアップ用のスクリプトを作成します。主な違いはmondoarchiveに増分バックアップを意味する-Dが追加されていることと、削除コマンドが無い事の2点です。
mondo_db.sh

#!/bin/bash
# 増分アップスクリプト

export LANG=C

# 各種変数定義
MAIL=mail@example.net
HOSTNAME=Server

# バックアップ保存先
DSTDIR=/mnt/backup
DSTSRV=//192.0.2.86/backup
SRVUSR=backupuser
SRVPASS=backuppass

# バックアップファイルの最大サイズ。この値を超えると次のファイルが作成される。
# DVD-Rは4gまたは4200m BD-Rは22g
ISOSIZE=22g

# バックアップ領域マウント
mount -t cifs ${DSTSRV}/${HOSTNAME}/ ${DSTDIR} -o username=${SRVUSR},password=${SRVPASS}

# mondoarchiveコマンドでバックアップを作成し、実行結果からresult=0の文字を検索
# result=0の文字がある場合は、バックアップ正常と判断
# 正常異常ともに処理結果をメールで送信

# -OiはISOモード、-NはNFS除外、-Dは増分バックアップ、-dは保存先ディレクトリ、-Eは除外ディレクトリ、-sはサイズ。
if /usr/sbin/mondoarchive -OiND -d ${DSTDIR} -E ${DSTDIR} -s ${ISOSIZE} -p `date +%Y%m%d`_${HOSTNAME}_diff | grep "result=0";
then
echo -e "Differential backup succeed"
else
echo -e "Differential backup Failed!!!! Type 'less /var/log/mondoarchive.log' to see the output log"| mail -s "[Warning] result of mondoarchive backup (${HOSTNAME})" ${MAIL}
fi

# バックアップ領域マウント解除
umount ${DSTDIR}

exit

スクリプトに実行権限を付与します。

# chmod u+x mondo_fb.sh mondo_db.sh

# ll
-rwx------  1 root root 1254  6月 17 17:22 2016 mondo_db.sh
-rwx------  1 root root 1484  6月 17 17:23 2016 mondo_fb.sh
バックアップスクリプトをCRONに登録する

スクリプトが動作することを確認したら、スケジュール実行するためにcronに登録します。実行時間がランダムで良ければ/etc/cron.dailyにバックアップスクリプトのシンボリックリンクを作成するだけで良いのですが、今回は実行時間を指定したいので/etc/cron.d/に実行ルールファイルを作成します。なおこのファイルに実行権限は不要です。

/etc/cron.d/mondobackup

## mondobackup full:sun 5:00AM diff:mon-sat 5:00AM
0 5 * * 0 root /root/script/mondo_fb.sh 1> /dev/null 2> /dev/null
0 5 * * 1-6 root /root/script/mondo_db.sh 1> /dev/null 2> /dev/null
世代管理ができているか確認する

1ヶ月経過してから4世代管理が正常に出来ているか確認します。

# mount -t cifs //192.0.2.86/backup/server/ /mnt/backup -o username=backupuser,password=backuppass

# ll /mnt/backup
-rwxr-xr-x 0 root root 2212679680  7月  3 05:45 2016 20160703_server_full-1.iso
-rwxr-xr-x 0 root root  438478848  7月  4 05:16 2016 20160704_server_diff-1.iso
-rwxr-xr-x 0 root root  444968960  7月  5 05:16 2016 20160705_server_diff-1.iso
-rwxr-xr-x 0 root root  445765632  7月  6 05:16 2016 20160706_server_diff-1.iso
-rwxr-xr-x 0 root root  480471040  7月  7 05:17 2016 20160707_server_diff-1.iso
-rwxr-xr-x 0 root root  481662976  7月  8 05:16 2016 20160708_server_diff-1.iso
-rwxr-xr-x 0 root root  512665600  7月  9 05:17 2016 20160709_server_diff-1.iso
-rwxr-xr-x 0 root root 2217545728  7月 10 05:44 2016 20160710_server_full-1.iso
-rwxr-xr-x 0 root root  475639808  7月 11 05:17 2016 20160711_server_diff-1.iso
-rwxr-xr-x 0 root root  482131968  7月 12 05:17 2016 20160712_server_diff-1.iso
-rwxr-xr-x 0 root root  484354048  7月 13 05:17 2016 20160713_server_diff-1.iso
-rwxr-xr-x 0 root root  486352896  7月 14 05:18 2016 20160714_server_diff-1.iso
-rwxr-xr-x 0 root root  642539520  7月 15 05:20 2016 20160715_server_diff-1.iso
-rwxr-xr-x 0 root root  643506176  7月 16 05:20 2016 20160716_server_diff-1.iso
-rwxr-xr-x 0 root root 2223144960  7月 17 05:49 2016 20160717_server_full-1.iso
-rwxr-xr-x 0 root root  485654528  7月 18 05:18 2016 20160718_server_diff-1.iso
-rwxr-xr-x 0 root root  486471680  7月 19 05:17 2016 20160719_server_diff-1.iso
-rwxr-xr-x 0 root root  520060928  7月 20 05:18 2016 20160720_server_diff-1.iso
-rwxr-xr-x 0 root root  521418752  7月 21 05:18 2016 20160721_server_diff-1.iso
-rwxr-xr-x 0 root root  522141696  7月 22 05:18 2016 20160722_server_diff-1.iso
-rwxr-xr-x 0 root root  522598400  7月 23 05:19 2016 20160723_server_diff-1.iso
-rwxr-xr-x 0 root root 2226511872  7月 24 05:45 2016 20160724_server_full-1.iso
-rwxr-xr-x 0 root root  456034304  7月 25 05:17 2016 20160725_server_diff-1.iso
-rwxr-xr-x 0 root root  457861120  7月 26 05:17 2016 20160726_server_diff-1.iso
-rwxr-xr-x 0 root root  459581440  7月 27 05:18 2016 20160727_server_diff-1.iso
-rwxr-xr-x 0 root root  494065664  7月 28 05:18 2016 20160728_server_diff-1.iso
-rwxr-xr-x 0 root root  531156992  7月 29 05:20 2016 20160729_server_diff-1.iso
-rwxr-xr-x 0 root root  531877888  7月 30 05:20 2016 20160730_server_diff-1.iso

# umount /mnt/backup/

正常に古いバックアップファイルを削除できているようです。
リストア手順については機会があったら追加しようと思います。無いのが一番なのですがw

※2017/7/12 追記

2017年6月末頃から「mondorescue Vanilla Packages」を利用しようとすると「warning: rpmts_HdrFromFdno: Header V4 RSA/SHA512 Signature, key ID 20ebfb0e: NOKEY」と公開鍵関係でエラーが出るようになりました。

Anacron job 'cron.daily' on server

/etc/cron.daily/0yum.cron:

warning: rpmts_HdrFromFdno: Header V4 RSA/SHA512 Signature, key ID 20ebfb0e: NOKEY
Error: The GPG keys listed for the "rhel 6 x86_64 - mondorescue Vanilla Packages" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.

詳細原因は不明ですが公開鍵の期限が切れているのではないかと思います。あまり薦められる手ではないのですが一時的に公開鍵のチェックをオフにしてyumを実行すればmondorescueのインストールを行うことができます。ただし鍵が違うということは、改ざんされている可能性があることに注意してください。

# vi mondorescue.repo
[mondorescue]
name=rhel 6 x86_64 - mondorescue Vanilla Packages
baseurl=ftp://ftp.mondorescue.org//rhel/6/x86_64
enabled=1
- gpgcheck=1
+ gpgcheck=0
gpgkey=ftp://ftp.mondorescue.org//rhel/6/x86_64/mondorescue.pubkey

また、yum完了後に「gpgcheck=1」に戻しておきましょう。