gmirror でRAID 1。実はバックアップ??なメモ
gmirror で RAID 1。
…という話題はもうどこにでも見られる話題でもあり鮮度としては低いのですが、1台のサーバのバックアップをまるごと取っておくために
gmirrorを使いました、というところが珍しい(?!)ページかも。
名前の通り、ソフトウェアRAID機能として、ハードディスクのミラーリングができるのは、ご存じの通りです。(このページに検索でたどり着いたということはそういうことでしょうから)
しかしこのページでは、まさかのための現時点のハードディスクをまるごとコピーするために、この機能を利用しましょう…という使い方なので、求める情報とは違っているかも知れませんが。fdiskしてmountしてdumpすればいいじゃん、というのはごもっともなんですけど。
作業した日時点の機器等の前提
今回は、FreeBSD 6.2-RELEASE-p3 の状態のマシンを使って作業を行います。
しかしながら、Fixit で利用するための CD-ROM は 6.2-RELEASE-p4 用を使いました。
IBM の DTTA-351010 10.1 GBが実際に導入しているハードディスク。5400rpmでATA100。
そんな余っていたお古のハードディスクで試していた品。Asterisk PBXを動かしているテスト機のハードディスクであります。
でも実際にOS上では、
ad0: 9671MB <IBM DTTA-351010 T56OA73A> at ata0-master UDMA33
とかしか認識していないや。古いハードディスクだなって感じで。
対する、ミラーリング(バックアップ)に使う側のハードディスクもそこそこ古い品物。
SEAGATE TECHNOLOGY の ST340016A 40GB。7200rpm で、ATA100。流体軸受けがあるらしい。
ad1: 38166MB <Seagate ST340016A 3.19> at ata0-slave UDMA100
などと表示されている。FreeBSD で ad0とかad1というのはどんな意味合いかというと、上記にも書かれている通り、どこのMasterなのかSlaveなのかという意味合いで数値が変わる。IDE/ATA
とかだと ad[0-3] になるし、シリアルATA(SATA)だと ad[4-7]になる。
表にするとこんな感じ。
| DEV |
規格 |
IDE 0/1 |
M/S |
| ad0 |
IDE |
Primary |
Master |
| ad1 |
IDE |
Primary |
Slave |
| ad2 |
IDE |
Secondary |
Master |
| ad3 |
IDE |
Secondary |
Slave |
|
|
|
|
| ad4 |
SATA |
Primary |
Master |
| ad5 |
SATA |
Primary |
Slave |
| ad6 |
SATA |
Secondary |
Master |
| ad7 |
SATA |
Secondary |
Slave |
上記のように、ad0 と ad1というのは、プライマリ側の マスターとスレーブに位置するケーブルに接続されたハードディスクという感じになっているわけです。本来だと、ad1
に接続されているものは ad2の位置にある方が都合がいいわけですけど、今回は目的がバックアップなんで、この辺りは無視して眺めてください。(セカンダリのマスタには別な機器がつながっているので外すのが面倒だっただけなんですけれど。)
ミラーリングの gmirror で好きな数だけレプリケート
FreeBSD 6.xには、カーネルをリコンパイルするなどの作業無く、gmirrorやgstripeを利用できます。
手間があまり掛からないでRAIDが使えるのは便利です。
gmirrorのマニュアルを眺めつつ、既に多くのサイトが情報を公開してくれていますので参考にしつつ作業をしてみることにしましょう。
さて、次に 準備した FreeBSD 6.2-p4 の CD-ROM (1)でブートして メニューで
Fixit を選択。
Fixit# chroot /dist
Fixit# mount_devfs devfs /dev
Fixit# gmirror load -v
Fixit# gmirror label -v -b split -s 4096 gm0 /dev/ad0
Fixit# gmirror insert -v gm0 /dev/ad1
これでシンクロナイズが開始する。要するにバックアップハードディスクが作り始めました。
gmirror list でもgmirror statusでも見ていて完了したら終わり。
Fixit# gmirror stop gm0
Fixit# gmirror clear ad0
Fixit# gmirror clear ad1
電源を落としてディスクを抜き取って完了、と。こんな流れで使えばいいはずです。
[蛇足だけど]そのままミラーで使うには…
マスターで使う方がいいと思うので、そういう場合には ad0 ad2またはad4 ad6という組み合わせで利用する方がいいと思います。一応
ad0 ad2とした例での手順。
FreeBSD 6.2-p4 の CD-ROM (1)でブートして メニューで Fixit を選択。
Fixit# chroot /dist
Fixit# mount_devfs devfs /dev
Fixit# gmirror load -v
Fixit# gmirror label -v -b split -s 4096 gm0 /dev/ad0
Fixit# gmirror insert -v gm0 /dev/ad2
これでシンクロナイズが開始。
gmirror list やgmirror statusで見てシンクロナイズがが完了したら終わり。
この後に、エディタでfstab他を編集。できれば事前にバックアップはとっておくべきだとは思うけど。
Fixit# mount /dev/mirror/gm0s1a /mnt
Fixit# edit /mnt/boot/loader.conf
eeは得意ではないけど、editは eeがあがるのでこれで作業。1行書くだけ。
geom_mirror_load="YES"
そんなのを使わずにいいじゃん、という人は、
echo geom_mirror_load=\"YES\" >> /mnt/boot/loader.conf
などでも同じだけど。
Fixit# edit /mnt/etc/fstab
で中身を変更。
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1e /tmp ufs rw 2 2
/dev/mirror/gm0s1f /usr ufs rw 2 2
/dev/mirror/gm0s1d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
こんな感じ。以前の物と比較するべく一応以前ものが以下。
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0
/dev/ad0s1a / ufs rw 1 1
/dev/ad0s1e /tmp ufs rw 2 2
/dev/ad0s1f /usr ufs rw 2 2
/dev/ad0s1d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
要するに、ad0 を mirror/gm0 と置き換えるだけ。
実際にあがってきたときには以下のようになってあがってきました。
GEOM_MIRROR: Device gm0 created (id=1191788215).
GEOM_MIRROR: Device gm0: provider ad0 detected.
GEOM_MIRROR: Device gm0: provider ad2 detected.
GEOM_MIRROR: Device gm0: provider ad2 activated.
GEOM_MIRROR: Device gm0: provider ad0 activated.
GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
Trying to mount root from ufs:/dev/mirror/gm0s1a
簡単だし、便利ですね。で、解除するには同様の手順で CD-ROMでブートして日本語キーボードに選択をし、メインメニューでFixit。
Fixit# chroot /dist
Fixit# mount_devfs devfs /dev
Fixit# gmirror load
Fixit# mount /dev/mirror/gm0s1a /mnt
ここで、上記と逆に fstabを元に戻す。
Fixit# edit /mnt/etc/fstab
Fixit# /
という感じで。終わったらもう mountしている必要がないので、
Fixit# umount /mnt
Fixit# gmirror stop gm0
Fixit# gmirror clear ad0
Fixit# gmirror clear ad2
これでちゃんとブートするかを確認。OKです。ちゃんとできました。