カテゴリー: FreeBSDとLinux
参照数: 14398

うちのPC環境は、特殊でして、iSCSIを使って、色々なOSをブート出来るようにしています。

しかし、iSCSIだと、1GBイーサが限界で、10GBイーサの導入となると、金額的な負担が高すぎます。

そこで、目を付けたのが、FC ファイバーチャネルです。

でも、ファイバーチャネルなんて基本、業務用途、超高価で、サーバールームや、会社の計算機室ぐらいでしか、目にすることが無いんですが、色々調べていると、中古だと、かなり格安で構築できそうだとわかりました。

FC(ファイバーチャネル)は、1,2,4,8Gb の製品がありますが、4Gbぐらいのが、安いようです。

全体構成で必要な物は、FC HBA(FCのPCIeカード)が、2枚と、光ケーブル 1本です。

どうですか、ファイバーチャネルによる、超安価、それなりの広帯域 家庭内SANが構築出きる様な気がしませんか。

 

では、早速、物を集めてみましょう。

FC HBAは、QLogic社の QLE2460 という物で、PCIe x4接続となります。

 

 (マザーに x4の空きが無いよという方は、x1からx16に変換する 1x-16xエクステンダーライザーカード なる物がアマゾン辺りで販売しているので、利用してみるのも有りです。)

 で、ヤフオクで、漁っていると、990円でQLE2460が4枚 出品されていました。QLE2460って、何故か激安で出品されていますね。

多少、誰かと価格競争することになるかと思いきや、誰も手を出さなかったので、すんなり、990円で、2枚ゲット出来ました。

さらに必要なのは、光ケーブルです。

色々な種類があるようですが、マルチモード デュプレックス LCコネクタの物で良いみたいです。

これは、アマゾンで、3m 1499円でした。

全部で、3479円といった所でしょうか。

ファイバーチャネルを、4000円以下で、構築出来るなんて、とってもお得ですね。

 

ファイバーチャネルって、SCSIのような考え方らしくって、PC側の FC HBA (イニシエータ)から ターゲットと呼ばれる ストレージに接続するようです。

iSCSIも同じような考え方ですね。

普通は、ターゲットなるストレージを購入しないといけないんですが、そんな物、家で使うのに大げさ過ぎるし高そうです。

で、今回の要となる、FC ターゲットを FreeBSDで構築してしまおうということです。

実は、FreeBSDは、カーネルの再構築をすることで、FC ターゲットになってくれるのです。 ちなみに、Linuxでは、SCSTなるものが存在します。

ZFSがネイティブで使えるFreeBSDをFC Targetに出来るなんて、最高に都合が良いです。たぶん、FreeNASでもOKでしょう。

今回の内容は、FreeBSD 10.3で構築しました。 他のバージョンでも可能かもしれませんが、コマンドや、設定が異なるかもしれません。

 


 では、早速、カーネルの再構築です。

カーネルのソースを入れてないって方は、

 /usr/srcにて、最新ソースを落として下さい。

svn checkout svn://svn.FreeBSD.org/base/releng/10.3 /usr/src

で、オプションの修正です。

/usr/src/sys/amd64/conf/GENERICを適当な名前で、コピーして、以下を追加します。

options ISP_TARGET_MODE

これで、準備OKです。

後は、カーネルの構築です。

make buildkernel KERNCONF=[修正したファイル名]

make installkernel KERNCONF=[修正したファイル名]

 

構築が完了したら、ブートオプション等を修正します。

/boot/device.hints

hint.isp.0.role="1"

/boot/loader.conf

ispfw_load="YES"

 

さっ、これで、準備OKです。

QLE2460を差し込んで、再起動してみましょう。

 

ブートログに、以下が表示されていれば成功です。

isp0: <Qlogic ISP 2432 PCI FC-AL Adapter> port 0xe000-0xe0ff mem 0xffa40000-0xffa43fff irq 24 at device 0.0 on pci1

isp0: Chan 0 setting role to 0x1


 ここまで、来れば、後は、ストレージとして公開する物を準備するだけです。

例)zfsにて、zpool/fiber/test1をストレージとして公開するサンプルを記述します。

ストレージの作成

zfs create -V 100G -b 4k zpool/fiber/test1

 

/etc/rc.conf

ctld_enable=”YES”

 

/etc/ctl.conf

target naa.2100001b320bc0d3 {

        port isp0

        lun 0 {

                path /dev/zvol/zpool/fiber/test1

        }

 }

 

