書いてる途中
FreeBSDでRAID1(ミラーリング)しましょう。こいつは Solaris DiskSuite に 匹敵するスグレもんです。
まず、RAID1でのミラーについて概念をおぼえておかないと操作の意味がちん ぷんかんぷんなのでこれを理解しましょう。そのまえに、ミラーリングは ディスクを多重化することによって、その一つがイカれても元気な方だけで ちゃんとデータを保持できるようにするというものです。vinumでHDDのパーティ ションを多重化するときには、電池の並列繋ぎをイメージすると良いでしょう。 電池が壊れやすかったとしましょう。
////----→(+)端子へ | +----+----+ (+) (+) | |A B| | (-) (-) +----+----+ ////------(-)端子へ
てな風にやっとけば電池A、電池Bどちらかが壊れてもだいじょうぶ。 ああ安心。概ねこれで良いです。が、一つ不便なことが。これだと、
「1.5Vしか使えないやん」
という不満を感じます。感じなさい! HDDでいえば、小さいディスクを くっつけてでかいディスクにして使いたいってことがあるでしょ。
てことで、さっきの並列装置を改良しましょう。電池をそのまま繋ぐんじゃ なくて、直列電池ボックスにしましょう。
////----→(+)端子へ | +-----+-----+ +--(+)--+ +--(+)--+ | | | | | | | | | | | | | | | | | | | | +--(-)--+ +--(-)--+ +-----+-----+ ////------(-)端子へ
はい。これで、電池ボックスを6本タイプにすれば9Vに、12本タイプにすれば 18Vに。さらに電池ボックスを3セット用意すれば、3重化になります。
はい、vinumでは
という3つの層で管理します。乾電池の場合、1.5V(or 1.2V)と相場は決まっ てますが、ハードディスク(のパーティション)はサイズがまちまちです。 ついでにいうと、べつに10GB空いてたからって10GBまるまる使わなきゃいけない という決まりは無いわけです。てことで、「空いてるパーティションから 好きなだけの容量をちぎって持って来たもの」をsubdiskだと考えます。 ここで比喩の話からvinumに忠実に用語を定義すると、
となり、volumeが実際に利用できるファイルシステムとなります。てことで、 vinumを利用してRAIDミラーを組みたいときは、
という手順になります。まあ、今回はミラー化するときの話題なので、 同じplexを2本作るという前提で操作例を考えましょう。
実際にミラー化ファイルシステムを作る手順は以下のようになります。
「おっと、70GBのパーティションが2つ余っちまった。じゃあこれで ミラー化したファイルシステムでも作るかー」
ってことがあったとしましょう(随分無理がありますな)。ad0とad2に こういうパーティションがあったと…
# disklabel ad0 : g: 143713410 12582912 4.2BSD 2048 16384 89 # (Cyl. 783*- 9728*) : これと # disklabel ad2 : g: 143713410 12582912 4.2BSD 2048 16384 89 # (Cyl. 783*- 9728*)
こんな全く同じサイズの ad0s1g と ad2s1g がありました。じゃあこれを使 いましょう。まず、ディスクラベルエディタで、これらのパーティションの属性 を変えましょう。この例だと 4.2BSD とありますが、これを vinum に書き換え ます。
# disklabel -e ad0
これで、エディタが起動するので
g: 143713410 12582912 4.2BSD 2048 16384 89 # (Cyl. 783*- 9728*)
の部分を
g: 143713410 12582912 vinum 2048 16384 89 # (Cyl. 783*- 9728*)
に書き換えます。ad2のパーティションについても同様です。
さて、いよいよvinum登場。コマンドラインから
# vinum start
でvinumがシステムに組み込まれます。が、忘れないうちに次にリブートした
ときに自動的にvinumがロードされるように /etc/rc.conf
に
以下の行を追加しておきましょう。
start_vinum=YES
ではコマンドラインに戻り、vinumを操作しましょう。
# vinum
プロンプトが変わります。
vinum ->
ではvolumeを作ります。このときに、ミラー状態をどのように作るか 頭の中に図を書いておくと分かりやすいでしょう。今回はこんな感じ。
30GB | volume +-----+-----+ plex| plex| +--(+)--+ +--(+)--+ |+-----+| |+-----+| || (a) || || (b) || ||30GB || ||30GB || ||sub- || ||sub- || || disk|| || disk|| |+-----+| |+-----+| +-------+ +-------+ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 [d0] +-----------------+-----------------+ ad0s1g | 30GB (a) | 未使用 | +-----------------+-----------------+ [d2] +-----------------------------------+ ad2s1g | 30GB (b) | 未使用 | +-----------------------------------+
vinum用に予約した /dev/ad0s1g, /dev/ad2s1g をvinumの ``drive'' として登録します。このときに、/dev/ad0s1g とか /dev/ad2s1g の名前 をずっと使うのは面倒なので、driveに登録するときにはそれぞれに分か りやすい名前をつけます。``taro'' と ``hanano'' でも構いませんが、 それだと余計分かりにくくなるという説もあるので、それぞれ ``d0'' と ``d2'' という名前にしておきます。vinumプロンプトでcreateと入力しま す。
vinum -> create
エディタ(デフォルトでvi)が起動します。ここに各ドライブに 名前をつけて登録します。こんな感じに記入。
drive d0 device /dev/ad0s1g drive d2 device /dev/ad2s1g
色を変えて表記した部分は時と場合によって
変わります。逆にいうと drive, device
は必ずそういう風
に打つ「キーワード」です。さて、ファイルを保存&終了(viなら :wq
[RET])すると、しゃかしゃかっとHDDのアクセスランプがついてvinum情報
が書き込まれます。本当に登録できたか見てみましょう。vinum で list
とタイプします(l だけでも可)。
vinum -> list 2 drives: D d0 State: up Device /dev/ad0s1g Avail: 69080/69080 MB (0%) D d2 State: up Device /dev/ad2s1g Avail: 69080/69080 MB (0%) 0 volumes: 0 plexes: 0 subdisks:
よっしゃ、できました。
さー、概念の説明では、subdiskをつくって、それを組み合わせて plex, それを組み合わせて volume, という風に進みましたが、実際には 一気に進みます。先ほどの30GBパーティションの図を樹形図風に書くと
[30GB-volume] | +----[30GB plex] | | | +--[30GB subdisk] | +----[30GB plex] | +--[30GB subdisk]
てな感じになるので、これをイメージしてcreate作業をします。 作りましょう。まず、作りたい30GBパーティションの名前を考えます。と いうか普通は作りたいファイルシステムの名前が決まってるのが先ですね。 ここでは、ホームディレクトリ用のパーティションを作ろうとしてました。 ってことにして下さい。はい、納得。
ということで、[30GB-volume]は home と名付けることにします。 じゃ、上記の樹形図をそのまま反映する形で create します。 やはり、vinumプロンプトでcreateと入力します。
vinum -> create
エディタが起動するので、30GB-volume(home)を、plex2つで組み立て ます。ついでに、各plexは1個のsubdiskから構築します。それを作るの が以下の宣言です。
volume home plex org concat sd drive d0 length 30g plex org concat sd drive d2 length 30g
volume
- volume名を指定してvolumeを作成します。
plex
- plexを作成します。orgオプションにはplex
の構成タイプを指定します。concat が単純連結で、普通にミラーリング
するときにはこれを利用します。concat以外の構成タイプには、
striped, raid5 がありますが、使うときに覚えましょう。plexを
作るときには、「どのvolumeに属するのか」という指定を本来書く
必要がありますが、直前の行がvolume作成であれば省略できます。
ついでに、plexにも好きな名前を指定することもできますが、直前
の行がvolume作成ならそのvolume名に応じてplex名を適当につけて
くれます。任せた方が便利です。
sd
- subdiskを作成します。driveオプションに続い
て、容量の確保元となるdrive名を指定します。lengthオプション
に続いて確保したい容量を指定します。mをつけるとMB、gをつける
とGBになります。
書き終わったら保存してエディタを終了します。またまたアクセスラ ンプがついてHDDにvolume情報が書き込まれます。
vinumプロンプトで l (list) してみましょう。うまくできていれば このようになります。
vinum -> list 2 drives: D d0 State: up Device /dev/ad0s1g Avail: 38360/69080 MB (56%) D d2 State: up Device /dev/ad2s1g Avail: 38360/69080 MB (56%) 1 volume: V home State: up Plexes: 2 Size: 30720 MB 2 plexes: P home.p0 C State: up Subdisks: 1 Size: 30720 MB P home.p1 C State: up Subdisks: 1 Size: 30720 MB 2 subdisks: S home.p0.s0 State: up PO: 0 B Size: 30720 MB S home.p1.s0 State: up PO: 0 B Size: 30720 MB
でけた。C-d
をタイプしてvinumを抜けます。
vinumで作成したボリュームは、/dev/vinum/vol/ボリューム名
というデバイスファイルで利用できます。まずは、newfs から。
vinum ボリュームをnewfsするには -v オプションをつけます。
# newfs -v /dev/vinum/vol/home # tunefs -n enable /dev/vinum/vol/home
これを普通に mount すればおしまい。
# mount /dev/vinum/vol/home /home
fstabにも書いときましょう。
vinumに限らず、RAID-1ミラーリングをしているときは、ミラーリングの構成 を作ることよりも、障害が起きたときにHDDを入れ換え、ミラーリング状態を再 構築することの方が重要です。
さて、HDD2(ad2)が調子悪くなりました。アクセス不能。てなことになると、 vinum の list が次のように変わります。
vinum -> list 2 drives: D d0 State: up Device /dev/ad0s1g Avail: 38360/69080 MB (56%) D d2 State: up Device /dev/ad2s1g Avail: 38360/69080 MB (56%) 1 volume: V home State: up Plexes: 2 Size: 30720 MB 2 plexes: P home.p0 C State: up Subdisks: 1 Size: 30720 MB P home.p1 C State: faulty Subdisks: 1 Size: 30720 MB 2 subdisks: S home.p0.s0 State: up PO: 0 B Size: 30720 MB S home.p1.s0 State: faulty PO: 0 B Size: 30720 MB
faulty
というのが「調子悪い」ところで、同期が取れてないと
ころです。最も理想的に行く場合のシナリオを以下に記します。
買いに行きましょう。同じ型番のものが理想ですが、1台のHDDが壊れ る頃には同じものは売ってないでしょう。より大きい容量のものを買って 来ましょう。
shutdownして、HDD2(ad2)を外します。ad0だけで起動できるか確かめ ましょう。vinumミラーしているパーティション以外でad2を利用していな ければ問題なく上がるでしょう。
買って来たHDDを元のad2の置き換えとして取り付けましょう。