2006年6月14日水曜日

(FreeBSD)恐怖のgvinum

昨日の話に登場したハードディスクを、交換しました。

smartmontoolsでハードディスクの致命的エラー発生を事前に察知

新品のドライブに交換して、RAID(ストライピング+ミラーリング)を再構築しようとしたら・・・カーネル・パニック!

え?????????

RAIDといっても、ソフトウェアRAID。
FreeBSDのgvinumGEOM VINUM)という機能で実現されているソフトウェアRAIDです。これ、世間では、やたらと評判が悪いようです。ええ、個人的にも、最悪だと思っています。はい。



もともと、FreeBSDにはvinumというソフトウェアRAID機能があって、かつてはそれを使っていました。GEOMという新しいメカニズムが導入されたときに、これまでのvinumがうまく動かなくなったそうです。そのときは、gvinumという新しいのを用意したので、それを使えばいい、みたいな話になりました。すなおにそれに従って、gvinumへ移行したのですが・・・このgvinumが最悪。



何が最悪って、gvinumの気に障ることをしでかすと、即、panicが発生・・・



まるで腫れ物に触るかのように、gvinumを扱わないといけません。



で、もう1つ悪いことに、gvinumって、vinumを完全に置き換えるものではないのです。vinumにあったのにgvinumではまだ実装されていない機能ってのがたくさんあります。gvinumのマニュアルやhelpコマンドで、コマンド名がずらずら~と表示されるのですが、それらのほとんどが、実装されていません。



もうね、今日なんか、gvinumコマンドのソースコードを見ながら、操作方法を探しちゃいましたよ・・・



たとえば、「printconfig ファイル名」で、ファイルに設定を保存できるはずなんですが、実際には、ファイルに保存する機能は実装されていません。画面に表示されるだけなんです。ソースコードを見てたら、すぐにわかりました。そういや、stopコマンドもなんか変です。





なんとか、3回ほどpanicしたあと、復旧した・・・と思ったら、なんかまだ変です。
「degraded」って出てるんですけど。



gvinum -> l
4 drives:
D drive1                State: up       /dev/ad1s1e     A: 0/77888 MB (0%)
D drive3                State: up       /dev/ad3s1e     A: 1828/77888 MB (2%)
D drive2                State: up       /dev/ad2s1e     A: 0/76060 MB (0%)
D drive0                State: up       /dev/ad0s3e     A: 0/77888 MB (0%)



1 volume:
V raid                  State: up       Plexes:       2 Size:        152 GB



2 plexes:
P raid.p0             S State: degraded Subdisks:     2 Size:        152 GB
P raid.p1             S State: up       Subdisks:     2 Size:        148 GB



4 subdisks:
S raid.p0.s1            State: I 97%    D: drive1       Size:         76 GB
S raid.p0.s0            State: I 97%    D: drive0       Size:         76 GB
S raid.p1.s0            State: up       D: drive2       Size:         74 GB
S raid.p1.s1            State: up       D: drive3       Size:         74 GB



plexが2つあって、微妙にサイズが異なるので、なんかおかしくなっているのかな?
新しいドライブに交換したのは、drive1なので、raid.p0というほう。



あーもー、やだ。gvinumには、もうつきあいきれない!!



これって、けっこう昔セットアップした、80GBのドライブ4台からなるRAIDなんですが、いまじゃ、ドライブの容量もずっと増えてるので、もはや、4台も使う必要はなくて、2台を使ってミラーリングするだけで、十分な気がしてきました。



幸いなことに、FreeBSDには、gvinum以外にも、RAIDを実現する機能として、ATA RAIDと、GEOM MIRRORの2つがあるし、近いうちに、そっちへ乗り換えようと思います。



(本音: 昨日の話にもでてきた3ware製のRAIDカードが、ものすごくまともに素直に動いているので、予算さえつけば、そっちにしたいところです)



☆ ☆ ☆ ☆ ☆ ☆ 



今日、何回かkernel panicを発生させて、だいたい、gvinumのあやし方がわかってきたようなきがします。以下は、経験で学んだことで、正しい操作方法ではないかもしれません。その証拠に、上記のように、復旧できてませんから・・・



