‘ネットワーク’ カテゴリーのアーカイブ

FreeBSD iscsi-target MCS/MPIOパッチ 2008/12/18版 for Microsoft iSCSI Initiator

2008年12月19日 金曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

通信エラー発生時の不具合を多々修正しました(汗)
相互認証に対応しました。

パッチファイル: iscsi-target-20081218-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081218-patch.bz2 | patch -p0
# make
# make install

設定例は以前の投稿をどうぞ。

新しい機能:
ログイン時の相互認証を有効にできます。
認証情報は/usr/local/etc/iscsi/authsに書きます。

主な修正点:
リセットが発生した場合に当該スレッドを正常終了するように変更しました。
リセット時にセッションデータをクリアできない問題を修正しました。
エラー再接続時にマルチパスと誤認識する問題を修正しました。
エラー再接続時に旧コネクションを強制終了するように変更しました。
相互認証関係を追加しました。

~参考設定~
相互認証を実施するにはイニシエータにシークレットを設定して、
その設定をターゲット側にも設定します。
(通常のCHAPシークレットの設定も必要です)
現時点ではユーザ名はターゲットのIQN(iSCSI Qualified Name)に固定されています。

イニシエータ側(Windows Server 2008):
iSCSIイニシエータのプロパティで全般タブの[シークレット]を押します。

12文字以上16文字以下でシークレットを設定します。

ターゲット側(FreeBSD 7.1):
現時点では相互認証データは通常の認証ファイルと同じになっています。

/usr/local/etc/iscsi/auths

# name:type:secret
# mutual authentication
iqn.1994-04.org.netbsd.iscsi-target\:target1:CHAP:testchaptest1234
#

FreeBSD iscsi-target MCS/MPIOパッチ 2008/12/17版 for Microsoft iSCSI Initiator

2008年12月18日 木曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

SCSIステータスを最終パケットで返すようになったので、
小さいサイズでのREAD処理が早くなってネットワーク的に優しくなったはず?
一部の挙動が時々おかしいのだけど、何やらmallocで確保した領域が
すべてゼロクリアされている事を期待しているのかもしれない。
全コードを精査するのは面倒なので、後ろ向きにゼロクリアしてみた。
ここで精査するぐらいなら書き直します(笑)
なんだか当初の予定とは別の方向にいってるような気が・・・(汗)
とりあえず、一ヶ月間の作業成果はこんな感じです。

パッチファイル: iscsi-target-20081217-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081217-patch.bz2 | patch -p0
# make
# make install

新しいコマンドラインオプション:
-C 同一ターゲットへの接続コネクション数(デフォルト8)
-P 接続可能なポータルのIPアドレス(セミコロン区切り)

※IPv6で指定する場合は[]付きでIPv6アドレスを書きます。

新しい機能:
targetsファイル内のネットマスクをセミコロン区切りで複数指定できます。
ネットマスク指定で/以降を省略するとIPv4は/32、IPv6は/128とみなします。

targetsファイル内のflagsカラムにターゲット接続(ログイン)時の
認証とダイジェストを強制するフラグを指定できます。

auth          認証を必要とします。
digest        データおよびヘッダダイジェストを必要とします。
headerdigest  ヘッダダイジェストを必要とします。
datadigest    データダイジェストを必要とします。

認証情報は/usr/local/etc/iscsi/authsに書きます。
Microsoft iSCSI Initiator が相手の場合はシークレットを
12文字以上16文字以下で指定します。

ダイジェスト機能(CRC32によるデータチェック)を有効にできます。
データダイジェスト=ディスクへの読み書きデータなどに有効。
ヘッダダイジェスト=iSCSIプロトコルヘッダに有効。

いわゆる仕様:
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。
ダイジェストエラーになった場合にTCP接続の強制終了を第一選択肢にする。
相互認証(mutual authentication)には対応していません。

