オフィシャルサイト: Mondo Rescue

Mondo Rescue

必殺仕事人の新シリーズが放送開始となった。たまたまちょうどいいタイミングで、主水でない「もんど」を紹介する。Mondo は、GNU の Linux ディザスターリカバリバックアップツールだ。mindi というブータブルメディア作成ツールを利用して、テープや CD-R や DVD などにライブシステムのイメージバックアップを採り、現在のマシン上に存在するお好みのカーネルで起動するブータブルメディアを作成してくれる。リストアは、そのブータブルメディアからブートして行なえるという優れもの。しかも、Automatic モード (nuke モード) を選択すれば、Enter キーのワンタッチだけで見事に全パーティションがリストアされる。また、高度な使い方をすれば、パーティションサイズやディスク形式の変更や、異種ファイルシステムへの引越し、クローニング、仮想環境への P2V にも活用できる。バックアップ/リストアの所要時間も、スピード狂の Symantec (Norton) Ghost には及ばないもののかなり速い。

Table of Contents

バックアップメディアについての考察

Mondo ではバックアップを、テープへはもちろん、複数個にスパンした CD/DVD イメージファイルとして保存することもできるし、CD/DVD に直接焼くこともできる。その他、USB ストレージをブータブル兼データメディアにしたり、NFS マウントをバックアップの書き出し先/リストア元にする機能もある。バックアップメディアは基本的にブータブルとなり、ブート機能をサポートしたテープドライブなら、バックアップテープからブートしてリストアを実行することも可能だ。また、バックアップメディアはテープにしたいけれどもテープデバイスがブータブル非対応という環境でも、バックアップの際にはブート専用の CDイメージも作成されるため、それを焼いて CDブートし、データはテープから読み込ませる、ということもできる。また、複数枚にスパンした ISOイメージファイルにバックアップをした時には、すべての ISO ファイルをメディアに焼かなくても、ブート専用 CD さえ焼いておけば、データはイメージファイルから直接読み取ってリストアすることもできる。

以上のことから、容量的にも一番有利なのは、ブータブル対応のテープドライブを備えることだ。ブータブルサポートでなくても、テープドライブがあるのはありがたいことだ。次に望ましいのは DVD の書き込める光学ドライブ。とはいえ、DVD 書き込みな可能ドライブを持った別のマシンへ SFTP など何らかの方法でイメージファイルを転送して焼けばいいので、当のマシンに必ずしも光学書き込みドライブがなければならないというわけでもない。

インストール

Mondo Rescue のダウンロードサイトへ行き、ディストリビューション毎のディレクトリから、自分のディストリビューションに合ったパッケージ () をダウンロードしてくる。yum の使える環境であれば、先に yum のレポジトリ設定ファイル (各ディストリビューションディレクトリにある mondorescue.repo ファイル) をインストールしておいて yum で直接引いてくるとラクだ。

もっとこだわるなら、mondo-doc パッケージ以外は、ソースRPM を落としてきて対象マシン上でコンパイルすればベストなパフォーマンスが得られる (ただし、プラットフォームが x86_64 の場合はわざわざコンパイルするのはあまり意味なし?)。その場合、mindi 1.x2.x 系ではコマンド書式が変更になっていたりするため、なるべく最新のものどうしを組み合わせだほうがいい。

※ Fedora Core 3 で Mondo Rescue を使用した際には、RHEL4 用の rhel/4/ にあるものをインストールして成功した。fedora/3/ ディレクトリにあるものはあまりにもバージョンが古くて、バックアップに時間がかかったり使いにくいのではないかと思ったためだ。

RedHat 系なら、必要なのは以下のパッケージだ。

