現在,ブログにてコンテンツを更新しています.完了次第こちらに新たに纏めようと思っているのですが,合わせてブログも見て頂けると幸いです.
FreeBSD に GEOM というフレームワークがあるので,これを試してみます.
GEOM とは,modular disk I/O request transformation framework の事だそうで,VFS とファイルシステムの間に位置する層でディスクをコントロール出来たりします.
GEOM があれば,ATA,SCSI 問わず SoftwareRAID, 圧縮ファイルシステム, 暗号化ファイルシステム等が簡単に利用出来ます.
先にも言ったように 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)
まず,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 ディスクを削除するには,gstripe destroy コマンドを使用します.このコマンドに,削除したいデバイス名を渡す事で削除が行なわれます.特に確認も無く削除が実行されてしまいますので,destroy は注意して下さい.
geom01# gstripe destroy stripe1 geom01# gstripe status Name Status Components stripe/stripe0 UP ad0 ad2
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 insert で mirror1 スレーブドライブを追加しています.
追加が完了すると自動的に RAID1 リビルド処理が開始されます.gmirror status コマンドでリビルド状況が確認出来る事がわかります.
gmirror status の結果が COMPLETE となっていれば RAID1 リビルドが完了しており,今後はミラーリング HDD として利用が可能になります.
間違って作成してしまった場合や,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
gmirror を使う事で HDD デュプリケーションが簡単に可能になります.atacontrol や camcontrol を併用する事でリブートを行うことが無くどんどん同じ内容の 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 等で入れ替えて再度コマンドを実行して下さい.
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 の場合は何もせずに終了します.その後マウントしてみるとサイズが増えていることが確認出来ると思います.
ここまで来るとお分かりかと思いますが,やはり 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 で構築したボリュームのディスクを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 コマンドは,これら番号を指定する事で,ディスクを指定するオペレーションになるようです.
ディスクが故障していない状態で,明示的に入れ替えたい場合等は 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 の情報を完全に削除した事になります.
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 の使い勝手の良さはわかって頂けると思います.
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 で行うため,スピードは速くありませんが,面白い使い方が出来ています.まだまだ安定性に不満がありますが,こなれてくるともっと楽しめそうです.
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:2 Yesterday:2 All:32581