主な修正点:
ビット演算を気休め的に変更してみました。
mallocで領域確保時に毎回ゼロクリアするように変更しました。
ターゲットログイン時に認証やダイジェストを強制するモードをつけました。
ターゲットログイン時にネットマスクに一致しないイニシエータは拒否するようになりました。
SCSIコマンドのModeSense(6)に少し応答するように変更しました。
Data-Inフェーズの最終PDUでSCSIコマンドステータスも返すように変更しました。
タスクコマンドを正しく処理できなかったのを修正しました。
デフォルトの同時接続数を8に変更しました。

~参考設定~
ターゲットにはしばらくブログに書いてきたExpress5800/110Ge
Intel PRO 1000/PT Desktop Adapter を増設して利用しました。
ホストはWindows Server 2008に同型カードを挿しました。
それぞれのカードのIPアドレスを別のネットワークにして、
スイッチングハブをそれぞれに独立して接続します。
(参考設定ではIPv4に192.168.2.0/24と192.168.3.0/24を、
IPv6に2001:380:e00:42::/64をルータ広告で利用)

ターゲット側(FreeBSD 7.1):
/etc/rc.conf

ifconfig_em0="inet 192.168.3.36  netmask 255.255.255.0"
ifconfig_em1="inet 192.168.2.36  netmask 255.255.255.0"

ipv6_enable="YES"
iscsi_target_enable="YES"
iscsi_target_flags="-s 32 -C 8 -P '192.168.2.36;192.168.3.36;[2001:380:e00:42:21f:d0ff:fe16:38bd]'"

/usr/local/etc/iscsi/targets

# extents       file                            start   length
extent0         /tank/iscsi/iscsi-target0       0       80GB
extent1         /tank/iscsi/iscsi-target1       0       80GB
extent2         /tank/iscsi/iscsi-target2       0       80GB
# target        flags           storage         netmask
target0         rw,auth         extent0         192.168.2.0/24
target1         rw,digest       extent1         192.168.2.33;129.168.3.33/32;[2001:380:e00:42:a957:4bf:58e0:bedc]/128
target2         rw,auth,headerdigest extent2    192.168.2.0/24;129.168.3.0/24

/usr/local/etc/iscsi/auths

# name:type:secret
iqn.1991-05.com.microsoft\:ceres:CHAP:1234567890123456

ホスト側(Windows Server 2008):
オンボードLANに192.168.2.33/24を、
Intel PRO 1000/PTに192.168.3.33/24を割り当てました。
ここではIPv4による画像のみ掲載しますがIPv6でも同様に接続できます。

ターゲットへログオンするときに[詳細設定]でローカルアダプタ、ソースIP、
ターゲットポータルを指定します。

必要に応じてダイジェストにチェックを付けて有効にします。
(指定しなくてもターゲット側で強制していれば自動的に有効になります)

接続に認証が必要な場合は指定します。

接続できたら、[詳細]でターゲットのプロパティを開きます。
セッションタブの[接続]を押します。

[追加]を押します。

ソースIP、ターゲットポータルを別のものを指定します。

必要に応じてダイジェストおよび認証を指定します。

負荷分散ポリシーを適当に変更します。

FreeBSD iscsi-target MCS/MPIOパッチ 2008/12/11版 for Microsoft iSCSI Initiator

2008年12月12日 金曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

探索ログインの時にデータダイジェストを使うとエラーになる事が
あったので修正しました。
ネットマスクをセミコロン区切りで複数IPに対応しました。
(オリジナルが対応していないIPv6についても暫定対応)
ネットマスク指定で/以降を省略するとIPv4は/32、IPv6は/128とみなします。

パッチファイル: iscsi-target-20081211-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081211-patch.bz2 | patch -p0
# make
# make install

/etc/rc.conf

ipv6_enable="YES"
iscsi_target_enable="YES"
iscsi_target_flags="-s 32 -C 4 -P '192.168.2.36;192.168.3.36;[2001:380:e00:42:21f:d0ff:fe16:38bd]'"

/usr/local/etc/iscsi/targets

extent0         /tank/iscsi/iscsi-target0       0       80GB
extent1         /tank/iscsi/iscsi-target1       0       80GB
target0                 rw      extent0         192.168.2.0/24
target1                 rw      extent1         192.168.2.33;129.168.3.33/32;[2001:380:e00:42:a957:4bf:58e0:bedc]/128

