GEOM GATE を使ってみる

GEOM

今回は GEOM によるネットワーク経由のデバイス共有の仕組みである GATE について纏めてみたいと思います.

GEOM GATE のイメージ

GATE のイメージはこのような形です.gates が GEOM GATE でデバイスを提供する側 (サーバー) で,gatec が GEOM GATE でデバイスを提供される側 (クライアント) です.
サーバーではハードディスクである da1 と CD-ROM ドライブである cd0 を提供し,クライアントがネットワーク経由でマウントする.というイメージになります.

GEOM の利用 (サーバー側)

前準備として,カーネルモジュールのロードおよびサーバーデーモンの起動が必要になります.

server # kldload geom_gate.ko

server # kldstat
Id Refs Address                Size Name
 1   11 0xffffffff80200000  1f3e2d0 kernel
 2    1 0xffffffff82319000     3218 intpm.ko
 3    1 0xffffffff8231d000     2180 smbus.ko
 4    1 0xffffffff82320000     7490 vmci.ko
 5    1 0xffffffff82328000     4538 geom_gate.ko

再起動後も有効とするために /boot/loader.conf にも記載しましょう.

server # cat /boot/loader.conf
geom_gate_load="YES"

続いて,NFS で利用する /etc/exports のようなファイルを作成する必要があります.ファイルは /etc/gg.exports です.
構文も NFS の exports に似ている構文となります.
アクセスを許可するクライアント RW/RO 提供するデバイス

上図イメージのとおり,da1 と cd0 を提供する gg.exports は次のとおりです.

192.168.241.41 RW /dev/da1
192.168.241.41 RO /dev/cd0

gg.exports ファイルの作成が終わったら,ggated デーモンを起動します.rc スクリプトになっていない為手動でプログラムを実行します.

server # ggated /etc/gg.exports

ggated /etc/gg.exports
8292  0  S+      0:00.00 grep ggate

以上でサーバー側の準備は完了です.

GEOM の利用 (クライアント側)

クライアント側もサーバーと同様に前準備として,カーネルモジュールのロードおよびサーバーデーモンの起動が必要になります.

client # kldload geom_gate.ko

client # kldstat
Id Refs Address                Size Name
 1   11 0xffffffff80200000  1f3e2d0 kernel
 2    1 0xffffffff82319000     3218 intpm.ko
 3    1 0xffffffff8231d000     2180 smbus.ko
 4    1 0xffffffff82320000     7490 vmci.ko
 5    1 0xffffffff82328000     4538 geom_gate.ko

再起動後も有効とするために /boot/loader.conf にも記載しましょう.

client # cat /boot/loader.conf
geom_gate_load="YES"

ハードディスクをマウントする

ggatec コマンドを利用して,サーバーのリソースをつかみます.
mount コマンドに似た構文となります.
create で GEOM GATE デバイスを生成します
-o は RW/RO/WO が指定可能です.
サーバーのアドレスおよび提供しているデバイス名を指定します.
成功すると ggate[x] というデバイスが作成されます.

client # ggatec create -o rw 192.168.241.43 /dev/da1
ggate0

ハードディスクを ggate0 というデバイスで接続出来たので,フォーマットしてマウントしてみます.

client # newfs /dev/ggate0
/dev/ggate0: 102400.0MB (209715200 sectors) block size 32768, fragment size 4096
        using 164 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568,
 16646016, 17926464, 19206912, 20487360, 21767808, 23048256, 24328704, 25609152, 26889600, 28170048, 29450496, 30730944,
 32011392, 33291840, 34572288, 35852736, 37133184, 38413632, 39694080, 40974528, 42254976, 43535424, 44815872, 46096320,

client # mount /dev/ggate0 /mnt

client # df
Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2   19279260 3140820 14596100    18%    /
devfs               1       1        0   100%    /dev
/dev/ggate0 101561756       8 93436808     0%    /mnt

このように,通常のハードディスクと同様に扱う事が可能です.
実際にデータを置いてみます.

client # dd if=/dev/random of=/mnt/random.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.699479 secs (110700980 bytes/sec)

client # ls -l /mnt
total 1048868
drwxrwxr-x  2 root  operator         512 Dec  8 20:10 .snap
-rw-r--r--  1 root  wheel     1073741824 Dec  8 20:12 random.img

これをアンマウントし,サーバー側でディスクをマウントしてみて実際にデータが置かれているのか確認してみましょう.
まずはクライアント側でアンマウントし,そして ggate0 デバイスを削除します.

client # umount /mnt

client # ggatec destroy -u 0