mondo Mondo 本体。
mindi :実行しているOS のカーネルやモジュール、ライブラリなどを巧妙にピックアップして、機能リッチながら小型のブータブルメディアを作成するツール。"MINi DIstribution" をもじった名前らしい。
mindi-busybox :名前の違うシンボリックリンク経由で呼ぶことによって cat, ls, cp, mount, tar など主なシェルユーティリティの何にでもなるという省スペース・マルチパーパスツール。
afio cpio フォーマットのアーカイブを操作するユーティリティ。cpiotar より信頼性が高いらしい。
buffer :その名の通り、バッファを生成するプログラム。Mondo においては、テープにバックアップデータを書き込む際に使用されているようだ。
mondo-doc :[オプション] Mondo のドキュメント一式。これはアーキテクチャに依存しないので、バイナリパッケージでよい。
mindi-kernel-2.6.tgz :[オプション] 自前のカーネルではどうしてもブータブルメディアからブートできない時用のフェイルセーフカーネル/モジュールセット。RedHat 用 のインストールパッケージは存在しないようなので、必要ならばソースTar をダウンロードしてパッケージを作ってインストールする。
ソースパッケージからビルドする場合

mondo, mindi, mindi-busybox, afio, buffer*-src.rpm ファイルをゲットしてビルドを行なう。本当は root 以外の一般ユーザで行うのが良い。可能なら RPM の記事 を参照して挑戦してみてほしい。が、ここでは説明を簡略にするため root で実行する時のコマンド例を書いている。 ソースパッケージは /var/tmp/mondo/ に格納したと仮定する。

パッケージビルド;

root# cd /var/tmp/mondo
root# rpmbuild --rebuild mondo-X.X.X-X.xxx.src.rpm