いわゆる仕様:
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。
ダイジェストエラーになった場合にTCP接続の強制終了を第一選択肢にする。

主な修正点:
テキストネゴシエーションのバッファ長が増加しました。
データダイジェストでテキスト文字列のパディングを考慮するように修正しました。
ネットマスクをセミコロン区切りで指定できるように修正しました。

MCS/MPIOパッチ修正 2008/12/05版

2008年12月6日 土曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

複数イニシエータから同時にアクセスがあった場合に
パフォーマンスが悪くなっていたので修正しました。
MCSとMPIOのどちらでも接続できるように修正してみました。
ただし、まだ実験的なのでデータ破壊されても自己責任でよろしく。
ついでに独自管理テーブルとダイジェスト機能を作ってみた。
スレッドとデバイスのロック時間を減らしてみた。
ポータルの指定方法が変更されたので/etc/rc.confの修正を忘れずに。

パッチファイル: iscsi-target-20081205-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081205-patch.bz2 | patch -p0
# make
# make install

新規オプション:
-C 最大接続コネクション数(デフォルト4)
-P 接続可能なポータルのIPアドレス(セミコロン区切り)

設定例は以前の投稿をどうぞ。

IPv6でポータルを指定するには[]でIPv6アドレスを書きます。
Microsoft iSCSI InitiatorではソースアドレスにIPv6を指定して、
ここで指定したポータルを設定すればIPv6で接続できます。

/etc/rc.conf

ipv6_enable="YES"
iscsi_target_enable="YES"
iscsi_target_flags="-s 32 -C 4 -P '192.168.2.36;192.168.3.36;[2001:380:e00:42:21f:d0ff:fe16:38bd]'"

ダイジェスト(CRC32によるデータチェック)を有効にするには、
ログイン時の詳細設定でチェックボックスに印を付けます。
データダイジェスト=読み書きデータなどに有効。
ヘッダダイジェスト=iSCSIプロトコルヘッダに有効。

マルチパス(まだ実験的)にするには、
MPIOをあらかじめインストールしてログイン時に、
マルチパスを有効にチェックして詳細設定からIPを指定します。
マルチパスを使うときはダイジェストを両方使うことを推奨します。
マルチパスの設定を変更するには、
1.iSCSIイニシエータのプロパティからターゲットタブを選択する。
2.[詳細]ボタンでターゲットのプロパティを開く。
3.デバイスタブの詳細設定からデバイス詳細を開く。
4.MPIOタブを選択し、負荷分散ポリシーを変更します。

左側がマルチパス(2本接続)、両方のダイジェスト有効のとき。
右側が通常接続、両方のダイジェスト有効のとき。

 

既知の問題:
ダイジェストエラーになった場合にTCP接続の強制終了を第一選択肢にする。
(可能であればリトライ復帰ルーチンをいれるべき)

いわゆる仕様:
ネットマスクはまだ対応していないので0/0が必要です。
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。

主な修正点:
独自管理テーブルを作成してスレッドを制御するようになった。
TSIHが消えることがあったのを修正しました。
SCSIコマンドのロック範囲を当該スレッドのみに制限しました。
データダイジェスト及びヘッダダイジェストに対応しました。
ポータルの区切り文字がカンマからセミコロンに変更されました。
書込みストリームが異常な場合にはエラー戻りに変更されました。
マルチパスの状態でもできるだけ動くように修正しました。

MCSパッチ修正 2008/12/02版

2008年12月3日 水曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

またしても問題が。
TSIH (Target Session Identifying Handle)が消えてしまうけど、
マルチセッション>マルチコネクションとかにしなければ大丈夫そう。
そもそもターゲットを1スレッドが全部握っているiscsi-targetのままではどうにも・・・。
根本的にはI/O系を全部書き直すしかないのかな。

パッチファイル: iscsi-target-20081202-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081202-patch.bz2 | patch -p0
# make
# make install

新規オプション:
-C 最大接続コネクション数(デフォルト4)
-P 接続可能なポータルのIPアドレス(カンマ区切り)

