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

久しぶりにNICのFirm更新をしてみる。

2009年11月28日 土曜日

Intel iSCSI Remote Boot Setup Utility 14.7(10/23/2009) に含まれる
ISCSIUTLでカードを更新すると2.3.81になりました。

このバージョンにてブートしようとするとistgtのログに

>istgt_iscsi.c:3635:istgt_iscsi_transfer_out: ***WARNING*** lun(0×7457809901000002)

こんな感じのログが大量に吐き出されます。
よくよく考えると、警告ログを省略する手段が存在しない。
(トレースログの変更は可能ですが)
警告の内容自体は動作に影響を及ぼすものではないので無視できます。
まぁ、警告が出る時点でistgtがダメなのかもだけど変更できたほうがいいかも。

Intel PRO1000/PT Server Adapter(2.3.81) + Windows Server 2008 R2
のディスクレスブートを確認しました。

VirtulBOX 3.0.12でiSCSIディスクが認識し、VM起動ができる事を確認しました。

istgt-20091124がportsにコミットされました。
portsnap/potrtupgrade等でどうぞ。

FreeNAS方面は別記事にします。

FreeBSD iscsi-target MCS/64bitLBA/仮想DVD/仮想テープパッチ 2009/1/17版 for Microsoft iSCSI Initiator

2009年1月18日 日曜日

更新>MCS/64bitLBA/仮想DVD/仮想テープパッチ 2009/1/22版

仮想デバイスの構想一ヶ月、メディアの交換が正常にできずに悩むこと一週間あまり、やっと動くようになったので公開します。
記念すべき今年初のリリースです。
何か要望とかあればブログコメントでもメールでも構わないのでよろしくお願いします。

マルチパスの対応は都合によりしばらく凍結します。
またZFS/IPv6/64bitLBA以外の問題は後回しにします。
当面仮想デバイスの開発調整を最優先事項とします。
とりあえず実行速度よりロジック優先で作成してあります。
まずは仮想CD/DVDROMと仮想テープドライブ(DLT8000を想定)をリリースします。
現時点でバックアップリストアの基本動作確認のとれたソフトは

Windows 2000 Sever SP4 添付のWindowsバックアップ
Windows Server 2003 R2 添付のWindowsバックアップ
Symantec BackupExec 12.5 for Windows Server
FreeBSD 7.x の tar/mt コマンド
GNU tar 1.20 マルチボリューム

BackupExecに関してはiSCSI接続後にホットスワップ対応デバイスウィザードを
実行する事によりデバイスプールに追加できます。

※注意事項※
DLT8000が解釈できないコマンド類はエラーとしてsyslogに記録されますがテープの動作は行います。
現在の所、制御ポート経由(telnet等)で任意のターゲットのメディア操作が出来てしまいます。

それにしてもサイズがすんごい大きくなった。
パッチ元はFreeBSDで利用されてないコードを含めても2万行もないのに
仮想DVDと仮想テープドライブ対応だけで9千行を超えてサイズも500kに達してる。
もはやパッチレベルの範疇を超えてる気が。

そして、インストールテスト中に気が付いたけど制御コマンドのインストールとか
まったく考えてなかった(涙)とりあえず手動コピーでよろしく。

今後の予定もとい導入したほうがよさそうな事?
☆メディア制御をもうすこし賢い方法にする。
☆SCSIパススルーデバイスを追加する。
☆USBメモリ等のリムーバブルデバイスにも対応する。
☆デバイスのホットスワップに対応する。
☆複数のメディアスロットをサポートする。
☆複数イニシエータからの接続を可能にする。
☆マルチパスを考慮する。

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

# cd /usr/ports/net/iscsi-target
# make clean
# make patch
# bzcat < /path/to/iscsi-target-20090117-patch.bz2 | patch -p0
# make
# make install
#
# cp -p work/netbsd-iscsi-20080207/src/istgtcontrol /usr/local/bin/
#

手動でメディア制御コントローラーをインストールしてください。
これは仮想DVDやテープの取り出し交換などに使います。

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

新しい機能:
targetsファイル内のlengthカラムで加減算で一個だけ追加指定できます。
ZEPTGMKのサフィックスも合わせて利用できます。
1023MBの指定例: 1GB-1MB (=1024MB-1MB=1023MB)
1025MBの指定例: 1GB+1MB (=1024MB+1MB=1025MB)