更に最適化して i686 用のパッケージを作りたいなら、`--target i686-redhat-linux' も挟むといい。正常にビルドできれば、/usr/src/redhat/RPMS/iX86/ 下に (一般ユーザでビルドした場合はそれなりの場所に) バイナリパッケージができる。mondo 以外のパッケージも同様に。

mondo, mindi, mindi-busybox, afio, buffer のすべてがビルドできたら、*-debuginfo パッケージ以外を一気にインストールする;

root# cd /usr/src/redhat/RPMS/iX86
root# rm -i *-debuginfo-*.rpm
root# rpm -ivh --nosignature *.rpm

フェイルセーフカーネルもインストールする場合は、以下の手順に従う。仮に、/var/tmp/mondo/ で事前準備を行うものとする。mindi-kernel のソースには SPECファイルは格納されているのだが、親ディレクトリが格納されていないため、このようなちょっと面倒くさい行程を踏まなくてはならない;

root# cd /var/tmp/mondo
root# mkdir mindi-kernel-2.6
root# cd mindi-kernel-2.6
root# tar xzvf ../mindi-kernel-2.6.tgz
root# cd ..
root# mv mindi-kernel-2.6.tgz{,.org}
root# tar czvf mindi-kernel-2.6.tgz mindi-kernel-2.6/
root# cp mindi-kernel-2.6.tgz /usr/src/redhat/SOURCES
root# cd /usr/src/redhat
root# rpmbuild -tb --clean --rmsource SOURCES/mindi-kernel-2.6.tgz

そうしてビルドツリーの iX86/ にできた mindi-kernel-2.6.iX86.rpm を、インストールする。

使用準備

Mondo, mindi に、設定の類はほとんど必要ない。いじる可能性があるとすれば、mindi がブータブルメディアに含めるファイルやコマンドを規定する /etc/mindi/deplist.txt くらいか。それも、どうしてもチューニングしてみたいという時以外さわることは滅多にないだろう。

バックアップの実行

Mondo のバックアップ実行コマンドは、mondoarchive という。簡単に言えば、mindi を然るべきパラメータでキックしてブータブルディスクイメージファイルを作り、ファイルシステムのバックアップを採り、それを前記のブータブルメディアと合体させて、ブートからリストアまで全ての機能を備えたおまかせメディアを作るプログラムだ。

mondoarchive コマンド

主なコマンドラインオプションには以下のものがある。差分バックアップも可能らしいが、ここでは触れない。コマンド例は後述の「実際的なバックアップ手順」の中で述べよう。

オプション 説明
必須オプション
-O バックアップを行う。
-V バックアップアーカイブと現ファイルシステムとの比較検証を行う。-O と同時に使用すると、バックアップ後にベリファイが行われる。
-c speed バックアップ先を CD-R とする。ライト・アット・ワンス (write-at-once) 式なので使用済みのメディアへの追記は不可。
-w speed バックアップ先を CD-RW とする。書き込み前にメディアの消去が行われる。
-r バックアップ先を DVD とする。書き込み速度は外部プログラム growisofs によって自動決定される。
-i バックアップ先を ISOファイルとする。
-t バックアップ先をテープとする。
-n URI NFS マウントへバックアップする。NFS共有は、mondo が自動的にマウントしてくれるわけではないので、事前にマウントしておく必要がある。URIalpha:/var/backup のような形式で、マウント時に指定したリモート URI と同一でなければならない (-d オプションも参照のこと)。書き出されるのは ISO イメージファイルで、-s オプションで規定しないと CD と同じく 650MB でスパンされる。-E オプションも参照のこと。
-U バックアップ先を USBマスストレージ (USBメモリやUSBハードディスク) とする。書き出し先のデバイス (下記 -d オプションで指定) はブータブルにされる。デバイス上の既存のデータは全て抹消される点に注意!
-d file バックアップ先とするデバイスまたはディレクトリの指定。mondoarchive の man を読むと必須オプションでないように見えるが、バックアップ時には必ず付けないとエラーになる。バックアップ先がテープ、CD-R(W), DVD, USBマスストレージの時は /dev/sr0 のようなデバイス名。ISOファイルの場合は格納先ディレクトリを絶対パスで指定。NFS の場合は、-n で指定したリモート URI からの相対ディレクトリを指定 (リモート URI 直下の場合は `/' を指定)。
必須でないオプション
-s size バックアップ先を ISOファイルや CD/DVD とする時に、メディア 1枚あたりの最大サイズを規定する。収まりきらなければ次のファイルへスパンされる。`700m' のように、m (メガ)、g (ギガ) での指定ができる。指定しなければバックアップ先指定オプションからデフォルト値が自動決定されるが、ISO ファイル及び CD メディアの場合のデフォルトは 650MB なので注意。ラージサイズCD の場合は `700m'、DVD用 ISOファイルを作りたい時には `4480m' を指定してやるとよい。テープの時はそもそも指定の必要がない。
-o テープへバックアップする時、テープをブータブルにする。ブータブル化には OBDR 規格 (One Button Disaster Recovery) が使用される。ブートするにはテープドライブハードウェアも OBDR に対応している必要がある。
-k file ブータブルメディア作成時に使用するカーネルを指定。内部的には、mindi に渡されるパラメータとなる。指定しなければ mondoarchive 実行時にシステムで使われているカーネルイメージが使われるが、別のものを使わせたい時に指定する (システムにインストールされているものでなければならない)。file には /boot/vmlinuz-2.6.18-1.1.16.el5 のように、カーネルイメージをフルパスで指定。また、フェイスセーフカーネルセット がインストールしてあれば `-k FAILSAFE' を指定するとそれを使わせることができる。
-l boot 現システムで使用されているブートローダーを指定。Mondo はリストア時にブートローダーの再インストールを行うからだ。通常は自動検出に任せれば問題ない。サポートしている引数は GRUB, LILO, ELILO, RAWRAW だけは特殊で、ブートセクタがバイト単位でバックアップされるようだ。
-S path スクラッチディレクトリ。mondoarchive が ISOイメージを作成する時に使用する一時ディレクトリをフルパスで指定する。実際に使用されるディレクトリは、path/mondo.scratch.xxxx/mondo.scratch.yyyy/ のようなものとなる。指定しないとルート (/) 直下にこうしたディレクトリが作られて格好が悪いので、指定した方がよい。指定するディレクトリはあらかじめ作っておかないとエラーになる。
-T path テンポラリディレクトリ。こちらは ISO作成以外の作業データ用に使用される一時ディレクトリ。ランダムな拡張子の付いたサブディレクトリが作成されるのも上記 -S 同様。指定しないとルート (/) 直下にこうしたディレクトリが作られて格好が悪いので、指定した方がよい。指定するディレクトリはあらかじめ作っておかないとエラーになる。
-E path バックアップから除外するパスを指定。ただし、バックアップ先 (-d オプションで指定) とスクラッチディレクトリ (-S) 及びテンポラリディレクトリ (-T) は自動的に除外されるので、指定する必要性はあまりない。また、/sys, /proc などの疑似ファイルシステムとリムーバブルデバイスも自動的に除外される。ただし、NFSマウントへバックアップ (-n オプション) する場合、そのマウントポイントは自動的には除外されないので、この -E で除外指定するか下記 -N オプションを使う必要がある。複数指定する場合は `-E "/some/path /another/path"' のように全体をクォーテーションで囲みパスはスペース区切りで書く。逆に、パスが単一の時はクォートするとうまく機能しないので注意。指定したパス配下も再帰的に除外対象となる。パス文字列の最後に / を付けるとおかしな事になるのでやめておくこと。`-E /dev/sda3' のようにディスクパーティションデバイスを指定して、パーティション丸ごと除外することも可能。
-N リモートマウントされたネットワークファイルシステム (NFS, SMB, Coda, VMFS, AFS ACFS, Netware) はバックアップしない。
-I path -E とは逆に、インクルードするパスを指定したい場合に使用する。mondoarchive はデフォルトでは / (及びマウントされているその配下全て) をバックアップ対象とみなすが、このオプションを指定すると、path で指定したディレクトリ (とその配下) やパーティションだけをバックアップする。-E の説明も参照のこと。
-[0-9] バックアップアーカイブ作成時の圧縮レベル。0=圧縮なし ~ 9=最大圧縮率。検証の結果、今日日の CPU処理能力なら、圧縮率を高めた方が所要時間が短いようだ (特にテープをバックアップ先にする場合)。mondoarchive は基本的に bzip2 フォーマットで圧縮を行うが、gzip に切り替える -G というオプションもある。
-g バックアップ行程を GUI で進める。GUI とはいってもテキストとターミナルカラーを使った簡易的なものなので、X-Window を気にする必要はない。