設定例は以前の投稿をどうぞ。

IPv6で指定するには[]でIPv6アドレスを書きます。
Microsoft iSCSI Initiator ではソースアドレスにIPv6を指定して、
ここで指定したポータルを設定すればIPv6で接続できます。

ipv6_enable="YES"
iscsi_target_enable="YES"
iscsi_target_flags="-s 32 -C 4 -P 192.168.3.36,[2001:380:e00:42:21f:d0ff:fe16:38bd]"

 

既知の問題:
マルチセッションで一つでもログアウトするとTSIHが消えてしまう。

いわゆる仕様:
ネットマスクはまだ対応していないので0/0が必要です。
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。

主な修正点:
マルチセッションが張られた場合などに各スレッドからSCSIコマンドが
ぶつからないようにミューテックスをいれました。

MCSパッチ修正 2008/11/30版

2008年12月1日 月曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

やっぱりバグバグだった。

パッチファイル: iscsi-target-20081130-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081130-patch.bz2 | patch -p0
# make
# make install

新規オプション:
-C 最大接続コネクション数(デフォルト4)
-P 接続可能なポータルのIPアドレス(カンマ区切り)

設定例は以前の投稿をどうぞ。

いわゆる仕様:
ネットマスクはまだ対応していないので0/0が必要です。
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。

主な修正点:
オリジナルのバグを修正しました。
セッション中の1コネクションが再接続した場合も接続を許可するようになりました。

FreeBSD 7.1 + Microsoft iSCSI Initiator / MCSパッチの新しいの

2008年11月30日 日曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

いつもエラーが出て気になっていたので修正しました(汗)

パッチファイル: iscsi-target-20081129-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20081129-patch.bz2 | patch -p0
# make
# make install

-C 最大接続コネクション数(デフォルト4)
-P 接続可能なポータルのIPアドレス(カンマ区切り)

設定例は以前の投稿をどうぞ。

いわゆる仕様:
ネットマスクはまだ対応していないので0/0が必要です。
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。

主な修正点:
正常ログアウト及びフェールオーバー時にシーケンス番号が
上書きされないようになりました。
再接続した場合に旧スレッドを破棄するようになりました。

NEC Express5800/110Ge にCore 2 Quad Q6600(G0)を載せてみる

2008年11月20日 木曜日

以前書いた予定通りCPUを載せ替えしてみました。
ついでにシャドウベイに9cmFANを追加しました。

Intel Core 2 Quad Q6600(G0ステップ)
65nm/TDP95W/FSB1066MHz/2.4GHz/キャッシュ8MB/4コア

KAMA-FLEX9cm SA0925FDB12M (2000rpm)

Core2Quad Q6600搭載後の消費電力は、
電源投入直後=>最大256W
FreeBSD loginプロンプト=>134W
ZFS上でddを1個起動=>186W
ZFS上でbzip2圧縮を4個起動=>198W

Core2Quad Q6600にしたらkvmが足りなくなりました(汗)
とりあえずシングルモードでkmem_sizeを下げて起動、
カーネルコンフィグを以下のように修正しました。
もし起動しなくなったらブートローダから手動で設定するか、
シングルモードで変更します。
↓のKVAは2KB/ページです。

Kernel CONFIG

include PAE
options KVA_PAGES=1152
nomakeoptions   NO_MODULES
makeoptions     MODULES_OVERRIDE="opensolaris zfs"
device          iscsi_initiator

/boot/loader.conf

vm.kmem_size_max="1536M"
vm.kmem_size="1536M"
vfs.zfs.arc_max="512M"
vfs.zfs.vdev.cache.size="20M"

フリーメモリの確認

# sysctl -a | grep kvm
vm.kvm_free: 253751296
vm.kvm_size: 2415915008

さっそくportsにあるbenchmarks/unixbenchを使って確認してみました。
オリジナルのExpress5800/110GeとCPU換装後の110Geと
参考にPentium4/2.2GHzで過去にとったデータです。
換装後にかけたZFS上でのdd結果もあわせて置いておきます。