naa.2100001b320bc0d3というのは、以下のコマンドで表示される camtgt isp0に割ついている名前です。

ctladm port -o on -t fc

ctladm portlist

 

最後に、以下のコマンドで、公開し始めます。

/etc/rc.d/ctld restart


FC ターゲットが、構築出来たので、今度は、クライアント側(イニシエータ)です。

PC起動時に CTRL+Q にて、設定画面が表示されます。

BIOS設定は、Youtubeでご確認を

 
 

OSは、基本的にUEFIでブートが出来ないので、MBRでインストールします。

各、Linuxは、適当にインストールすれば、なんとかなりますが、Windowsは、厄介です。

Windows7もWindows10も普通にセットアップすると、最近は、UEFIブートとなってしまいます。

なので、セットアップ起動後、ここを参考にして、SHIFT+F10で、コンソールを起動し、以下のコマンドを入力します。

diskpart

list disk

select disk 0

clean

exit

これで、MBRとしてインストール出来ます。

 

Windows10の場合、QLE2460が認識出来ない様で、起動失敗します。

ここから「Fibre Channel STOR Miniport Driver for Windows 2012 (x64)」ドライバをダウンロードし、ドライバを読み込み、セットアップを行うことで起動します。

 

Windows10でのベンチマークです。

FreeBSDのターゲットは、3TのWD HDDをミラーして、SSD を l2arc、zilにしている環境です。

 

ということで、今回、WindowsとかFedora、CentOSなんかを入れて楽しみましたが、VMWare ESXi 仮想サーバにしても十分に使えると思います。

 


2017年8月 更新

順調に使えていたFCですが、たまに、FreeBSDが停止する現象が発生していました。

コンソールに

clfedone: got XPT_IMMEDIATE_NOTIFY status 0x36 tag 0xffffffff seq 0x11630c

clfedone:isp0:0:1024:0): ctlfe_done: returning task I/O tag 0xffffffff seq 0x11630c

とか表示され、ハングします。

色々と探っていると、有力情報をゲットしまして、試してみました。

どうも、l2arcに使っている SSD のTrimが原因ではないかと・・

ということで、OSレベルで、Trimを禁止してみることにしました。

/boot/loader.conf

vfs.zfs.trim.enabled=0

まっ、気長に確認してみます。


2017年9月 更新

停止する件ですが、なんとか解消出来たかもしれません。

イニシエータから大きいUNMAP命令を受けた時にタイムアウトが発生することが起因しているらしいです。

なので、UNMAP出来る大きさに制限を持たせることで回避できるみたいです。

 

以下のソースを改造しカーネルを再構築すれば適用出来ます。

/usr/src/sys/cam/ctl/ctl.c

関数ctl_inquiry_evpd_block_limits内の

修正前

if (lun != NULL) {
    scsi_ulto4b(lun->be_lun->opttxferlen, bl_ptr->opt_txfer_len);
    if (lun->be_lun->flags & CTL_LUN_FLAG_UNMAP) {
        scsi_ulto4b(0xffffffff, bl_ptr->max_unmap_lba_cnt);
        scsi_ulto4b(0xffffffff, bl_ptr->max_unmap_blk_cnt);

修正後

if (lun != NULL) {
    scsi_ulto4b(lun->be_lun->opttxferlen, bl_ptr->opt_txfer_len);
    if (lun->be_lun->flags & CTL_LUN_FLAG_UNMAP) {
        scsi_ulto4b(0x4000, bl_ptr->max_unmap_lba_cnt);
        scsi_ulto4b(0x80, bl_ptr->max_unmap_blk_cnt);

 

一週間ぐらい、Windows10を使ってますが、一度も問題が発生していないので、解消したかもしれません。

 


2018年5月 更新

色々ありまして、FreeBSDを 11.1として、クリーンインストールしました。

11.0の時、ファイバーチャネルから端末が切断されると、isp0: Chan 0 LINK FAILED と表示されていたのですが、isp0: Chan 255 LINK FAILED と変わりました。

isp0のソースに変化があったようです。

何か改善があったと思われます。

 

 

新たにベンチを取ったところ、早くなっていました。

 


2018年6月 更新

 

だいたい、一ヶ月経ちましたが、落ちなくなりました。

無事、安定運用可能となりましたね。

これで、超高速 自宅 NAS 計画を完遂しました。

次は、8G ファイバーを、やってみます。