targetsファイル内の各targetにデバイス固有値を指定できます。
type 仮想デバイスのタイプ
 disk SBC-2準拠 Direct access block device
 dvd  MMC-4準拠 CD/DVD device (現在はRead系のみ)
 tape SSC-2準拠 Sequential-access device
id 仮想デバイス識別子
 1~2147483647(重複不可)

省略時はtype=disk,id=自動採番(0×0100~)と解釈します。
現時点ではidは装置シリアル番号の下位4桁に利用しています。省略可能です。

targetsファイルでリムーバブルメディアを定義できます。
type メディアタイプ
 iso ISOイメージ
 tape 仮想テープイメージ
flags メディアフラグ
 rw 読み書き用とします。
 ro 読み込み専用とします。(ライトプロテクト状態でイニシエータに応答)
 extend メディアの末尾まで書き込みした場合に可能であれば256MB単位で拡張します。
 dynamic メディアの書き込み状況に応じて可能であれば拡大縮小します。

メディアを読み書き用にしてもtarget指定がroならば書き込み不可能です。
メディアサイズの拡大縮小はtype=tapeのみサポートします。
dynamicを指定した場合はメディアの長さ指定は意味がありません。
現時点ではidカラムは特に利用していません。省略可能です。

※targetsの書式は将来変更する可能性があります

# mcs extra style
#
# media         type    id      flags           file                    length
#
media31         iso     1       ro              /tank/iscsi/dvds/7.1-RELEASE-i386-disc1.iso auto
media41         tape    41      rw              /tank/iscsi/tapes/41    20GB
media42         tape    42      rw,extend       /tank/iscsi/tapes/42    40GB
media43         tape    43      rw,dynamic      /tank/iscsi/tapes/43    auto
#
# target        type    id      flags           storage         netmask
#
target2         disk    2       rw              extent2         192.168.2.0/24
target3         dvd     3       ro              media31         192.168.2.0/24
target4         tape    4       rw              media41         192.168.2.0/24
#

制御用ポートとしてiSCSIターゲットポートの次の番号でオープンするようになりました。
デフォルトのiSCSI標準ポートは3260なので制御ポートは3261になります。

既知の問題:
iSCSIで接続しても正常に通信出来ずにPnPデバイスとして認識しない事があります。
(一度iSCSI接続をログアウトして再接続すると認識されます)
仮想テープの入出力にエラーが発生した場合、以後の書き込みができない可能性があります。
(メディアを一旦取り出して再挿入すると認識するかもしれない)
極端に小さい論理ブロック長でテープに大量に書き込むと論理ブロック数が不足する可能性があります。
(内部的には64ビットですが現時点の対応ポジション変更系コマンドが32ビットなので)
メディア交換した直後にエラーなどが発生する可能性があります。
(ターゲットから非同期通信を行わない為、イニシエータがポーリングするまで内部情報が変化しない)
メディア制御用のセキュリティが特に考慮されていない。
メディア制御用コマンド istgtcontrol が自動でインストールされない。

いわゆる仕様:
仮想デバイスは利用時(コマンド実行時)ロックのみでリザーブ・リリースに対応していない。
(複数イニシエータからはもちろん、単機のマルチパス接続も想定していない)
仮想デバイスのホットスワップには対応していない。
テープドライブの圧縮機能は実装していない。
単一の書き込みメディアを複数の仮想デバイスに装着した場合の動作は未定義。
メディアのアンロードを行ってもメディアスロット内に残留するので次のロードで再セットされる。
動的仮想テープのハードリミット(最大サイズ)が16EBの固定になっている。
1本の仮想テープでは最大1024個のファイルマーク(BOT/EOTを含む)に限定される。

主な修正点:
LUNの計算を間違えていたのを修正しました。
違うターゲットに接続した場合に誤ってエラーが記録されるのを修正しました。
MODE SELECT(10)が正常に動かないのを修正しました。
MODE SENSE(6)(10)がショートモードで正しいブロック数を返さないのを修正しました。
数値指定で加減算表記をできるように変更しました。
マルチターゲット仕様のために内部データ構成を変更しました。
tagetsファイルの定義を拡張しました。
SCSIエラー時にセンスキーやASC/ASCQを返すようになりました。
SSC2/MMC4のデバイスエミュレーションに対応しました。
オーバーフローとアンダーフローをiSCSI PDUに返すように修正しました。
メディアの拡大縮小を考慮するように変更しました。
パッチ元のオリジナルに存在するバグを多数修正しました。
メディア制御用スレッドを新設しました。
スレッドの作成結果を調べていないバグを修正しました。
メディア制御コマンドが新設されました。