見ての通りCore2ベースのCeleronならPentium4など余裕で勝てます。
マルチコアであきらかに向上してるのがわかるのが「Shell Scripts (8 concurrent)」(8プロセス並列実行)逆に下げたのが「Pipe-based Context Switching」ですね。

Q6600/ZFS raidz2(used 242GB) 書込 164.6MB/s 読込 326.6MB/s

RAID5/6の処理は重いですから、そういうのが必要ならCPU換装は有意義でしょう。
ハードウェアRAIDやソフトウェアミラーリングならCeleronでも十分使えると思う。
少なくともNetBurstのPentium4/DやCeleron300番台のマシンを置き替えるにはCPU換装前でも十分なスペックです。(消費電力的にも)
どうしてもシングルコアが気になるなら、
Pentium Dual-Core E2180 (2GHz/FSB800MHz/キャッシュ1MB/2コア)
Celeron Dual-Core E1400 (2GHz/FSB800MHz/キャッシュ512KB/2コア)
あたりを流用すれば安上がりにできると思う。
もちろんCPUを新規に買えるなら、
Pentium Dual-Core E5200(45nm/2.5GHz/FSB800MHz/キャッシュ2MB/2コア)
で決まりでしょうけど。

FreeBSD 7.1 Celeron 430 1.8GHz(FSB800MHz)

                     INDEX VALUES
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        116700.0  7486225.1      641.5
Double-Precision Whetstone                      55.0     1393.2      253.3
Execl Throughput                                43.0     1475.9      343.2
File Copy 1024 bufsize 2000 maxblocks         3960.0    40582.0      102.5
File Copy 256 bufsize 500 maxblocks           1655.0    10889.0       65.8
File Copy 4096 bufsize 8000 maxblocks         5800.0   135959.0      234.4
Pipe Throughput                              12440.0   553194.4      444.7
Pipe-based Context Switching                  4000.0   163170.9      407.9
Process Creation                               126.0     5515.3      437.7
Shell Scripts (8 concurrent)                     6.0      319.0      531.7
System Call Overhead                         15000.0   393876.6      262.6
                                                                 =========
     FINAL SCORE                                                     284.2

FreeBSD 7.1 C2Q Q6600 2.4GHz(FSB1066MHz)

                     INDEX VALUES
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        116700.0 10259315.6      879.1
Double-Precision Whetstone                      55.0     1884.9      342.7
Execl Throughput                                43.0     2296.9      534.2
File Copy 1024 bufsize 2000 maxblocks         3960.0    62334.0      157.4
File Copy 256 bufsize 500 maxblocks           1655.0    16523.0       99.8
File Copy 4096 bufsize 8000 maxblocks         5800.0   214088.0      369.1
Pipe Throughput                              12440.0   773740.0      622.0
Pipe-based Context Switching                  4000.0   129334.0      323.3
Process Creation                               126.0     5957.7      472.8
Shell Scripts (8 concurrent)                     6.0     1176.1     1960.2
System Call Overhead                         15000.0   539478.0      359.7
                                                                 =========
     FINAL SCORE                                                     414.8

FreeBSD 7.0 Pentium4 2.2GHz(FSB400MHz)

                     INDEX VALUES
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        116700.0  3613977.9      309.7
Double-Precision Whetstone                      55.0      808.0      146.9
Execl Throughput                                43.0      241.2       56.1
File Copy 1024 bufsize 2000 maxblocks         3960.0    20026.0       50.6
File Copy 256 bufsize 500 maxblocks           1655.0     5179.0       31.3
File Copy 4096 bufsize 8000 maxblocks         5800.0    63677.0      109.8
Pipe Throughput                              12440.0   257737.5      207.2
Pipe-based Context Switching                  4000.0    80782.8      202.0
Process Creation                               126.0     3264.5      259.1
Shell Scripts (8 concurrent)                     6.0       99.0      165.0
System Call Overhead                         15000.0   189032.5      126.0
                                                                 =========
     FINAL SCORE                                                     123.3
