GEOMについてのあれこれ

まとまるのかまとまらないのか知らないし、締め切りも過ぎてしまったんだけど、今更ながら FreeBSD の GEOM についてまとめてみる。
どういう結論に行き着くのかもわからずに書きはじめて、どういう結論に落ち着くのか、そもそも結論なんて出るのか!? 乞うご期待。
目標書き上げ時間まであと10時間、なんだかんだで実作業時間は5時間、2000字くらい書ければいいよね?

そもそもGEOMってなんなのさ?

ってことでぐぐってみると、
差込可能なストレージ層 GEOM により、新たなストレージ サービスをすみやかに開発して、FreeBSD のストレージサブシステムに きれいに組み込むことができます。GEOM は、ストレージサービスを 検出したり階層化して用いるための一貫して筋の通ったモデルを 提供しており、RAID とボリューム管理のようなサービスを 重ね合わせて使うことが容易になります。(http://www.freebsd.org/ja/features.html)
って話が出てくる。 わかったようなわからんような説明だわな。 わかるところから意味をとってみると、GEOMにより RAID とかディスクの暗号化といったストレージサービスを、ストレージサブシステムに組み込んで、それを通してストレージを使うための一貫したシステムということになる様子。 やっぱりわかりにくいかも。 ともあれこの辺は何となくでいい様な気もする。

ともあれ普通であれば/dev/ad0s1などにアクセスしていたのを、geomを使用することにより、その/dev/ad0s1を暗号化してアクセスしたり、ad0s1とad1s1をまとめて1つの論理ディスクとして使用したりすることができるようになる。 ちなみに FreeBSD-5.0-RELASE以降は普通の物理ディスクへのアクセスであってもgeomを通してアクセスしているんだけど。

もっと詳しく知りたければ、man 4 geom で詳しい話は出てくるけど、あんまり役に立たない様な気がする。

geomでいろいろ

さて、geomがなんなのか何となくわかったような気分になったところで、geomで何ができるのかをみていこうと思う。

ここでもやっぱり man に聞くのが一番ということで、man 8 geom ってしてみると、下の方に現在利用可能な geom class ということで、いくつかの項目が載っている。
o CONCAT
o LABEL
o MIRROR
o NOP
o RAID3
o SHSEC
o STRIPE
これらを順番に見ていこう。 どれをみるのかはご丁寧にその下にコマンドについて書いてあるので、man から調査してみる。
gconcat(8), glabel(8), gmirror(8), gnop(8), graid3(8), gshsec(8), gstripe(8)

CONCAT

ようするに concatenation、複数のディスクをまとめて一つの領域として使う方法で、いわゆる RAID0。
やり方は man にも書いてあるけど簡単で、
gconcat label -v data /dev/da0 /dev/da1 /dev/da2 /dev/da3
newfs /dev/concat/data
mount /dev/concat/data /mnt
[...]
umount /mnt
gconcat stop data
gconcat unload
こんなかんじ。
ちなみに da1、da2、da3 は容量が違ってもOK。 そのかわりどれかの領域が死んだら、データのサルベージができなくなる可能性があるのでご注意。

LABEL

glabelコマンドを使って、/dev/ad0 なんかに usr ってラベルつけて、マウントできるようにするための仕組。 使い方は man にもあるけどこんな感じで。
glabel label -v usr /dev/da2
newfs /dev/label/usr
mount /dev/label/usr /usr
[...]
umount /usr
glabel stop usr
glabel unload
ラベリングするだけでこれだけだとあんまり利用価値がないのかな。 ディスクとかが多くて、ad3 がどこにマウントされるべきなのかわからない、と言うようなときには便利なのかも知れない。

MIRROR

激しくおすすめの gmirror。 2つ以上のディスクに同じデータを書き込んで、どちらかのディスクが壊れても、問題なくシステムが動き続けられるようにするもので、いわゆるRAID1。
構築方法はやっぱり簡単でこんな感じ。
gmirror label -v -b split -s 2048 data da0 da1 da2
newfs /dev/mirror/data
mount /dev/mirror/data /mnt
...
umount /mnt
gmirror stop data
gmirror unload

gconcat もそうだけど gmirror も root ファイルシステムを gmirror にしたり、gconcat にしたりすることができる。 この場合、OS起動中はディスクが使用されているので、FreeBSD のインストールディスクを使用して、fixit で起動して gmirror 等の設定をおこなう必要がある。 やりかたはネットに幾らでもあるので、ぐぐる先生にでもお尋ねしてください。 ちなみに gconcat でいくつかの領域をまとめて、まとめた領域を使用して gmirror という事もできるらしい。 やったことないけど。 geom はこうやって複数の処理を重ねることができるというのも特徴の一つで、重ねすぎてループが発生した場合には geom がその重複をきちんと検出してくれる仕組もある。

NOP

gnopはどうやら I/Oエラーなんかを任意に作り出して、ほかのgeomサブシステムのデバッグや性能調査に使用するものの様子。 /usr/src/sys/conf/NOTES でも GEOM_NOP は test classとされてるからそう言うもんでしょう。

RAID3

名は体を表す。 とかそんな大げさなもんじゃないけど、GEOMによるRAID3。 ちなみに GEOMによる RAID5はまだ実装されていないが、開発はされてると言うようなことをどっかで読んだ。 GEOMベースの RAID5 が早いこと実装されて欲しいもんだ。

やり方は他と同じようなもので
graid3 label -v -r data da0 da1 da2
newfs /dev/raid3/data
mount /dev/raid3/data /mnt
...
umount /mnt
graid3 stop data
graid3 unload

RAID3なので、ディスク領域は同じ大きさのが 2n+1 必要で、ちがう大きさなら小さいのにそろえられてしまう。 ついでにどうやら一度つくった領域に新しくディスクを追加して領域を動的に増やすという事はまだで気ない様子。 今のところざっとネットを調べただけだけど、GEOM_RAID3 をつかってシステムの root を RAID3 にすることが出来るかどうかは謎。

SHSEC

いくつかのディスク領域をまとめて暗号化された一つの領域をつくるシステム。 gshsec(8) に乗っている使い方として、ローカルドライブとUSBメモリを利用して一つの gshsec 領域を作成すると、その USB メモリがない限りその領域に保存されたデータを読むことができなくなる。 この USBメモリ複数あってもいいようなので、重要なデータを複数の人の立ち会いの元でのみ閲覧できるというようなシステムに使える。 暗号化の方法が良くわからないので、どの程度安全かは不明だけど。
gshsecで使用するディスクの容量は同じ大きさにする必要があるらしく、容量が違うもので gshsecすると小さいものにそろえられてしまうようだ。

領域の作り方は例によって
gshsec label -v secret /dev/ad0s1 /dev/da0
newfs /dev/shsec/secret
こんなかんじ。

STRIPE

CONCATはディスク領域の大きさが違ってもまとめて一つのドライブとして使えたが、STRIPEは同じ大きさの領域をまとめて使うことになる。 イメージ的にはCONCATがただ単に領域をくっつけて連続的にしているのに対して、STRIPEは領域を細かく分けて、細かく分けた領域を均等になるように配置している感じ。 計測したわけじゃないけどアクセス速度は STRIPE の方が早い。 はず。 そのかわり STRIPEでは一つのドライブが壊れるとデータの復旧は絶望的なのに対して、CONCAT の場合はサルベージ出来る可能性はある。 難しいと思うけど。 先にも書いたけど GEOM はサブシステムを複数重ねることもできるので、STRIPE をするときには MIRROR をした方がいいでしょうね。

作り方はこんな感じ。
gstripe label -v -s 131072 data /dev/da0 /dev/da1 /dev/da2 /dev/da3
newfs /dev/stripe/data
mount /dev/stripe/data /mnt
[...]
umount /mnt
gstripe stop data
gstripe unload

まとめみたいな〜

つくった GEOM の領域などはそれぞれのコマンドで clear オプション等を使用して設定をクリアすることができる。 また GEOM のメタデータは領域の最後に配置されるようだ。 一杯一杯まで使ってるドライブだと GEOM にするとき何かエラーが出るかも知れない。

さてここまで急ぎ足で、おもに man に書かれていることを中心に GEOM に関して書いてきた。 ここでは geom(4) に書かれている GEOM 関連のコマンドから概説してきたが、/sys/conf/NOTES にある GEOM 関連の options を見てみると、ずらーっとこれだけある。

options GEOM_AES # Don't use, use GEOM_BDE
options GEOM_APPLE # Apple partitioning
options GEOM_BDE # Disk encryption.
options GEOM_BSD # BSD disklabels
options GEOM_CONCAT # Disk concatenation.
options GEOM_FOX # Redundant path mitigation
options GEOM_GATE # Userland services.
options GEOM_GPT # GPT partitioning
options GEOM_LABEL # Providers labelization.
options GEOM_MBR # DOS/MBR partitioning
options GEOM_MIRROR # Disk mirroring.
options GEOM_NOP # Test class.
options GEOM_PC98 # NEC PC9800 partitioning
options GEOM_RAID3 # RAID3 functionality.
options GEOM_SHSEC # Shared secret.
options GEOM_STRIPE # Disk striping.
options GEOM_SUNLABEL # Sun/Solaris partitioning
options GEOM_UZIP # Read-only compressed disks
options GEOM_VOL # Volume names from UFS superblock

みてみるといろいろある。 ちなみに GEOM_GETE というのをつかうとデバイスファイルをネットワーク経由でマウントできるようになるらしい。 要するにサーバにある /dev/acd0 を、ネットワークを通じてクライアントの /dev/acd0 としてマウントできるとか。 これはこれで面白そうな機能だ。

こんな風に GEOM を使うと、今までただ端にアクセスするだけだったディスク領域に様々な機能を付け加えることができ、利用のシーンが大きく広がるのではないかと思います。 サーバ運用している人には gmirror はおすすめだわ。 興味あるところでは graid3 でのルートファイルシステムの運用ができるかどうかを実験して(gmirror で出来るんだから出来るのではないかと予想してるんだけど…)、graid3の評価をしてみたいと思う。
今後に乞うご期待。