TOP
«
»

(おそらく)世界初のiBFT対応のFreeBSD起動ドライバの試作品ができました!

これはWindowsで言う所のF6ドライバと言えば一部の人にはわかるでしょうか?
iBFTとは iSCSI Boot Firmware Table の略で見ての通りiSCSIで起動する為の
情報を詰め込んだものです。通常はNICのファームとして搭載されています。
未確認ですがgPXEでも使えるかと。

iBFTの仕様の詳細については Microsoft のサイトを参照してください。
http://www.microsoft.com/whdc/system/platform/firmware/ibft.mspx

Intel の CTデスクトップも対応しています。これについては少し前の
Windows7を起動させるブログエントリも参照してください。
NICのFirmware(BIOS)に情報を持つので、iSCSIターゲットがすでに存在すれば、
簡単にディスクレス構成が作れるようになります。
TFTP, NFS, DHCP, PXEといった特殊な設定は一切不要で、
NICの設定を間違えていなければローカルのSCSIハードディスクと同じように
アクセスすることが可能になります。

isboot.ko のモジュールはiBFTの処理部分および機能限定iSCSIイニシエータ
から成ります。イニシエータは、当初iscsi_initiator.koの機能を利用するのを
前提でのほほんとお手軽に作成してみましたが、カーネルモードからの
効率的なアクセス方法がわからず、結局自作する羽目に。
初回特典?ってことでしばらくはソース内に残して置くのでカーネルランド
開発の初心者がもがいた苦肉の策をご覧ください(笑)

なお、このイニシエータはキューイングも非同期アクセスもしない原始的な
1個づつ処理するタイプです。ただし、istgtで使っているノウハウを投入して
作ってあるので、普通に使う分には大丈夫かと思います。今後時間があれば
少しづつ改良していきます。

とりあえず、KLDを使ってやりたい事は他にあるので、これは通過点でしかないと
思って頂ければ幸いです。

作成方法ですが、上記のとおりiscsi_initiator.koに依存する予定だった為に
一部のデータ保持・処理方法がiscsi-2.2.4のヘッダファイルに依存しています。
iscsi_initiator.koを利用する、しないにかかわらず、ソースファイルを一緒に
展開しておく必要があります。
コンパイルしてできた isboot.ko 自体は単独で利用する事ができますので、
必要なマシンにコピーしても問題ありません。

以下に作成例を示します。

# cd /usr/src
# tar xvf /path/to/iscsi-2.2.4.tar.gz
# tar xvf /path/to/isboot-0.1.1.tar.gz

# make buildkernel
# make installkernel
or
# cd /usr/src/sys/modules/iscsi/isboot
# make obj
# make depend
# make all
# make install

以上で、/boot/kernel/isboot.ko が出来ているはずです。
モジュールとして使うには、/boot/loader.conf に、

isboot_load=”YES”

という行を追加するだけでOKです。
あとは、iSCSIターゲットを適当なマシンに作成して、NICのBIOSで
そのiSCSIターゲットの名前、IPアドレス等を設定すれば完了です。
マシンを再起動してNICがiSCSIターゲットを発見できれば、その後の処理は
isboot.koが全自動でよろしくやってくれます。

利用するiSCSIターゲットは特にこだわりがなければ、動作確認の取れている
istgt-20100407 以降をお勧めしておきます。

参考までに、
FreeNAS 0.7.1 5127 安定版 には istgt-20100407 が同梱、
FreeNAS 0.7.2 5226 p3 には istgt-20100606 が同梱されています。
FreeNAS 0.7.2 5226 p4 には istgt-20100606 + isboot-0.1.1 が同梱されています。

なお、直接インストールを試すにはOSインストーラにisboot.koの組み込みを
する必要があります。現時点でFreeBSD用イメージは作成していません。
FreeNAS 0.7.2 5226 p4 としてどういう感じになるのかと言う
デモストレーション用を作成しましたのでこちらもお試しください。
FreeNAS 0.7.2 5226 p4 をディスクレスのマシンで起動させれば、
インストールから起動まで試す事ができます。インストール後は、
もちろんFreeNASとしての機能を使えます。

isboot.ko が iBFTを発見してシステムに組み込まれると、以下のような
sysctl MIBが参照できるようになります。現在はすべて読み込み専用です。