~メディア制御のしかた~
まず、制御対象がローカルホストであり、上記の設定がされていると仮定すると、
target3のDVD装置にはメディアスロットmedia31が付いていて、
/tank/iscsi/dvds/7.1-RELEASE-i386-disc1.iso が挿入されている状態になります。

このメディアを排出するにはOS上から取り出しを実行するか、以下のコマンドで行います。
(コマンド行が長いので複数行に書きますが実際は一行です)

# istgtcontrol -t iqn.1994-04.org.netbsd.iscsi-target:target3 -m media31 unload

この状態はトレイ式DVDドライブのトレイが開いた状態に相当します。(メディア変更なし)
以下のコマンドでトレイを閉めると同じメディアが読み込みされます。

# istgtcontrol -t iqn.1994-04.org.netbsd.iscsi-target:target3 -m media31 load

メディア自体を交換するにはファイルを指定します。追加でフラグとサイズも指定できます。

# istgtcontrol -t iqn.1994-04.org.netbsd.iscsi-target:target3 -m media31 -f ro -s auto change /tank/iscsi/dvds/7.1-RELEASE-i386-disc2.iso

ここで指定するファイル名は制御ターゲットサーバにある実際のパスです。
今のところリモートメディアをマウントする事はできません。
フラグとサイズの省略時はrwとautoになります。
空白文字を含むファイル名はもちろんクオートしてください。

このコマンドを実行すると現在のメディアをunloadしてメディアを交換した後に
loadするという一連の作業を排他ロックをかけた状態で行います。
不幸にしてロードに失敗した場合は可能ならunload状態で終了します。
成功するにしても失敗するにしてもコマンドが終了するまではOSなどからアクセスはできません。

現在のメディア状態をみるには、以下のコマンドを使います。

# istgtcontrol -t iqn.1994-04.org.netbsd.iscsi-target:target3 -m media31 list

実行例:

# istgtcontrol -t iqn.1994-04.org.netbsd.iscsi-target:target3 -m media31 list
iqn=iqn.1994-04.org.netbsd.iscsi-target:target3, slot=media31
media file=NULL, flags=rw, size=auto
connect to localhost:3261
target banner "iSCSI Target Controller version 20090117 on ::1 from ::1"
slot1 present unlock media31 iso 1 ro "/tank/iscsi/dvds/7.1-RELEASE-i386-disc1.iso" auto
DONE LIST command

以上の操作をリモートから実行するには -h オプションでターゲットホストを指定します。

あけましておめでとうございます

2009年1月1日 木曜日

新年あけましておめでとうございます。
今年もよろしくお願いいたします。

昨年を振り返ってみると、Hyper-Vのパッチを公開してからアクセスが急激に伸びました。
FreeBSDでも興味ある人はそこそこいるのだなと(笑)
むろん海外からもアクセスされるようになったのも一因でしょうけど、
こんな場所でもアクセスして頂けるのはありがたい。
↓統計はこんな感じ。ちなみに検索キーワードはfreebsd,iscsi,hyepr-v,zfsとなってました。

そのHyper-Vによってテスト環境構築の手間がすごい削減されました。
VirtualServerに幻滅していただけにちょっとだけ見直した。
ZFSとかもっと触りたかったのだけど後半はiSCSIパッチだけに集中していたので、
あまりできなかった。残念。↓去年解決できなかった機能のスクリーンショット。

リームバブルメディアをどうやって簡単に出し入れするのかとか、
一度挿入されたメディアは不測の再起動でも永続的に使えるようにするとか、
考慮することが多すぎて(略)
この機能をなんとする為に複数動かせるように改造してたり(笑)
Hyper-VでのVM用のシステムディスク領域には20081225パッチ版でのMCS接続で安定して動いています。
上記画像の2003自体もこのiSCSIディスク上に容量可変で構築してあります。

今年も引き続きiSCSIとZFSを中心に活動していけたらと思います。

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

