FreeBSD で GEOM を試してみる

FreeBSD に GEOM というフレームワークがあるので,これを試してみます.
GEOM とは,modular disk I/O request transformation framework の事だそうで,VFS とファイルシステムの間に位置する層でディスクをコントロール出来たりします.
GEOM があれば,ATA,SCSI 問わず SoftwareRAID, 圧縮ファイルシステム, 暗号化ファイルシステム等が簡単に利用出来ます.

GEOM を使ってみる

先にも言ったように GEOM は VFS 層とファイルシステム層の中間に位置する層でごにょごにょするフレームワークです.その為,ATA だろうが SCSI だろうが問いません.
と言う訳で,VMware 上で ATA と SCSI のディスクを何個か用意して GEOM って見たいとおもいます.
今回のディスク環境は次のとおりです. geom01# atacontrol list ATA channel 0:

   Master:  ad0 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
   Slave:   ad1 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4

ATA channel 1:

   Master:  ad2 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
   Slave:   ad3 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4

geom01# camcontrol devlist
<VMware, VMware Virtual S 1.0>     at scbus0 target 0 lun 0 (pass0,da0)
<VMware, VMware Virtual S 1.0>     at scbus0 target 1 lun 0 (pass1,da1)
<VMware, VMware Virtual S 1.0>     at scbus0 target 2 lun 0 (pass2,da2)
<VMware, VMware Virtual S 1.0>     at scbus0 target 3 lun 0 (pass3,da3)
<VMware, VMware Virtual S 1.0>     at scbus0 target 4 lun 0 (pass4,da4)


まずはやっぱり RAID0

まず,atacontrol の置き換えとする為に,RAID0 ディスクの作成からはじめて見たいと思います.
以下作業を行う前に,GEOM RAID0 の為の kernel module をロードしておきます.GEOM RAID0 のモジュールは geom_stripe.ko です.以下のコマンドを発行する事でモジュールのロードが完了します.

kldload geom_stripe.ko

再起動後も自動で読み込ませるには,/boot/loader.conf に以下の1行を追加します.

geom_stripe_load="YES"

また,ローダブルモジュールでは無く,kernel に静的に組み込んで使用したい場合,次の行を kernel コンフィグレーションファイルに追加して kernel を再作成して下さい.

options         GEOM_STRIPE

さて,上記作業終了後,実際に RAID0 ディスクの作成が行えます.GEOM 機構を使った RAID0 は gstripe コマンドを使用して作成できます.

geom01# gstripe label -v -s 131072 stripe0 ad0 ad2
Metadata value stored on ad0.
Metadata value stored on ad2.
Done.

gstripe コマンドに create 又は label を渡す事で作成の命令となります.-v は冗長モードにしてメッセージを表示させます.-s はストライプサイズで,オプションです.サイズは byte 単位で,無くても構いません.その後作成するデバイス名を指定し,その後に物理デバイス名を並べていきます.エラーが表示されなければ作成は完了です.

label と指定しているサブコマンド部分は create と指定しても同様に作用します.ただ,その後の動作に違いがあり,label を使用すると HDD にメタデータとして記録され,再起動後はメタデータの内容に従って自動的に設定内容が復元されます.create の場合はメタデータの記録は行わない為,再起動後は明示的にスクリプト等で設定を行う必要があります.その為,通常運用時は label を使用し,テストを行う際や,なんらかの事情でメタデータの記録が出来ない場合は create を使う.といった運用になります.

ステータスを知るには,gstripe status と status オプションを渡します.

geom01# gstripe status
          Name  Status  Components
stripe/stripe0      UP  ad0
                        ad2

上記の場合,stripe ディスクで,デバイス名が stripe0,ステータスが UP(正常) となり,物理ディスクとして ad0, ad1 が指定されている事がわかるかと思います.

もっと詳しいステータスが欲しければ,gstripe list と list オプション付きで発行して下さい.

