2004年04月19日

Mondo Rescue ― システムを丸ごとバックアップ

サーバーのHDがクラッシュしてしまったら、あなたはどのように復旧するだろうか。一から構築しなおすだろうか? e-ueda も経験がある。以前、このコンテンツを提供しているサーバーがクラッシュしてしまったとき、一から構築した。RedHat Linux 7.3 で運用していたサーバーが壊れ「ええい、この際 Debian でいてまえ」と、3~4時間で作り直した。その時は、構築時の設定ファイルをWindowsマシン側に保存していたので、すぐに構築しなおせたわけだ。それでも RedHat と Debian の違いに少々苦しんだことは、正直に告白しよう。

しかし、やはり構築し直しは不安だらけで心臓に悪い。いつも絶対に数時間で構築しなおせる保障などないし、第一効率も悪い。

理想を言えば、ホットスワップ対応のRAIDユニットを搭載したサーバーがあればいいのだが、そんな金銭的な余裕もない。であれば、せめて、故障したときに何も考えず、一番効率の良い方法でリカバリーできる手法があれば、障害時の復旧も不安なく効率的に行なえる。

そこで、選んだ手法が「Mondo Rescue」だ。Mondo Rescue は、CDにシステムのイメージを焼くことができ、部分的な復旧も、システム全体の復旧もできる。製品でいえば NetJapan の Deploy Center や Norton の Gohst のようなものだ。

先日、実際に Mondo Rescue によるバックアップ作業をしてみたので、その作業メモをアップしておく。

● 必要なパッケージのインストール

下記のパッケージが必要となる。入っていなかったら、あらかじめインストールしておく。

# apt-get install afio buffer bzip2 lzop liblzo1 

CD に焼くので、下記のパッケージも必要となる。

# apt-get install mkisofs cdrecord

cdrecord をインストールする際、SUID で動作させるか聞かれる。普通はデフォルトのNoでいいだろう。

● Mondo Rescue のインストール

では Mondo Rescue のパッケージをインストールしてみよう。

# apt-get install mindi mondo

mindi というのは、Mondo Rescue で作成するイメージCDを、ブート可能にするために必要なパッケージだ。

● デバイスの準備

CD-R(W) ドライブが必要なのは言うまでもないが、これを cdredord で使用するには、SCSI接続の CD-R(W) ドライブか、ATAPI で接続されたCD-R(W) ドライブを、SCSI エミュレートで設定されたドライブが必要となる。(カーネル 2.6 では、もっとスマートにできるらしいが、ここでは触れない)

環境によって違うが、まずは下記のコマンドを打ってみる。

# cat /proc/scsi/scsi

ここで何も CD-R(W) ドライブが表示されなければ、手動で設定する必要がある。(認識され、設定されている方は、この部分を飛ばして構わない)まず dmesg コマンドの出力で、CD-Rドライブがどのデバイスで認識されているか確認する。もし hdc で認識されていれば、/etc/lilo.conf のデフォルトでロードされるカーネルの image セクションに次のように追記する。普通 hdc は IDE デバイスとして認識されてしまうので、これをSCSIサブシステムの管理下に置かなければならない。

append="hdc=ide-scsi"

そして、/dev 下にある cdrom を、SCSIデバイス名にリンクしてしまう。

# cd /dev
# ln -sf scd0 cdrom

次に、/etc/modutiles/aliases に、SCSI 関連のドライバをロードするように記述する。

alias scsi_hostadapter ide-scsi
alias scd0 sr_mod
options ide-cd ignore=hdc

scd0 というのは SCSI CD のデバイス名だ。編集・保存したら、下記のコマンドで設定を有効にする。

# update-modules

以上が済んだら再起動する。
再起動後、設定がうまくいっていれば、

# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: MITSUMI  Model: CR-4804TE        Rev: 2.4C
  Type:   CD-ROM                           ANSI SCSI revision: 02

のように認識しているだろう。

ここまでできていれば、cdrecord からも、CD ドライブが認識される。

# cdrecord -scanbus
Cdrecord 1.10 (i686-pc-linux-gnu) Copyright (C) 1995-2001 J g Schilling
Linux sg driver version: 3.1.25
Using libscg version 'schily-0.5'
scsibus0:
        0,0,0     0) 'MITSUMI ' 'CR-4804TE ' '2.4C' Removable CD-ROM
        0,1,0     1) *
        0,2,0     2) *
        0,3,0     3) *
        0,4,0     4) *
        0,5,0     5) *
        0,6,0     6) *
        0,7,0     7) *

ちょっと古いがタイプだが、e-ueda のサーバーについているCD-R ドライブだ。(中古市場では、書き込み速度が遅くてかまわなければ CD-RW ドライブが2000円ほどで手に入る)ここまでくれば、イメージCD作成の準備はすべてできたことになる。

● システムのバックアップ

まず、直接システムをCDに焼くのではなく、2台目のハードディスクに iso イメージを作成してみよう。これは cron などで設定すれば、夜中にでも iso イメージを定期的に作成できるメリットがある。iso イメージを作成してしまえば、CD に焼く作業はいつでも都合の良いときにできる。

2台目のハードディスクは、HARD OFF などの中古ショップで 4GB の HD が2000 ~ 3000円ほどで売られているので、こういう安価なものをバックアップ用の HDにすればよい。

では早速 iso イメージを作成してみよう。下記は2台目の HD を取り付けて、 /bk1 としてマウントしたところに、iso イメージを作成している例である。

# mondoarchive -O -i -L -d /bk1 -E "/bk1 /bk2 /mnt" -l LILO -f /dev/hda
       -k FAILSAFE -s 640m -F    (→実際には一行)

オプション -O は、バックアップを作成すること、-i は ISO イメージを HD に保存すること、-L は lzo 形式で圧縮することを指示する。-d はバックアップ先の指定。-E はバックアップ対象からはずす場所を指定する。当然バックアップファイルの作成先は除外しなければならない。複数指定する場合は空白で区切る。-l では、ブートローダーを、-f ではマスターブートレコードがインストールされているデバイスを明示する。-k でカーネルイメージへのパスを指定するが、Debian ではここを FAILSAFE としないと、CDブートに失敗するようだ。-s のあとにはisoイメージファイルの上限を指定する。

● ISO ファイルを CD に焼く

では、上記のイメージを CD に焼いてみる。 cdrecord -scanbus コマンドの出力結果にあわせて、次のように

# cdrecord -v speed=4 dev=0,0,0 -data 1.iso

いきなり焼くのが不安なら、オプション -dummy でエラーが出ないことを確認してから焼けばよいだろう。サイズに応じて 2.iso、3.iso ・・・とファイルができるので、順次焼いてほしい。

後は作った CD でブートしリカバリー作業をするだけだ。本当に元通りになるのか、検証結果は後日ここで報告するつもりだ。

Posted by e-ueda at 2004年04月19日 08:50