2008年12月25日 木曜日

機能UP更新>MCS/64bitLBA/仮想DVD/仮想テープパッチ 2009/1/17版

今年最後のパッチリリースです。
ただいま将来の拡張に向けていろいろ準備中です。
ライトキャッシュの操作を揮発性(iscsi-targetを終了するまで)ですが
変更できるようになりました。

パッチファイル: iscsi-target-20081225-patch.bz2

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

新しいコマンドラインオプション:
-C 同一ターゲットへの接続コネクション数(デフォルト8)
-P 接続可能なポータルのIPアドレス(セミコロン区切り)
-A Discoveryセッションにも認証を強制する(デフォルトなし)
-a <path> 認証用データファイル(デフォルト /usr/local/etc/iscsi/auths)
-i <path> 作成するPIDファイル(デフォルト /var/run/iscsi-target.pid)

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

新しい機能:
64ビットLBAを用いて最大8ZB(2^64(16E)x512B)まで対応できます。
いまのところZFS以外のファイルシステムをサポートする予定はありません。
2TB以上はGPT(GUIDパーティションテーブル)を使えるOSが必要です。

認証ファイル及びPIDファイルを個別に指定し複数のポートで起動できます。

認証なしで探索(Discovery)セッションを通さないモードが選択できます。

MCS(Multiple Connections per Session)機能により複数コネクションで
同一のターゲットに接続可能になります。

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

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

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

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

targetsファイル内のsizeカラムにペタバイト、エクサバイト、ゼタバイトの
短縮形としてP, E, Zが利用できます。
それぞれ、PB=1024TB, EB=1024PB, ZB=1024EBとして計算されます。

targetsファイル内でクォート文字(“と’)により空白文字を
文字列の一部として扱えます。

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

相互認証を有効にできます。
認証情報は/usr/local/etc/iscsi/authsに書きます。
相互認証キー(ユーザ名)はターゲットのIQNになります。

IPv6のリンクローカルアドレスでの接続を考慮します。

いわゆる仕様:
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。
ダイジェストエラーになった場合にTCP接続の強制終了を第一選択肢にする。
デバイスの最大容量(LBA)が符号付64ビット(2^63=8EB)に制限されています。

主な修正点:
SCSIのライトキャッシュを切られたらO_FSYNCを設定するように修正しました。
シグナル処理用スレッドを新設しました。(処理は未実装)
SIGTERM/SIGINTに対してシャットダウン処理を行うように修正しました。

~参考設定~
ターゲットにはしばらくブログに書いてきた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

# CHAP secret
# 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、ターゲットポータルを別のものを指定します。

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

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

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

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

/usr/local/etc/iscsi/auths

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

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

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

~2TB以上の容量~
Windows Server 2003以降またはWindows Vistaが必要です。
Windows 2000やWindows XPで利用する場合は2TB(2097152MB)未満にします。

大容量ドライブの利用についてはこちらも参照してください。
http://shell.peach.ne.jp/aoyama/archives/191

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

2008年12月24日 水曜日

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

iscsi-targetの内部構造もだいぶ理解できたので、
簡易同期機能を廃止してまともに追従するようにしてみました。

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

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

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

主な修正点:
メディアの境界チェックが甘かったのを修正しました。
ソースコードの切り分け定義名を変更しました。
従来のMCS簡易同期機能を廃止してより正確に追跡するようになりました。
再接続時にクラッシュする事があったのを修正しました。

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

2008年12月22日 月曜日

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

IPv6のリンクローカルアドレスで接続した場合も処理できるようになりました。
複数のiscsi-targetを起動した場合でも使えるように、
認証ファイル及びPIDファイルを個別に指定できるようになりました。
認証なしで探索もできないモードをつけてみました。
64ビットLBAを用いて最大8ZB(2^64(16E)x512B)まで対応できるようになりました。
(FreeBSD7.1/i386においては符号付64ビット処理の関係で実質8EBが限界)
いまのところZFS以外のファイルシステムをサポートする予定はありません。
ゼタバイト~ヨタバイトのファイルが問題なく作れるようになったら考えるかも?