実際的なバックアップ手順

あとで、mondorestore を簡単に使えるようにするシェルスクリプトを紹介するが、まずは Mondo の骨格を理解するため具体的なコマンドを挙げて説明する。

TIP: Mondo は約32MB を超えるサイズのファイル (large file) を、通常ファイル (regular file) とは別のフェイズでバックアップする。もしバックアップ対象マシン上に不要な CD/DVDイメージファイルや大きなアーカイブファイルなどが保管したままになっているなら、それらを削除しておいたほうがバックアップ所要時間が短縮できる。

まず、確実なバックアップを採るためシステムをシングルユーザモードに落とす。デフォルト run レベルを 3 にしている場合は、X-Window からログアウトしてから行った方が安全 (デフォルト run レベル 5 の場合はしかたがない)。`su -' でなく、root で入り直してからやればさらに安心;

root# init 1

環境を整え直す;

root# cd /root
root# . .bashrc

予期しないサービスが上がったままになっていないか確認;

root# ps axw

バックアップ先をファイルでなくメディアにする場合は、このあたりでテープなり CD/DVD メディアなりを装填しておく。

テープの場合、念のため巻き戻しをする (しなくても mondoarchive がやってくれるようだが);

root# mt -f /dev/nst0 rewind

NFS共有へバックアップする場合、いろいろとやることがある。マウントオプションは、できれば /etc/fstab に書いておきたい (詳しくは NFSのページを参照)。NFSv3 の場合であれば;

root# service network start
root# service portmap start
root# service nfslock start
root# mount /path/to/mountpoint

いよいよバックアップの実行。例を 3つ示そう。

mondoarchive -Oi -s 700m -g -d /var/cache/mondo -9 \
-S /var/mondo/scratch -T /var/mondo/tmp
/var/cache/mondo/mondorescue-1.iso ブータブルイメージファイルに、最高圧縮率でバックアップを採る。ISO ファイルは 700MB でスパンされ、複数枚に及ぶ場合には mondorescue-2.iso, ...-3,iso のように連番で作られる。DVDサイズの ISOイメージファイルにしたければ -s の引数を 4480m にすればよい。
mondoarchive -Ot -g -d /dev/st0 -9 \
-S /var/mondo/scratch -T /var/mondo/tmp
前記の書き出し先をローカルテープドライブにしたパターン。
mondoarchive -O -n alpha:/var/data -d /mondorescue -s 700m \
-g -9 -S /var/mondo/scratch -T /var/mondo/tmp -E /mnt/nfs
NFSサーバ alpha/var/data/ をローカルの /mnt/nfs/ にマウントしてあり、/mnt/nfs/mondorescue/ にバックアップを出力する場合。

あくまでも目安だが、標準的な構成でインストールした RHEL 5.2 あるいは CentOS 5.2 (ともにデータのほとんどない運用開始前の状態) で、アウトプットは CD x 2 ~ 3枚分、所要時間 20~50分というところ。簡素な Fedora Core 3 ベースのサーバをバックアップした時には、DVDイメージサイズ約 2.5G のアウトプットで所要時間は 50分弱だった。

バックアップデータを含んだ最終的なブータブルメディアの他に、mindi によって書き出されたブータブルCD イメージが /var/cache/mindi/ にできる。最小限のサイズだが (経験上 20MB 前後)、リストアのための設定ファイルや実行ファイルも入っていて、こちらを焼いた CD からブートしてリストアを実行することもできる。

失敗にしろ、成功にしろ、ログは /var/log/mondoarchive.log と、mondoarchive からコールされた mindi のログ /var/log/mindi.log に残るので、デバグや研究に活用すべし。

バックアップのスクリプト化 (drfullback)

ディザスターリカバリバックアップは、運用中に何回か繰り返すことになるだろう。そのたびに上記の長ったらしい mondoarchive のコマンドを手作業で発行するのは間違いの元なので、シェルスクリプトを組んでみた。

※ 2010/11/12 更新: 0.9.4<- 0.9.3a

drfullback シェルスクリプト のやること -

使うには、drfullback/usr/bin かどこか、シングルユーザモードでも PATH の通る場所に置き、実行ビットを立てて、同ディレクトリに drfullback へのシンボリックリンク mondoclean を作れば OK だ。

ある程度の汎用性は備えたが、最後の mondoarchive をキックするところは幾分かオプションを直接書いているので、バックアップの要件によってカスタマイズしていただきたい。NFS共有へバックアップしたい場合には、マウント処理も書いてしまうというのも手かもしれない。

今のところ drfullback には引数はない。実行は必ず root 権限で行う。sudo を挟むこともちょっと頭をかすめたが、mondoarchive のドキュメントによると、DVD に直接書き込む場合 growisofs プログラムが sudo を受け入れない (?) ため書き込みができないらしいし、シングルユーザモード中に sudo するというのもナンセンスだからだ。

リストア

Mondo のリストアプログラムは mondorestore コマンドだが、バックアップ時に作成された Mondo レスキューメディアからマシンをブートすれば自動的に起動するので、手動で打ち込む機会はあまりない。

マシンの起動に使うのは、バックアップデータを含むブータブルメディアでもいいし、最低限のツールのみを含むブータブルイメージ /var/cache/mindi/mondorescue.iso を焼いたものでもどちらでもいい。

基本

Mondo Rescueブータブルメディアから起動すると、

boot:

というプロンプトになる。単に Enter キーを押せば(※)、自動的に mondorestore が起動して下図の GUI メニューが出る。リストア前にいろいろと細工をしたい場合は、boot プロンプトで `expert' と打ち込むとシェルの状態で留まる。その場合は、準備ができたところで手動で mondorestore とコマンドすれば、下記と同じ画面になる。