# dd if=/dev/zero of=image4G.dat bs=64k count=64k
65536+0 records in
65536+0 records out
4294967296 bytes transferred in 24.878161 secs (172640062 bytes/sec)
# dd of=/dev/null if=image4G.dat bs=64k count=64k
65536+0 records in
65536+0 records out
4294967296 bytes transferred in 12.542709 secs (342427409 bytes/sec)

FreeBSD 7.1 + Microsoft iSCSI Initiator / Multiple Connections per Session(MCS)

2008年11月19日 水曜日

更新>MCS/MPIO/64bitLBAパッチ 2008/12/25版

Microsoft iSCSI Initiator Users Guide によると
現バージョンでサポートしている冗長化は
Multiple Connections per Session(MCS)
Microsoft MPIO support
だそうな。

iscsi-targetは1コネクション(TCP)を1スレッド、
当該セッションパラメータをスレッドに埋め込みで管理しています。
もし複数スレッド間でパラメータを共有できればMCSが容易になります。
でもそこまで作りこむのはかなり時間がかかりそうなので、
動作確認の意味も込めて、スレッド内のSCSIコマンド処理前に
各スレッドから必要なシーケンス番号をコピーするという
なんちゃって同期機能をつけて対応(笑)
この動作の前提として複数スレッドが同時に同じシーケンス番号を
更新しないとすごく期待しています。
一般化するなら送受信スレッドとパケット処理スレッドを作って、
FIFOキューでつなぐのがいいと思ってるけどどうでしょ。

用意するもの:
LANを2ポート以上装備したマシン2台
スイッチングハブ2台
iscsi-targetのパッチファイル iscsi-target-20081118-patch.bz2
更新版をご利用ください。

# cd /usr/ports/net/iscsi-target
# make patch
# bzcat < iscsi-target-20081118-patch.bz2 | patch -p0
# make
# make install

-C 最大接続コネクション数(デフォルト4)
-P 接続可能なポータルのIPアドレス(カンマ区切り)

いわゆる仕様:
ネットマスクはまだ対応していないので0/0が必要です。
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。
最初に接続したコネクションが壊れるとおかしくなります。

~参考設定~
ターゲットにはしばらくブログに書いてきたExpress5800/110Geに
Intel PRO 1000/PT Desktop Adapter を増設して利用しました。
http://www.intel.com/products/server/adapters/pro1000pt/pro1000pt-overview.htm
ホストはWindows Server 2008に同型カードを挿しました。
それぞれのカードのIPアドレスを別のネットワークにして、
スイッチングハブをそれぞれに独立して接続します。
(参考設定では192.168.2.0/24と192.168.3.0/24を利用)

ターゲット側(FreeBSD7.1):
/etc/rc.conf

ifconfig_em0="inet 192.168.3.36  netmask 255.255.255.0"
ifconfig_em0_alias0="inet 192.168.3.37  netmask 255.255.255.255"
ifconfig_em1="inet 192.168.2.36  netmask 255.255.255.0"
ifconfig_em1_alias0="inet 192.168.2.37  netmask 255.255.255.255"

iscsi_target_enable="YES"
iscsi_target_flags="-s 32 -C 4 -P 192.168.2.36,192.168.3.36,192.168.2.37,192.168.3.37"

/usr/local/etc/iscsi/targets

extent0         /tank/iscsi/iscsi-target0       0       80GB
extent1         /tank/iscsi/iscsi-target1       0       80GB
target0                 rw      extent0         192.168.2.0/24
target1                 rw      extent1         0/0

ホスト側(WindowsServer2008):
オンボードLANに192.168.2.33/24を、
Intel PRO 1000/PTに192.168.3.33/24を割り当てました。

ログインするときに[詳細設定]でローカルアダプタ、ソースIP、
ターゲットポータルを指定します。

接続できたら、[詳細]でセッションのプロパティを開き、[接続]を押します。

[追加]を押します。

ソースIP、ターゲットポータルを別のものを指定します。

負荷分散ポリシーを適当に変更する。