geom01# gstripe list
Geom name: stripe0
State: UP
Status: Total=2, Online=2
Type: AUTOMATIC
Stripesize: 131072
ID: 1056941425
Providers:
1. Name: stripe/stripe0
   Mediasize: 17179607040 (16G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: ad0
   Mediasize: 8589934592 (8.0G)
   Sectorsize: 512
   Mode: r0w0e0
   Number: 0
2. Name: ad2
   Mediasize: 8589934592 (8.0G)
   Sectorsize: 512
   Mode: r0w0e0
   Number: 1

stripe0 に関する詳しい情報が表示される事がわかります./dev/stripe 以下に stripe0 というデバイスが作成されますので,これを newfs してマウントする事で RAID0 ディスクが利用出来ます.
また,GEOM は ATA,SCSI ディスクを問わないので,同一容量であれば混在ディスク環境での RAID ディスクの作成が可能です.

geom01# gstripe label -v -s 131072 stripe1 ad1 da1
Metadata value stored on ad1.
Metadata value stored on da1.
Done.

上記のように,stripe1 という名前で,ad1(ATA) と da1(SCSI) をサブディスクに指定して,RAID0 ディスクを作成します.ステータスは以下の通り,正常に UP 状態である事がわかるかと思います.

geom01# gstripe status
          Name  Status  Components
stripe/stripe0      UP  ad0
                        ad2
stripe/stripe1      UP  ad1
                        da1

これら作成した RAID0 ディスクは /dev/stripe 以下にデバイスファイルがありますので,newfs してマウントする事が可能です.

RAID0 ディスクの削除

作成済みの RAID0 や,間違って作成されてしまった RAID0 ディスクを削除するには,gstripe destroy コマンドを使用します.このコマンドに,削除したいデバイス名を渡す事で削除が行なわれます.特に確認も無く削除が実行されてしまいますので,destroy は注意して下さい.

geom01# gstripe destroy stripe1
geom01# gstripe status
          Name  Status  Components
stripe/stripe0      UP  ad0
                        ad2

RAID1 のミラーリングを試してみる

RAID0 と同様に,作業を行う前に,GEOM RAID1 の為の kernel module をロードしておく必要があります.GEOM RAID1 のモジュールは geom_mirror.ko です.以下のコマンドを発行する事でモジュールのロードが完了します.

kldload geom_mirror.ko

再起動後も自動で読み込ませるには,/boot/loader.conf に以下の1行を追加します.

geom_mirror_load="YES"

また,ローダブルモジュールでは無く,kernel に静的に組み込んで使用したい場合,次の行を kernel コンフィグレーションファイルに追加して kernel を再作成して下さい.

options         GEOM_MIRROR

今回も上記作業が完了したら,RAID1 ディスクの作成作業に移ることが出来ます.GEOM 機構を使用した RAID1 ディスクを作成するには,gmirror コマンドを使用します.

geom01# gmirror label mirror0 ad0 ad2

gmirror で RAID1 ディスクを作成する際も label オプションを渡します.この場合,mirror0 というディスクを作成し,元になるディスクは ad0 及び ad2 になります.
作成されたディスクステータスを確認するには,status オプションを付けて gmirror コマンドを実行します.

geom01# gmirror status
          Name    Status  Components
mirror/mirror0  COMPLETE  ad0
                          ad2

この場合,デバイス名が mirror/mirror0 である事がわかり,RAID ステータスは正常である事がわかります.このままパーティションを切り,newfs してマウントする事で利用が可能です.

当然ながら,既に通常利用している単発の HDD を RAID1 化する事も gmirror コマンドを使用する事で可能です.その際は,マスタ HDD として現在利用している HDD を gmirror で先に定義し,その後ミラー先の HDD を追加する事になります.ad1 を既に利用しており,ad3 を冗長セットとして組み込む場合,以下のように実行していきます.

geom01# mount | grep /mnt
/dev/ad1 on /mnt (ufs, local)

geom01# umount /mnt
geom01# gmirror label -v mirror1 ad1
Metadata value stored on ad1.
Done.

geom01# gmirror insert -v mirror1 ad3
Done.

geom01# gmirror status
          Name    Status  Components
mirror/mirror0  COMPLETE  ad0
                          ad2
mirror/mirror1  DEGRADED  ad1
                          ad3 (9%)

geom01# mount /dev/mirror/mirror1 /mnt

geom01# mount | grep /mnt
/dev/mirror/mirror1 on /mnt (ufs, local)

上記のように,先にマスタ側となる HDD を gmirror label で指定し,ミラーセットの片面を作成します.この場合,mirror1 というデバイスに ad1 を参加させています.
まだここだけの場合,片側しかないので,今までと同様の単発ドライブとしての利用になりますが,その後,gmirror insertmirror1 スレーブドライブを追加しています.
追加が完了すると自動的に RAID1 リビルド処理が開始されます.gmirror status コマンドでリビルド状況が確認出来る事がわかります.
gmirror status の結果が COMPLETE となっていれば RAID1 リビルドが完了しており,今後はミラーリング HDD として利用が可能になります.

RAID1 ディスクの削除

間違って作成してしまった場合や,RAID1 ディスクの利用をやめたい場合には ''gmirror remove'' コマンドを使用します.
gmirror remove は RAID1 ディスクから 1つ以上の HDD を取り除く為のコマンドで,HDD のミラーディスクを代えたい場合にも使用できます.

例えば,RAID1 構成をやめて単発としたい場合は以下のように,ミラーセットの片方を remove で取り外します.

geom01# gmirror status
          Name    Status  Components
mirror/mirror0  COMPLETE  ad0
                          ad2
mirror/mirror1  COMPLETE  ad1
                          ad3

geom01# gmirror remove mirror1 ad3

geom01# gmirror status
          Name    Status  Components
mirror/mirror0  COMPLETE  ad0
                          ad2
mirror/mirror1  COMPLETE  ad1

また,上記状態より,mirror0 のミラーセットを全て削除したい場合は,次のように参加ディスク全てを指定する事で削除する事が可能です.

geom01# gmirror remove mirror0 ad0 ad2
geom01# gmirror status
          Name    Status  Components
mirror/mirror1  COMPLETE  ad1

HDD デュプリケータとして使用する

gmirror を使う事で HDD デュプリケーションが簡単に可能になります.atacontrolcamcontrol を併用する事でリブートを行うことが無くどんどん同じ内容の HDD を作成する事が可能です.
ここではマスタディスクを ad0 として,他の HDD に複製を作成していく場合を取り上げたいと思います.

geom01# gmirror label -v dup0 ad0
Metadata value stored on ad0.
Done.
geom01# gmirror insert -v dup0 ad1
Done.
geom01# gmirror status
       Name    Status  Components
mirror/dup0  DEGRADED  ad0
                       ad1 (6%)

ここでは ad0 を先にミラーのマスタ側として dup0 に組み込み,その後に ad1 をスレーブとして追加しています.gmirror status でリビルドが確認出来ています.
実は,GEOM によるミラーリングは2台のみという制限があるわけでは無いので,好きなタイミングで HDD を追加できます.

geom01# gmirror insert -v dup0 ad2
Done.
geom01# gmirror status
       Name    Status  Components
mirror/dup0  DEGRADED  ad0
                       ad1 (74%)
                       ad2 (22%)

上記のように,ad1 へリビルド中にもかかわらず,ad2 を追加する事も可能です.当然ながら,リビルド処理は各 HDD にあわせて行われます.
この後,リビルド処理が完了した HDD を gmirror remove で切り離してしまえばデュプリケートは完了です.まだ追加したい HDD があれば atacontrol 等で入れ替えて再度コマンドを実行して下さい.

RAID10 を試してみる

GEOM 機構は重ねて使う事が可能ですので,先の geom_stripe, geom_mirror を組み合わせて利用する事で RAID10 の環境を作成する事が可能です.はじめに RAID1 のディスクを複数用意し,それらを RAID0 で纏める事で RAID10 と出来ます.

ここでは,6本のディスクを使った RAID10 の環境を作成してみたいと思います.

geom01# gmirror label mirror0 ad1 da1
geom01# gmirror label mirror1 ad2 da2
geom01# gmirror label mirror2 ad3 da3
geom01# gmirror status
          Name    Status  Components
mirror/mirror0  COMPLETE  ad1
                          da1
mirror/mirror1  COMPLETE  ad2
                          da2
mirror/mirror2  COMPLETE  ad3
                          da3

これで 3つの RAID1 ディスクが作成出来ました.この 3つの RAID1 を RAID0 で纏めてしまいましょう.

geom01# gstripe label -s 131072 stripe0 mirror/mirror0 mirror/mirror1 mirror/mirror2
geom01# gstripe status
          Name  Status  Components
stripe/stripe0      UP  mirror/mirror0
                        mirror/mirror1
                        mirror/mirror2

ステータスを表示するとわかるように,geom_mirror で作成されているディスクが使用されている事がわかります.

作成された RAID10 ディスクは geom_stripe 及び geom_mirror をそのまま利用していますので,運用,管理はそれら geom_stripe 及び geom_mirror のコマンドで管理出来ます.

ディスクをコンカチする

GEOM を使った,HDD の連結及びファイルシステムの拡張が可能です.この機能を利用する事で,ホーム領域の拡張が容易になる等,後からの運用が楽になります.

今までと同様に,作業を行う前に,GEOM CONCAT の為の kernel module をロードしておく必要があります.GEOM CONCAT のモジュールは geom_concat.ko です.以下のコマンドを発行する事でモジュールのロードが完了します.

kldload geom_concat.ko

再起動後も自動で読み込ませるには,/boot/loader.conf に以下の1行を追加します.

geom_concat_load="YES"

また,ローダブルモジュールでは無く,kernel に静的に組み込んで使用したい場合,次の行を kernel コンフィグレーションファイルに追加して kernel を再作成して下さい.

options         GEOM_CONCAT

モジュールのロードもしくは kernel への組み込みが完了すると GEOM concat を利用できます.ディスクのコンカチネーションは gconcat label を使用します.

geom01# gconcat create -v concat0 ad0
Done.

geom01# gconcat status
          Name  Status  Components
concat/concat0      UP  ad0

gconcat status を見ると分かりますが,ad0 が concat0 に参加している事が分かります.このまま newfs 及び mount で利用が可能です.

geom01# newfs /dev/concat/concat0
/dev/concat/concat0: 8192.0MB (16777216 sectors) block size 16384, fragment size 2048
        using 45 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976,
 3387328, 3763680, 4140032, 4516384, 4892736, 5269088, 5645440, 6021792,

geom01# mount /dev/concat/concat0 /mnt

geom01# df
/dev/concat/concat0   8122126       4 7472352     0%    /mnt

この状態で,concat0 にディスクを追加して,ファイルシステムの拡張を実行してみます.ただ,残念な事に一度マウントを解除する必要があります.

geom01# umount /mnt
geom01# gconcat label concat0 ad0 ad2
geom01# gconcat status
          Name  Status  Components
concat/concat0      UP  ad0
                        ad2

はじめに gconcat label を実行します.この際,既に作成してある名前及びデバイスをそのまま指定し,続いて追加するディスクを指定する事に注意して下さい.問題なく追加が完了したらファイルシステムの拡張を行います.growfs を利用して拡張を行います.

geom01# growfs /dev/concat/concat0
We strongly recommend you to make a backup before growing the Filesystem

 Did you backup your data (Yes/No) ? Yes
new file systemsize is: 8388607 frags
Warning: 59100 sector(s) cannot be allocated.
growfs: 16355.1MB (33495328 sectors) block size 16384, fragment size 2048
        using 89 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
 16936000, 17312352, 17688704, 18065056, 18441408, 18817760, 19194112,
 19570464, 19946816, 20323168, 20699520, 21075872, 21452224, 21828576,

geom01# mount /dev/concat/concat0 /mnt

geom01# df
/dev/concat/concat0  16220702       4 14923042     0%    /mnt

growfs を実行すると実施の確認があらわれますので Yes をタイプする事でファイルシステム拡張が実行されます.No の場合は何もせずに終了します.その後マウントしてみるとサイズが増えていることが確認出来ると思います.

RAID3 を試してみる

ここまで来るとお分かりかと思いますが,やはり GEOM RAID3 の為の kernel module をロードしておく必要があります.GEOM RAID3 のモジュールは geom_raid3.ko です.以下のコマンドを発行する事でモジュールのロードが完了します.

kldload geom_raid3.ko

再起動後も自動で読み込ませるには,/boot/loader.conf に以下の1行を追加します.

geom_raid3_load="YES"

また,ローダブルモジュールでは無く,kernel に静的に組み込んで使用したい場合,次の行を kernel コンフィグレーションファイルに追加して kernel を再作成して下さい.

options         GEOM_RAID3

上記作業を完了後,RAID3 ディスクの作成作業に移ることが出来ます.GEOM 機構を使用した RAID3 ディスクを作成するには,graid3 コマンドを使用します.

geom01# graid3 label raid3-0 ad0 ad2 da1

graid3 で RAID3 ディスクを作成する際も label オプションを渡します.この場合,raid3-0 というディスクを作成し,元になるディスクは ad0 及び ad2,da1 になります. 作成されたディスクステータスを確認するには,status オプションを付けて graid3 コマンドを実行します.

geom01# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  ad0
                         ad2
                         da1

この場合,デバイス名が raid3/raid3-0 である事がわかり,RAID ステータスは正常である事がわかります.このままパーティションを切り,newfs してマウントする事で利用が可能です.
ただ,RAID3 は何れかのドライブがパリティドライブとなりますが,上記の情報には表示されていません.ドライブ情報を表示するには list オプションを付けて graid3 コマンドを実行します.

geom01# graid3 list raid3-0
Geom name: raid3-0
State: COMPLETE
Components: 3
Flags: NONE
GenID: 0
SyncID: 1
ID: 4185056656
Zone64kFailed: 0
Zone64kRequested: 0
Zone16kFailed: 0
Zone16kRequested: 0
Zone4kFailed: 0
Zone4kRequested: 38
Providers:
1. Name: raid3/raid3-0
   Mediasize: 17179868160 (16G)
   Sectorsize: 1024
   Mode: r0w0e0
Consumers:
1. Name: ad0
   Mediasize: 8589934592 (8.0G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Flags: NONE
   GenID: 0
   SyncID: 1
   Number: 0
   Type: DATA
2. Name: ad2
   Mediasize: 8589934592 (8.0G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Flags: NONE
   GenID: 0
   SyncID: 1
   Number: 1
   Type: DATA
3. Name: da1
   Mediasize: 8589934592 (8.0G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Flags: NONE
   GenID: 0
   SyncID: 1
   Number: 2
   Type: PARITY

status コマンドの場合と比べ,表示される情報量が大幅に増えている事がわかるかと思います.まず,以下の項で,16GB のディスクになっている事がわかります.8GB x 3個 で,1つのドライブがパリティドライブなので,16GB となります.

1. Name: raid3/raid3-0
   Mediasize: 17179868160 (16G)
   Sectorsize: 1024
   Mode: r0w0e0

次に,各ディスクの情報が表示されていますが,この中の Type: に注目して下さい.ここにディスクタイプが表示されます.Type: DATA の場合,実際にデータが書かれるディスク,Type: PARITY の場合,パリティディスクとなります.ここでは da1 がパリティディスクになりました.RAID3 ディスク作成時の一番最後の引数に宛てたディスクがパリティディスクになるようです.

RAID3 のリビルドを試してみる

RAID3 で構築したボリュームのディスクを1本故障した状態にして,そのまま利用が可能か,リビルドが可能かを試して見ます.今回,ATA ドライブをチャネル別に1本づつ利用していますので,ad2 を切り離してデグレード状態にしたいと思います.

geom01# atacontrol detach ata1
geom01# atacontrol list
ATA channel 0:
    Master:  ad0 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
    Slave:   ad1 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
ATA channel 1:
    Master:      no device present
    Slave:       no device present

この状態だと,RAID3 ディスクははデグレードしていると認識されるはずです.先ほどと同様に,graid3 コマンドで確認します.

geom01# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  ad0
                         da1

マウント済みの場合,このまま利用出来るかですが,確認した限りでは問題ありませんでした.では,先ほどの ad2 を元に戻して,リビルド処理を行おうと思います.その際,全く新規のディスクとする為,今回の環境では VMware の HDD を新しく作成して ad2 に割り当てています.つまり,新規ディスクにリプレースするイメージとなっています.

geom01# atacontrol attach ata1

ata1 チャネルをアタッチしても,デグレード状態は変わりません.graid3 insert を使用して RAID3 ディスクに ad2 を追加する事で RAID3 ディスクの修復が行われます.

geom01# graid3 insert -v -n 1 raid3-0 ad2
Done.

ここで -n と,数字をを指定しています.これは graid3 list で出力される結果を見るとわかりますが,ディスク番号となります.今回の場合 ad2 は元々 Number: 1 となっていましたので 1 を指定しています.ディスクの追加が成功するとリビルドが走り,graid3 status を確認するとリビルド中である事が確認出来ます.

geom01# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  da1
                         ad0
                         ad2 (11%)

入れ替えし,リビルド後のステータスは上記になりますが,graid3 status コマンドでの確認ではディスク番号が分からない事,また,表示されるディスクの順序が入れ替わってしまう事など,把握しづらい状態となります.
上記の場合でも ad1-n 0 になる為です.その場合,graid3 list コマンドを実行し,Number: の値を確認しましょう.

geom01# graid3 list raid3-0
Geom name: raid3-0
State: DEGRADED
Components: 3
Flags: NONE
GenID: 0
SyncID: 3
ID: 4185056656
Providers:
1. Name: raid3/raid3-0
   Mediasize: 17179868160 (16G)
   Sectorsize: 1024
   Mode: r1w0e0
Consumers:
1. Name: da1
   GenID: 0
   SyncID: 3
   Number: 2
   Type: PARITY
2. Name: ad0
   GenID: 0
   SyncID: 3
   Number: 0
   Type: DATA
3. Name: ad2
   GenID: 0
   SyncID: 3
   Synchronized: 77%
   Number: 1
   Type: DATA

上記リストの内容は大分省いていますが,それぞれのディスクに番号が振られている事が確認できると思います.raid3 コマンドは,これら番号を指定する事で,ディスクを指定するオペレーションになるようです.

RAID3 ディスクの削除

ディスクが故障していない状態で,明示的に入れ替えたい場合等は graid3 remove コマンドを使用してディスクを取り外します.graid3 remove は RAID3 ディスクから1つの HDD を取り外す為のコマンドになります.

geom01# graid3 remove -n 0 raid3-0

この場合,ad0 を取り外しています.graid3 insert と同様にディスクは -n を使用した番号を指定します.コマンドが成功すると,HDD が取り外され RAID3 ディスクはデグレード状態となります.この後,入れるべき HDD を graid3 insert を使用して追加します.

geom01# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  da1
                         ad2

RAID3 ディスクの利用を完全にやめてしまう場合,graid3 stop コマンド及び graid3 clear コマンドを利用します.

geom01# graid3 stop raid3-0
geom01# graid3 status

上記の場合は graid3-0 を停止しています.graid3 status からも削除されている事が確認できます.ただ,graid stop コマンドは一時的な停止の状態だけとなりますので,この状態だと再起動後に復活してしまいます.それを防ぐには HDD に記録されているメタデータの削除が必要となり,この作業を graid3 clear コマンドで実施します.

geom01# graid3 clear -v ad0
Metadata cleared on ad0.
Done.

geom01# graid3 clear -v ad2
Metadata cleared on ad2.
Done.

geom01# graid3 clear -v da1
Metadata cleared on da1.
Done.

メタデータの削除まで完了する事で RAID3 の情報を完全に削除した事になります.

RAID30 を使う

GEOM は,他の GEOM と組み合わせて利用できる事は説明しました.また,RAID10 を作成してみました.せっかくですので,この流れで RAID30 を作成したいと思います.
使用するディスクは 6本,まず RAID3 ディスクを2セット作成し,その後それらをまとめて RAID0 ディスクを作成してみます.作成に取り掛かる前に,gstripe 及び graid3 のカーネルモジュールのロード等,利用できる状態にして下さい.

geom01# graid3 label raid3-0 ad0 ad2 da1
geom01# graid3 label raid3-1 ad1 ad3 da2
geom01# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  ad0
                         ad2
                         da1
raid3/raid3-1  COMPLETE  ad1
                         ad3
                         da2

geom01# gstripe create -s 131072 stripe0 raid3/raid3-0 raid3/raid3-1
geom01# gstripe status
          Name  Status  Components
stripe/stripe0      UP  raid3/raid3-0
                        raid3/raid3-1

上記のように,何も問題無く作成する事が可能で,また,利用も問題なく可能です.何度もこういった例を挙げても面白くないと思いますが,GEOM の使い勝手の良さはわかって頂けると思います.

GATE を試してみる

FreeBSD の GEOM 機構に面白い機能が追加されています.GEOM GATE という機能です.ブロックデバイスをネットワーク越しに見せる,つかむ事が可能になります.これを利用すると iSCSI のようにリモートの raw デバイスを TCP/IP から利用出来るようになるのです. http://garage.freebsd.pl/GEOM_Gate.pdf にやり方等が書いてありますので,これを元に触って見たいと思います.ただ,リンク元の PDF ドキュメントは古い為,コマンドやコマンドのオプションが少し変わっていました.

GEOM GATE は3つのパートに分かれており,一番基盤になる kernel module としての,geom_gate.ko, サーバデーモンの ggated,クライアントデーモンの ggatec です.geom_gate.ko はサーバ,クライアントの両方で組み込む必要があるようです.

kldload geom_gate.ko

再起動後も自動で読み込ませるには,/boot/loader.conf に以下の1行を追加します.

geom_gate_load="YES"

また,ローダブルモジュールでは無く,kernel に静的に組み込んで使用したい場合,次の行を kernel コンフィグレーションファイルに追加して kernel を再作成して下さい.

options         GEOM_GATE

その後,サーバ側では,nfs の exports に良く似た設定ファイルを用意します.

geom01# cat /etc/gg.exports
192.168.241.166 RW      /dev/da1
192.168.241.166 RW      /dev/da2

設定ファイルを作成したら,サーバデーモンを起動します.これでサーバ側の準備は完了のようです.

geom01# ggated /etc/gg.exports

では次はクライアント側です.クライアントでもデーモンを起動しますが,こちらは引数等が多めです.

geom02# ggatec create -n -o rw -u 0 geom01 /dev/da1

マニュアルによると,ggatec はプログラム名で,create を付けるとデバイスの作成フェーズになるようです.以下続きのオプションです.

-n        TCP_NODELAY を使わない
-o rw     マウント時のオプション.rw はリード/ライト
-u 0      マウントする際のデバイス番号.ggate[n] になる
geom01    GEOM GATE でマウントするデバイスがあるサーバ
/dev/da1  マウントするサーバ側のデバイス名

マウントが成功すると,クライアント側の /var/log/messages に次のようなメッセージが表示されました.

geom02# tail /var/log/messages
Jul  2 23:17:11 geom02 ggatec: send_thread: started!
Jul  2 23:17:11 geom02 ggatec: recv_thread: started!

サーバ側でも同様なメッセージが表示されています.

geom01# tail /var/log/messages
Jul  2 23:16:30 geom01 ggated: disk_thread: started [/dev/da1]!
Jul  2 23:16:30 geom01 ggated: send_thread: started [/dev/da1]!
Jul  2 23:16:30 geom01 ggated: recv_thread: started [/dev/da1]!

クライアントの /dev 以下に,ggate0 というデバイスが出来ています.これを newfs してマウントする事が可能です.

geom02# newfs /dev/ggate0
/dev/ggate0: 4096.0MB (8388608 sectors) block size 16384, fragment size 2048
        using 23 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976,
 3387328, 3763680, 4140032, 4516384, 4892736, 5269088, 5645440, 6021792,
 6398144, 6774496, 7150848, 7527200, 7903552, 8279904

geom02# mount /dev/ggate0 /mnt

geom02# df
Filesystem  1K-blocks    Used   Avail Capacity  Mounted on
/dev/da0s1a    507630   36838  430182     8%    /
devfs               1       1       0   100%    /dev
/dev/da0s1e    507630      12  467008     0%    /tmp
/dev/da0s1f   1301002 1109046   87876    93%    /usr
/dev/da0s1d   1255886     272 1155144     0%    /var
/dev/ggate0   4058062       4 3733414     0%    /mnt

TCP で行うため,スピードは速くありませんが,面白い使い方が出来ています.まだまだ安定性に不満がありますが,こなれてくるともっと楽しめそうです.

リモートの Disk とローカルの Disk で RAID を組む

GEOM GATE には,もっと面白い方法があり,先の RAID と組み合わせる事が可能です.例えば,現在マウントしてある ggate0 をローカルのディスクとあわせて RAID1 にする事も可能です.
とりあえずは,現在マウントしてある /mnt はアンマウントし,その後 geom_mirror.ko を組み込みます.

geom02# umount /mnt

geom02# kldload /boot/kernel/geom_mirror.ko

先の GEOM RAID1 の場合を参考に,ミラーディスクを作成してみます.その結果,次のようになります.

geom02# gmirror label mirror0 /dev/ad0 /dev/ggate0
geom02# gmirror status
          Name    Status  Components
mirror/mirror0  COMPLETE  ad0
                          ggate0

ここまできたら newfs してマウントするだけで,ネットワーク越しのミラーディスクが利用できます.

geom02# newfs /dev/mirror/mirror0
/dev/mirror/mirror0: 4096.0MB (8388604 sectors) block size 16384, fragment size 2048
        using 23 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976,
 3387328, 3763680, 4140032, 4516384, 4892736, 5269088, 5645440, 6021792,
 6398144, 6774496, 7150848, 7527200, 7903552, 8279904

geom02# mount /dev/mirror/mirror0 /mnt/



Hiroyuki Seino http://www.seichan.org/ http://www.seichan.org/blog/
Today:1 Yesterday:2 All:32621