Mondo 1.x ではここで interactive とか nuke などと打ち込む必要がある。

Automatically がかつての nuke モードにあたり、全自動で、ディスクパーティションのクリア、パーティションの再作成 (再作成されるパーティションのサイズは元のサイズとは微妙に異なることがあるが気になるレベルではない)、フォーマット、フルリストアが行なわれる。通常はこれを選ぶ。Mondo はバックアップ時のパラメータをレスキューメディア内に全部記憶しており、バックアップ時の書き出し先がテープであれ CD であれ、勝手に見つけて見事にリストアしてみせる。特に面白いのが NFSマウントへバックアップした場合で、バックアップ時と同じ IP アドレスをインターフェイスにセットした上でバックアップ時と同じ NFS サーバのディレクトリを /tmp/isodir/ にマウントしてそこからバックアップデータの ISO ファイルを読み取ってリストアするところまですべて全自動。こうしたパラメータのほとんどは、ブート時に展開されるファイルシステム上の /tmp/mondo-restore.cfg に書かれているようだ。

Interacively は、パーティションサイズの変更や部分リストアなどもできるが、よく分かっていない人が使うとたいていはろくなことにならない、慣れの必要なモードだ。リストア先のディスクデバイス構成がバックアップ元と異なっていたり、パーティションサイズをきめ細かく指定したり任意に変更したりしたい場合にはこれを使用する。Tips の項で例を挙げている。