今回drive1というのが新しいドライブへ交換されたのですが、ドライブを交換したときは、
まず、「rm raid.p0.s0」とか「rm raid.p0.s2」、「rm raid.p0」というように、「rm」コマンドで、壊れた側のplexを削除してしまいました。rmできないこともあって、そういうときは、再起動したらrmできました。なんだかよくわかりません・・・



つぎに、「create」コマンドで、driveだけ定義しました。createコマンドを実行すると、現在の設定がコメント形式で表示されますが、以下の、driveだけ、定義してやりました。

drive drive0 device /dev/ad0s3e
drive drive1 device /dev/ad1s1e
drive drive2 device /dev/ad2s1e
drive drive3 device /dev/ad3s1e

ちなみにdrive1だけを定義してやったら、カーネルパニックしました。



運良く、このcreateコマンドが成功したので、つぎに、もう1度createコマンドを実行し、空のplexを定義(さっきと同様に、以下の1行だけ残して、残りはコメントアウトされたままに)。

plex name raid.p1 org striped 1024s vol raid

これも成功。最後に、もう1回createコマンドを実行。

sd name raid.p0.s0 drive drive0 plex raid.p0
sd name raid.p0.s1 drive drive1 plex raid.p0

これで、あとは、「start raid.p0」を実行したかしなかったか忘れましたが、データの同期処理が始まりました。



(で、いまだにdegradedのままである、というオチ)



ドライブのサイズが違っちゃっているので、正常なplex、raid.p1と同じサイズになるように、subdisk(sd)を定義するときに、lengthを指定すればいいのかなぁ?



でも、それをやって、またカーネル・パニックしたらいやだし・・・



(2006-06-21 追記)



subdiskのサイズをそろえてみたところ、うまくいきました。



  1. rmコマンドで、既存のplexとsubdiskを削除


  2. createコマンドを実行し、sdでsubdiskを定義するときに、lenで、既存のsubdiskと同じサイズを指定する


  3. 神に祈る!


これで、見事、gvinumによる、RAID0+1ボリュームが復活しました。



gvinum -> printconfig
# Vinum configuration of palomino.cad.flab.fujitsu.co.jp, saved at Fri Jun 16 17:21:41 2006
drive drive1 device /dev/ad1s1e
drive drive3 device /dev/ad3s1e
drive drive2 device /dev/ad2s1e
drive drive0 device /dev/ad0s3e
volume raid
plex name raid.p0 org striped 1024s vol raid
plex name raid.p1 org striped 1024s vol raid
sd name raid.p0.s1 drive drive1 len 155770880s driveoffset 265s plex raid.p0 plexoffset 1024s
sd name raid.p0.s0 drive drive0 len 155770880s driveoffset 265s plex raid.p0 plexoffset 0s
sd name raid.p1.s0 drive drive2 len 155770880s driveoffset 265s plex raid.p1 plexoffset 0s
sd name raid.p1.s1 drive drive3 len 155770880s driveoffset 265s plex raid.p1 plexoffset 1024s



gvinum -> l
4 drives:
D drive1                State: up       /dev/ad1s1e     A: 1828/77888 MB (2%)
D drive3                State: up       /dev/ad3s1e     A: 1828/77888 MB (2%)
D drive2                State: up       /dev/ad2s1e     A: 0/76060 MB (0%)
D drive0                State: up       /dev/ad0s3e     A: 1828/77888 MB (2%)



1 volume:
V raid                  State: up       Plexes:       2 Size:        148 GB



2 plexes:
P raid.p0             S State: up       Subdisks:     2 Size:        148 GB
P raid.p1             S State: up       Subdisks:     2 Size:        148 GB



4 subdisks:
S raid.p0.s1            State: up       D: drive1       Size:         74 GB
S raid.p0.s0            State: up       D: drive0       Size:         74 GB
S raid.p1.s0            State: up       D: drive2       Size:         74 GB
S raid.p1.s1            State: up       D: drive3       Size:         74 GB



0 件のコメント:

コメントを投稿