設定はこんな感じですが、先に述べた通り最初のコネクションが
すべてのデータを持っているのでこれが死ぬと復帰できなくなります。
とりあえず動くところを見ないとね。

NEC Express5800/110Ge + WD5000AAKS + FreeBSD 7.1 ZFS/iSCSI/NFS(iSCSI/NFSの準備)

2008年11月15日 土曜日

FreeBSDでは7.1の時点でshareiscsiプロパティがサポートされていません。
iSCSIターゲットはportsのiscsi-targetを手動で利用しなくてはいけません。

# cd /usr/ports/net/iscsi-target/
# make; make install; make clean

/etc/rc.conf

iscsi_target_enable="YES"

ZFSの領域を作成してその中にイメージを置く。
/usr/local/etc/iscsi/targets

extent0         /tank/iscsi/iscsi-target0       0       80GB
target0         rw      extent0         192.168.2.0/24

iscsi-targetはZFSの設定が終るまで起動しないようにします。

# zfs create tank/iscsi
# /usr/local/etc/rc.d/iscsi_target start

NFSを利用するマシンの間にファイアウォールを使う場合は、
ポート番号をなにかしらに固定しないとひどい事になります。
-pオプションによりポート指定ができます。
なお、rpcbindは111、nfsdは2049で最初から固定です。

NFSサーバ側:
/etc/rc.conf

nfs_server_enable="YES"
rpcbind_enable="YES"
mountd_enable="YES"
↓例としてポートを822に固定してみる
mountd_flags="-r -p 822"

libwarpを使っているrpcbindの制御を特定IPだけに許可します。
ここで許可したIPでなおかつ/etc/exportsでマッチするクライアントが
NFSサーバに接続できます。
例では192.168.2.0/24にクライアントがいると仮定しています。
(注意:インストール初期状態ではALL : ALL : allowですべてのサービスが
 すべてのIPに許可されています。この行をコメント化して後の行を有効にするか、
 最初から自分ですべて書きます。)

/etc/hosts.allow

rpcbind : 192.168.2.0/255.255.255.0 : allow
rpcbind : ALL : deny

/etc/exportsは特に設定する必要はありません。
エクスポート設定はZFS上のプロパティとして設定します。
(システムが動的に/etc/zfs/exportsを作成し再読込させます)

