ATA RAIDカードで散々苦労した結果、「RAID1にhardwareなんて不要です。偉い人には(ry」と悟った.
たとえRAID I/Fが認識されても、Promise FastTrax TX2000とHGST HDT722525DLAT80 のように互換性問題を起こす可能性や、安いRAID I/FはほとんどSoftware RAIDと変わらないらしいので、それならFreeBSDのSoftware RAIDの方が余程信頼が置けると判断した.
ただし、RAID5/6ならハードウェアRAIDの方が良い。OSがクラッシュした際にRAIDカードが正常作動していれば、各ドライブで一貫性のあるデータを保持する事ができる。ソフトウェアでRAID5を行うと、OSクラッシュ時にドライブ間での一貫性を保つ事が困難で、被害が大きくなると予想されるため.
RAID1ではほぼ同時に2つのドライブに書き込むため、ソフトウェアRAIDでもOSクラッシュ時の影響は少ない.
そこでFreeBSDでソフトウェアRAIDを構築する方法を調べてRAID1を構築した。以下にその方法を示す.
注意点
ここで説明する方法では、boot Managerと共存する事ができず、必ず標準のStandard MBRが必要となる.
サーバとして稼働させるなら問題にならないが、Desktop PCなどでOSの使い分けをしたいのなら、それなりに工夫する必要がある。
【追記】ここでfdisk partitionは1つしか作ってはならない。Standard MBRはmulti partitionを扱う事が出来ず、ブート時に
Invalid partitionというエラーを出して止まってしまう。
disk0(ad0)にboot Managerと他のOS(Linux, Win*等)をインストールした後に、残りのATA/SATA diskにFreeBSDとMBRをインストールすれば可能ではないかと思われるが、確かめていないので保証はできない。
またすでにFreeBSDをboot managerとインストールしてしまった場合には、後に述べる方法でStandard MBRをインストールする事で可能になる。
またATA100/133の場合、ATA I/Fを2つも使ってしまうので光学ドライブ(CD-ROM, CD-R, DVD, DVD-R等のドライブ)が使えなくなる。
新しくHDDを買って構築するなら、SATA HDDをお勧めする。
( 光学ドライブはそれなりに電力を消費するので、サーバでは外しておく方が望ましい )
GEOMとは
GEOMとは、FreeBSD5.0から取り入れられたディスクのモジュール式フレームワークである。このフレームワークはディスクを操作するプログラムの為に作られている.今回作成するsoftware RAID1も、このGEOMフレームワークで実現されている.
[6/1/2007追記]
なお、FreeBSD amd64 6-STABLEでもこの方法でSofware RAIDを作れる事を確認した。
作業手順
1. ハードウェアの用意
同じHDDを2台準備し、それぞれ別のATAバスにつなぐ.(SATAは必ずそうなるので、心配無用)
ここでは、ad0 と ad2 につなげたとする。
2. 片方のディスク(ad0)に、普通にFreeBSDをインストールする。
boot managerをインストールしないように注意.
3. ad0からブートさせてみる.
ここでRAID以外の問題を解決しておく.自信があれば、このステップを飛ばしても良い.
4. mirror deviceを作成する
インストーラからは、Alt-F4でシェルのコマンドラインに出る。すでにブートしていれば、そのまま作業して良い.
[ 3/12/07 追加 ]
インストーラからAlt-F4でshが使えるのは、FreeBSDのインストールが終わり、インストーラのメニュー画面まで戻ってきた後である。リブートは必要ない。
以下はすべてrootで作業する.
% su
Password:
# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
... これでGEOM関連の操作が可能になる.
# gmirror label -v -b round-robin gm0 /dev/ad0
Metadata value stored on /dev/ad0
Done.
....ミラーディスクgm0が作成され、ad0が加わった.
# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
....これで起動時にGEOMのミラーデバイスが認識される。
5. /etc/fstabを書き換える
gmirrorによって、/dev/ad0s1* → /dev/mirror/gm0s1* と置き換わるので、/etc/fstabを
修正する必要がある。viを使って書き直せば良いのだが、sedでの書き換え方法を以下に示す.
# cd /etc
# cat fstab ...... 元のfstabの内容は以下の通り
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0
/dev/ad0s1a / ufs rw 1 1
/dev/ad0s1g /home ufs rw 2 2
/dev/ad0s1d /usr ufs rw 2 2
/dev/ad0s1f /usr/obj ufs rw,async 0 0
/dev/ad0s1e /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
md /tmp mfs rw,-s128m 0 0
# mv fstab fstab.bak ......... 以前のfstabをとっておく
# sed "s/ad0/mirror\/gm0/g" < fstab.bak > fstab
. ....."ad0"と"mirror/gm0"を置き換える事で、新しいfstabを作成する.
# cat fstab ...... 確認のため表示(見やすいように列を揃えている)
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1g /home ufs rw 2 2
/dev/mirror/gm0s1d /usr ufs rw 2 2
/dev/mirror/gm0s1f /usr/obj ufs rw,async 0 0
/dev/mirror/gm0s1e /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
md /tmp mfs rw,-s128m 0 0
#
この方法はシステムが壊れかけたときに有効であった.vi, ex, edなどエディタ全てが使えなくなったのだが、sedだけは利用可能で復旧できた.サーバトラブルでこんな事が起きる可能性は十分にある。必要なくともこういう方法がある事を覚えておいた方が良い.
元々400SCで使うために作ったHDDを、古いPentium2のPCで起動させようとしたところ、"Illegal instruction"などのエラーが多発して、どうにもならなくなった事があった。問題はそのHDDにインストールされていたFreeBSDがPentium4用(/etc/make.confで設定する) にコンパイルされていた物だったので、Pentium2には無い命令が
使われていたようである。このときviを起動しようとしても、"Illegal instruction"で落ちてしまう。最後の手段としてsedを使ったら、これは運良くPentium4の命令を使っておらず、なんとか復旧させる事に成功した。
6. リブート
問題なければ、起動時に以下のようなブートメッセージを見る事ができる。
GEOM_MIRROR: Device gm0 created (id=xxxxxxxxxxxx).
GEOM_MIRROR: Device gm0: provider ad0 detected.
GEOM_MIRROR: Device gm0: provider ad0 activated.
GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
GEOM_MIRROR: Device gm0 already configured.
Mounting root from ufs:/dev/mirror/gm0s1a
7. ディスクの追加、RAID-1の完成
起動したら、正しく動作しているか確認する.
% df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/mirror/gm0s1a 495 86 369 19% /
devfs 0 0 0 100% /dev
/dev/mirror/gm0s1g 107477 32461 66417 33% /home
/dev/mirror/gm0s1d 59503 4748 49994 9% /usr
/dev/mirror/gm0s1f 989 285 624 31% /usr/obj
/dev/mirror/gm0s1e 59503 6599 48143 12% /var
/dev/md0 123 1 111 2% /tmp
devfs 0 0 0 100% /var/named/dev
swapは、swapinfoで確認できる。
% swapinfo
Device 1K-blocks Used Avail Capacity
/dev/mirror/gm0s1b 3145728 120 3145608 0%
次に、ミラーディスクである/dev/ad2を追加する.
# gmirror insert gm0 /dev/ad2
GEOM_MIRROR: Device gm0: provider ad2 detected.
GEOM_MIRROR: Device gm0: rebuilding provider ad2.
これでad2がgm0に追加され、自動的にミラーリングが行われる.進捗状況は、
# gmirror statusで見る事ができる。このまま数時間動作させているとミラーリングが終了する。その間、リブートや電源断が必要でない作業はそのまま行えるので、必要に応じて作業して構わない.
トラブルへの対処
1. Boot managerをインストールしてしまった。
FTNSも良くやってしまうのだが、必要も無いのにBoot managerをインストールしてしまう事がある.これはインストーラのfdiskの後でbootする方法を選択する際に、Boot managerの上にカーソルが乗っているのでついついRETURNを押してしまうためである.
この状況をなんとかする方法は2つある:
1-1. fdiskを使う方法
この方法は大変危険な方法なので、以下の文章を読んで不安を感じるなら、次の方法(インストーラを使う方法)をお勧めする。
standard MBRは /boot/mbr である。よってfdiskで書き込んでやれば良い。具体的には
# fdisk -B -b /boot/mbr /dev/ad0
で良い。single user modeでないとエラーになる。また、fdiskが聞いてくる選択肢を誤って答えてしまうと、ディスクの中身を消してしまうので厳重注意。
1-2 インストーラを再度使う方法
インストーラから抜けてしまっていたら、rootで
/usr/sbin/sysinstallを実行すればインストーラを使う事ができる。(以前のバージョンでは、
/stand/sysinstallであった)
またOSがマトモに立ち上がらず手も足も出なくなったら、インストールCDからブートすればそのままインストーラが起動する。
(なお、以下の画面ダンプはクリックすれば拡大表示される)
インストーラが立ち上がると、この画面が表示される。
ここの、Configure Do post-install configuration of FreeBSD を選択し、[ Select ]を押す。
この画面では、インストール後に各種設定などを行うことができる。
Fdisk The disk Slice (PC-style partition) Editorを選択して[ OK ]を押す。
ここでは、fdiskで操作するドライブを指定する。
なおStandard MBRにするのはFreeBSDをインストールしたディスクのみで良い.。他方のディスクには
後のミラーリングでMBR(Master Boot bRock)領域もコピーされるためである。
ここでは、ad0にFreeBSDがインストールされているとするので、[ ad0 ]を選択し、
[ OK ]を押す。
ここではパーティション関連の操作を行う事ができるが、ここは"W"を押すだけである.
注意:余計な操作をすると、ディスク上のデータを失うことがある。
前の画面でWを押すと、Boot managerをインストールするか否かを聞いてくるので、
Standard Install a standard MBR (no boot manager)
を選択し、[ OK ]を押すと、Standard MBRがインストールされる。
ここでうっかり間違えてBootMgrを押してしまったら、最初からやり直せばよい。
2. ミラーを作成した後に、ブートが失敗する。
ブートが失敗する要因は、以下の2つである。
- standard MBRが無いため、/dev/mirror/gm0 が存在しない
- /etc/fstab が間違っている
- /boot/loader.confが正しくない
よって、起こっている現象を観察して、上記の問題を解決する方法を探す事になる。
以下では、実際に起こるブート失敗画面の説明と対処法を述べる。
Mounting root from ufs:/dev/gm0s1a
setrootbyname failed
ffs_mountroot: can't find rootvp
Root mount failed: 6
Manual root filesystem specification:
: Mount using filesystem
e.g. ufs:da0s1a
? List valid disk boot devices
Abort manual input
mountroot>
これはブートしようとしたパーティションが見つからない事によって起きる。
ここで
? を押すと、GEOMが把握しているパーティションが表示されるので、適切なルートパーティションを選択して、ブートさせる。なお通常rootパーティションは"a" パーティションであるから、
/dev/ad0s1a, /dev/mirror/gm0s1aなどが該当のパーティションである。
mountroot> ?
List of GEOM managed disk devices:
mirror/gm0s1f mirror/gm0s1e mirror/gm0s1d mirror/gm0s1c mirror/gm0s1b
mirror/gm0s1a mirror/gm0s1 ad2s1 mirror/gm0 ad0s1 ad2 acd0 ad0 fd0
mountroot> ufs:/dev/mirror/gm0s1a
なお上記の画面ではRAID1パーティションであるmirror/gm0s1aなどが表示されているが、ここで表示されない場合はStandard MBRがインストールされていないか、gmirrorを使った設定に誤りがあるたか、
/boot/loader.confが間違っているためである。
次に起こり得るブート失敗は、ルートパーティションのマウントには成功した物の、その後で/etc/fstabにあるパーティションがマウントできないという場合である。
(様々なエラーが大量に出る.)
Automatic file check failed; help!
Dec 12 23:08:24 init: /bin/sh on /etc/rc terminated abnormally, going to single
user mode.
Please enter full pathname of shell or RETURN for /bin/sh :
(なお、上記メッセージは記憶に頼って書いているので、実際とは多少異なる。)
ここで shellを起動すると、シングルユーザモードで作業ができる。この場合/etc/fstabに間違いがあるためなので、viなどで修正すれば良い。ただし、root以外はマウントされていないので、
mountを使って手動で/usrや/varなどをマウントしないとviは使えない。どのパーティションに何が入っているかわからなくなったら、
/etc/fstabや、そのバックアップを参考にする。
3. 以前sofware RAIDで使っていたHDDで再度RAIDが作れない
パーティションサイズを間違えたなどの理由で再インストールする際、
そのままだとRAIDが作れず、ブートしようとしても様々な現象が起こる事がある。
これは、HDDにRAIDのメタ情報が残っているためである。よって、以下のコマンドで
メタ情報をすべてのディスクから消去すればよい。
# gmirror clear /dev/ad0
# gmirror clear /dev/ad2