Compare only! は、バックアップアーカイブ内のデータと現在ハードディスク上にあるファイルシステムとを比較する。

Exit to shell を選んだ時や、リストアで致命的なエラーが起こった際には、画面がシェルプロンプトに戻る。もう一度上記のメニュー画面を出すには mondorestore とコマンドを打てばいい。

リストアが完了した時もシェルプロンプトに戻る。exit と打てばリブート、halt と打てば停止する。

なお、リストア後初めてのブート時には、「数千日もチェックが行なわれていない」という理由で fsck が走ろうとする。ここは素直に y を答えて (runレベル 5 の場合は自動)、ディスクチェックを走らせてやる。

Tips

バックアップ元とリストア先とでディスクデバイス構成が大幅に異なる場合

例えばソフトウェアRAID構成のマシンからそうでないマシンへの引越しを行う場合など、あまりにもディスク構成が異なると、Interactive モードの中のマウントリストエディタでも対応できない場合がある。そういう時は、Mondo Rescueブート時の boot プロンプトで `expert' と入力してシェルに入り、RAMディスク上の /tmp/mountlist.txt を先に編集しておく。編集には vi が使用できる。ソフトウェアRAID からそうでないマシンへデータをリストアする際の要点を簡単にまとめると、

  1. /tmp/mountlist.txt/dev/md* を移行先のディスクデバイス (/dev/hda1 など) に書き換える。元のRAID構成実デバイスだった /dev/hd* 等はエントリから消しておく。サイズは、後で移行先環境に合わせて自動計算されるのでここで修正する必要はない。
  2. `mondorestore' と打ち込む。
  3. マウントリストエディタでサイズの確認や調整を行う。
  4. データのリストアを通常通りに進める。
  5. ブートローダのイニシャライズはとりあえず行わせる。
  6. 「initrd の再作成を行うべきだ」とアラートが出るので OK する。続くアラートでもう一度 OK を押すと、リストア後のルートパーティション (/) へ chroot した状態でのシェルプロンプトになる。
    1. /etc/fstab, /etc/mtab, /etc/modprobe.conf (必要なら), /boot/grub/grub.conf, /boot/grub/device.map (必要なら) を修正する。
    2. /etc/raidtab, /etc/mdadm.conf*.old などにリネームする。
    3. (必要であれば) パーティションにラベルを付け直す。確認コマンド例: `e2label /dev/hda1'、ラベル付けコマンド例: `e2label /dev/hda1 /1'。SWAP にラベルを付け直したい場合は SWAP を作り直す - コマンド例: `mkswap -L SWAP-hdc1 /dev/hdc1'
    4. initrd を作り直す。
      コマンド例: `mkinitrd -f -v /boot/initrd-2.6.18-194.el5.img 2.6.18-194.el5'
    5. ブートローダ (grub) を再インストールする。コマンド例: `grub-install /dev/hda'
    6. `exit' でシェルを抜ける。
  7. 「マウントリストの変更をしたか、もしくはクローン目的か」と訊かれるので Yes を返答し、ブートデバイスを確認して OK
  8. ここで否応なしに 「fstab, mtab, device.map, grub.conf を編集せよ」と言われるが、先ほど既に編集済みなので確認だけ行う。
  9. 「ext2/ext3/ext4 パーティションのラベル付け/ラベル確認をするか」と訊かれるが、当手順では先に設定済みので不要。