Windowsで2TB以上のデバイスを利用する場合はGPTが必要になるので、
Windows Server 2003以降またはWindows Vistaが必要です。
2TB以上でブートするには64ビット版 Windows Server 2008または
64ビット版 Windows Vistaが必須ですが未確認です。
Windows 2000やWindows XPで利用する場合は2TB(2097152MB)
未満にします。

~参考URL~
MS WHDC:GPT ドライブを使用する
http://www.microsoft.com/japan/whdc/device/storage/GPT-on-x64.mspx

MS TechNet:GUID パーティション テーブル
http://technet.microsoft.com/ja-jp/library/cc773223.aspx

MS Support:1 ボリュームのサイズが 2 TB 以上のシステム パーティションから Windows Vista を起動できない
http://support.microsoft.com/kb/946557/ja

MS Support:Windows Server 2003、Windows XP、および Windows 2000 で Diskpart.exe を使用してデータ ボリュームを拡張する方法
http://support.microsoft.com/kb/325590/ja

2TB以上のデバイス利用時の注意点:
現時点のWindows Server 2008はGUI上の表示が2147483648MBに
制限されます。
これは2PB(=2048TB)に相当します。
2PB以上のデバイスはdiskpartコマンドラインユーティリティで動くようですが
未確認です。

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

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

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

新しいコマンドラインオプション:
-A Discoveryセッションにも認証を強制する(デフォルトなし)
-a <path> 認証用データファイル(デフォルト /usr/local/etc/iscsi/auths)
-i <path> 作成するPIDファイル(デフォルト /var/run/iscsi-target.pid)

新しい機能:
targetsファイル内のsizeカラムにペタバイト、エクサバイト、ゼタバイトの
短縮形としてP, E, Zが利用できます。
それぞれ、PB=1024TB, EB=1024PB, ZB=1024EBとして計算されます。

設定ファイルでクォート文字(“と’)により空白文字を文字列として扱えます。

リンクローカル設定例:
実際に設定する場合はifconfigでアドレスを確認すること。
/etc/rc.conf

ipv6_enable="YES"
iscsi_target_enable="YES"
iscsi_target_flags="-s 32 -C 8 -P '192.168.2.36;[fe80::290:ccff:fee9:48c9]'"

/usr/local/etc/iscsi/targets

# extents       file                            start   length
extent0         /tank/iscsi/iscsi-target0       0       80GB
# target        flags           storage         netmask
target0         rw,digest       extent0         192.168.2.0/24;[fe80::%em0]/10

既知の問題:
長時間ターゲットからの応答がないとWindowsがクラッシュすることがあります。

いわゆる仕様:
全てのIPアドレスが同じポート番号でグループ1のネットワークポータルになります。
ポート番号は従来の-pオプションで変更可能ですがグループ番号は固定です。
ダイジェストエラーになった場合にTCP接続の強制終了を第一選択肢にする。
デバイスの最大容量(LBA)が符号付64ビット(2^63=8EB)に制限されています。

主な修正点:
オリジナルのバグを修正しました。
Discoveryセッションに認証を強制するオプションを追加しました。
リセットが必要ない場所でリセットしていたので修正しました。
リンクローカルアドレスを処理するように修正しました。
認証ファイル及びPIDファイルを指定できるように修正しました。
LOパラメータを維持できるように修正しました。
LBA4294967040以降にアクセスできない問題を修正しました。
SCSIコマンドのMODE SELECT(6)に応答するようにしました。
SCSIコマンドのMODE SELECT(10),MODE SENSE(10)に応答するようにしました。
SCSIコマンドのREAD CAPACITY(10)をLongLBAに対応しました。
SCSIコマンドのREAD CAPACITY(16)に応答するようにしました。
SCSIコマンドのSYNC CACHE(16)に応答するようにしました。
SCSIコマンドのREAD(12),WRITE(12),WRITE VERIFY(12)に応答するようにしました。
SCSIコマンドのREAD(16),WRITE(16),WRITE VERIFY(16)に応答するようにしました。
ストレージ容量定義にZEPの単位を追加しました。
コンフィグファイルでクォートを解釈するようになりました。

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コマンドのロック範囲を当該スレッドのみに制限しました。
データダイジェスト及びヘッダダイジェストに対応しました。
ポータルの区切り文字がカンマからセミコロンに変更されました。
書込みストリームが異常な場合にはエラー戻りに変更されました。
マルチパスの状態でもできるだけ動くように修正しました。