NFS用の各デーモンを起動しますが、依存関係があるため起動順序が重要です。
わからなくなったらマシンを再起動してしまいましょう。
(rcorder /etc/rc.d/* というコマンドで順番はわかります)

# /etc/rc.d/rpcbind start
# /etc/rc.d/nfsserver start
# /etc/rc.d/mountd start
# /etc/rc.d/nfsd start

実際にポートマップがどうなっているのかは、

# rpcinfo -p

を実行するとわかります。

NFSクライアント側:
/etc/rc.conf

nfs_client_enable="YES"

設定したら起動します。

# /etc/rc.d/nfsclient start

ついでなのでsambaも入れてみた。
ここではsambaの設定はメインではないので詳細は書きませんが、
ゲストアクセスが必要な場合は、map to guest = Bad User のような
設定をグローバルにいれて、パーミッションを設定しておく。
ゲストはnobodyによるアクセスになるのでそのユーザで書込み可能にしておく。

# cd /usr/ports/net/samba3
# make; make install; make clean

/usr/local/etc/smb.conf

[global]
   workgroup = MYGROUP
   unix charset = eucjp-ms
   dos charset = cp932                

[public]
   comment = Public Stuff
   path = /tank/samba/public
   public = yes
   writable = yes

NFSによる/usr/portsの共有例:
NFSサーバ側(hera)

↓nfs用の領域を作成
# zfs create tank/nfs
↓マウント位置をデフォルト(/tank/nfs)から/nfsに移動
# zfs set mountpoint=/nfs tank/nfs
↓ports用の領域を作成し、圧縮機能ONにする
(マウントは上位のtank/nfsから継承するので/nfs/portsになる)
# zfs cretae tank/nfs/ports
# zfs set compression=on tank/nfs/ports
↓sharenfsでNFSの共有設定を指定する(/etc/exportsと同じ書式)
# zfs set sharenfs='-maproot=root -network 192.168.2.0 -mask 255.255.255.0' tank/nfs/ports
↓自分自身でマウントして最新portsを作成する
# mount hera:/nfs/ports /usr/ports
# portsnap fetch
# portsnap extract

NFSクライアント側

↓普通にマウントするだけ
# mount hera:/nfs/ports /usr/ports

ZFSボリュームの作成例(ZILがあると低速でまともに使えない):

↓4GBのボリューム作成(4GBの領域をストレージプールから予約)
# zfs create -V 4G tank/swap
↓作成したボリュームをスワップとして使って見る
# swapon /dev/zvol/tank/swap
↓起動時に自動マウントする為にプロパティを設定
# zfs set org.freebsd:swap=on tank/swap
↓不足するならいつでも領域拡大可能(ここでは8GBに拡大)
# zfs set volsize=8G tank/swap

※現バージョンでは/dev/zvol/への連続書込みは、
ボリュームブロックサイズ?の128kB毎にログ(ZIL:ZFS Intent Log)の
コミットが常時発生する為にとてつもなく遅いです。
(デフォルト設定を安全側にするのは悪くない)
もしも予期せぬサーバダウン時に更新が消失してもいいなら、

vfs.zfs.zil_disable=1

を/boot/loader.confにいれるとZILが無効になります。
ZFS自体は上書きしないトランザクション仕様なので、旧データが残るか
新データに変わるかのどっちかになるはず。
ZILは新データになるのを保証するって認識だけどよく理解できていません。

実際にWS2008からiSCSIで接続して書込みしてみると、
4GB搭載して空きメモリ1.8GB、CPU使用率96%、
I/O速度21MB/s x6台、平均書込速度59MB/s
どうみてもCPUパワーが足りていません(汗)

(zpool iostat と systat -vmstatの結果)

               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank         180G  2.55T      8     41   634K  3.95M
tank         180G  2.55T     14    505  1.77M  58.6M
tank         181G  2.55T     21    632  2.61M  73.4M
tank         182G  2.55T     27    443  3.39M  50.7M
tank         183G  2.55T     40    436  4.93M  50.6M
tank         184G  2.55T     26    457  3.30M  53.6M
tank         185G  2.55T     21    655  2.62M  76.0M
tank         186G  2.55T      8    434  1.03M  50.7M
tank         186G  2.55T     49    505  6.11M  59.5M
tank         187G  2.55T     46    541  5.73M  63.9M
tank         188G  2.54T      9    546  1.17M  63.0M
tank         189G  2.54T     49    493  6.08M  57.9M                  

Mem:KB    REAL            VIRTUAL                       VN PAGER   SWAP PAGER
        Tot   Share      Tot    Share    Free           in   out     in   out
Act   21796    5956   112032     7464 1806084  count
All  990604   13348  4368244    26004          pages
Proc:                                                            Interrupts
  r   p   d   s   w   Csw  Trp  Sys  Int  Sof  Flt        cow    7789 total
  2          40       16k   20 3621 5788  126             zfod        atkbd0 1
                                                          ozfod       atapci0 16
92.0%Sys   3.2%Intr  0.7%User  0.0%Nice  4.0%Idle        %ozfod  2090 atapci1 17
|    |    |    |    |    |    |    |    |    |    |       daefr  1999 cpu0: time
==============================================++          prcfr  2294 em0 irq256
                                         5 dtbuf    57771 totfr  1406 em1 irq257
Namei     Name-cache   Dir-cache    100000 desvn          react
   Calls    hits   %    hits   %     59876 numvn          pdwak
                                     24998 frevn          pdpgs
                                                          intrn
Disks   ad4   ad6   ad8  ad10  ad12  ad14  ad16   1050624 wire
KB/t   0.00   108   106   109   109   114   113     15920 act
tps       0   208   211   205   205   193   196   1088832 inact
MB/s   0.00 21.82 21.82 21.87 21.87 21.58 21.58           cache
%busy     0    43    43    47    44    32    40   1806084 free
                                                   204096 buf