サーバー側で確認してみる

サーバー側でも ggated を止めた方がいいのですが,掴まれていない場合は止めなくても扱えます.

このように,クライアント側で読み書きしたデータが確認できます.

server # mount /dev/da1 /mnt

server # ls -l /mnt
total 1048868
drwxrwxr-x  2 root  operator         512 Dec  8 20:10 .snap
-rw-r--r--  1 root  wheel     1073741824 Dec  8 20:12 random.img

server # umount /mnt

CD ドライブをマウントする

クライアントにて /dev/cd0 を指定して ggatec コマンドを実行します.
(イメージと合わせる為ハードディスクは再度マウントしています)

client # ggatec create -o rw 192.168.241.43 /dev/da1
ggate0

client # ggatec create -o ro 192.168.241.43 /dev/cd0
ggate1

ggate1 が CD ドライブとなりますので,これをマウントしてみます.
サーバー側の CD ドライブには,FreeBSD のインストーラーをセット済みでした.ls で見てみるとメディアの内容が表示されており,CD ドライブとしての利用が可能であることがわかります.

client # mount_cd9660 /dev/ggate1 /mnt

client # ls -l /mnt
total 92
-rw-r--r--   2 root  wheel   1023 Apr  7  2023 .cshrc
-rw-r--r--   2 root  wheel    507 Apr  7  2023 .profile
drwxr-xr-x   3 root  wheel   2048 Apr  7  2023 .rr_moved
-r--r--r--   1 root  wheel   6109 Apr  7  2023 COPYRIGHT
drwxr-xr-x   2 root  wheel   6144 Apr  7  2023 bin
drwxr-xr-x  14 root  wheel  10240 Apr  7  2023 boot
dr-xr-xr-x   2 root  wheel   2048 Apr  7  2023 dev
drwxr-xr-x  29 root  wheel  14336 Apr  7  2023 etc
drwxr-xr-x   5 root  wheel  10240 Apr  7  2023 lib
drwxr-xr-x   3 root  wheel   2048 Apr  7  2023 libexec
drwxr-xr-x   2 root  wheel   2048 Apr  7  2023 media
drwxr-xr-x   2 root  wheel   2048 Apr  7  2023 mnt
drwxr-xr-x   2 root  wheel   2048 Apr  7  2023 net
dr-xr-xr-x   2 root  wheel   2048 Apr  7  2023 proc
drwxr-xr-x   2 root  wheel   2048 Apr  7  2023 rescue
drwxr-xr-x   2 root  wheel   2048 Apr  7  2023 root
drwxr-xr-x   2 root  wheel  20480 Apr  7  2023 sbin
drwxrwxrwt   2 root  wheel   2048 Apr  7  2023 tmp
drwxr-xr-x  13 root  wheel   2048 Apr  7  2023 usr
drwxr-xr-x  24 root  wheel   4096 Apr  7  2023 var

注意点

このように,簡単にネットワーク越しにデバイスを共有できるのですが,いくつか注意点があります.

  • rc.d スクリプトが用意されていない
  • ネットワークの暗号化はされていない
  • 提供したデバイスを接続できるクライアントは1台のみ

rc.d スクリプトが用意されていない

起動・停止にあたり /etc/rc.conf および rc.d スクリプトがない為,自前で起動時,停止・再起動時の処理を書く必要があります.
サーバー側は rc.local に先のコマンドを記載するだけで大丈夫ですが,クライアント側はマウント処理が終わり次第,必要なサービスを起動させる等の対処が必要となります.

ネットワークの暗号化はされていない

NFS も同様なのであまり気にするポイントではないかもしれませんが,盗聴のリスクがある事は理解しておく必要があります.
必要に応じて IPSec 張る等を考えなければなりません

提供したデバイスを接続できるクライアントは1台のみ

複数のクライアントに同じデバイスを提供,複数のクライアントが同時に接続する事はできません.
一番最初に掴んだクライアントが優先され,以降のクライアントは接続に失敗します.

iSCSI 経由のディスクマウントと同じような利用方法はできません.


FreeBSD 10.0 より,iSCSI Target が標準で利用できるようになっている為,GEOM GATE の出番はほぼ無いと思います.が,簡単に共有ができるのでちょっとしたデバイスの論理的な移動を行いたい場合には使いようはあるかと思います.

以上で GEOM GATE についての解説を終了します.




seichan

ご連絡は X (twitter) の DM へお願いします.

seichanをフォローする
GEOM

seichanをフォローする




コメント

タイトルとURLをコピーしました