net.isboot.version
net.isboot.nic
net.isboot.device
hw.ibft.nic_gateway
hw.ibft.nic_prefix
hw.ibft.target_lun
hw.ibft.target_port
hw.ibft.target_address
hw.ibft.target_name
hw.ibft.initiator_address
hw.ibft.initiator_name

sysctl実行例としてはこんな感じになります。
hw.ibftにNICで設定した値が、net.isbootにFreeBSDが割り当てたデバイス名が
見えるようになります。それぞれの値の意味は書くまでもないですよね…。

net.isboot.version: 0.1
net.isboot.nic: em0
net.isboot.device: da3
hw.ibft.nic_gateway: 0.0.0.0
hw.ibft.nic_prefix: 24
hw.ibft.target_lun: 2
hw.ibft.target_port: 3260
hw.ibft.target_address: 192.168.3.36
hw.ibft.target_name: iqn.2007-09.jp.ne.peach:isboot1
hw.ibft.initiator_address: 192.168.3.48
hw.ibft.initiator_name: iqn.2007-09.jp.ne.peach:pluto

さて、気になるパフォーマンスはというと、こんな感じでした。
Intel PRO/1000 PT Server Adapter を使って接続し、リード動作をさせると、

istgt 20100606 + isboot 0.1 ヘッダとデータダイジェスト双方(CRC32C)を有効
# dd if=/dev/da6 of=/dev/null bs=1m count=1k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 20.452429 secs (52499477 bytes/sec)

istgt 20100606 + isboot 0.1 ヘッダダイジェストのみ有効
# dd if=/dev/da6 of=/dev/null bs=1m count=1k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 17.684945 secs (60715022 bytes/sec)

istgt 20100606 + isboot 0.1 ダイジェスト無し
# dd if=/dev/da6 of=/dev/null bs=1m count=1k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 17.508400 secs (61327239 bytes/sec)

見ての通り52MB/s~61MB/s程度がでます。原始的な試作品としてはまずまずの
結果ではないかと思いますがどうでしょうか?

現在の仕様・制限など:
最初の起動や再接続(接続からLUNの検索)に時間がかかることがある。
ifconfig(8),route(8)などで起動NICの値を修正するべきではないです。
ターゲットへのクリティカルパスが落ちるとどうにもならなくなります。
モジュールのアンロード機能を使うと死ぬ事が多いです。
IPv6機能はテストされていません。
DNSアドレスなどiBFTに規定されている値を設定しません。
現時点ではキューイングやCHAP認証機能がついていません。
静的データによる認証ぐらいはやるべきかも?
iSCSIのパラメータの調整がソース修正以外にできません。
ソケット接続が消失時に運悪く実行中だったXPTコマンドがたぶん停止できません。
iscsi_initiator.koとのセッション委譲などができません。
ソースコードがiscsi_initiator.koの構造体に依存しています。
(最初はこんな予定じゃなかったのですよ!まぁ、あきらめた。)
iscontrol(8)みたいな制御コマンドが付属しません。
接続したら最後、マシンをシャットダウンするか5時間ぐらい?経過するまで、
再接続要求を出しまくります。(デフォルトでは2秒の待機時間で9999回)
なにかしら致命的なエラーが出たら停止する可能性はありますが、
その場合はOSごとハングアップするかpanicしている可能性の方が高いです。
例によってドキュメントがまったくありません。構造と値の取扱いについては
RFC3720を見てください。
最後だけど、カーネルランド初心者なので、おかしい部分とかあったり、
こうしたほうが良いとか何かあれば教えてください。

ダウンロードはこちらから
isboot-0.1.1.tar.gz

http://www.peach.ne.jp/archives/isboot/isboot-0.1.1.tar.gz

isboot-0.1.2.tar.gz

http://www.peach.ne.jp/archives/isboot/isboot-0.1.2.tar.gz

最新版を使ってください。

FreeNAS 0.7.2 5226 p4
http://shell.peach.ne.jp/aoyama/archives/1181

danny さん作のiscsi initiator モジュール:
ftp://ftp.cs.huji.ac.il/users/danny/freebsd/iscsi-2.2.4.tar.gz

※補足※公開前にバグが出てしまった為に0.1から0.1.1にあがりました。

追記:
i386版でloader.confから読むとクラッシュする問題があったため
isboot-0.1.2に差し替えました。

タグ: ,

コメントをどうぞ