Mar 17, 2008
FreeBSD上のiSCSIとZFS [computer]
(3/18)iscsi.hのパス明記、ほか細かな修正
FreeBSD7.0ではiSCSI initiatorとZFSが使えるようになっている。
組み合わせて使うと幸せになれることもあるかもしれない。
ネットワーク越しのデバイスを一つのボリュームにまとめることができる。RAID-Zのボリュームに後から追加を行って容量を増やすことも簡単にできる。
FreeBSD7.0ではiSCSI initiatorとZFSが使えるようになっている。 組み合わせて使うと幸せになれることもあるかもしれない。 ネットワーク越しのデバイスを一つのボリュームにまとめることができる。RAID-Zのボリュームに後から追加を行って容量を増やすことも簡単にできる。
SolarisではZVOLを使いZFSのボリュームを仮想物理ボリュームとしてiscsiのtarget(サーバ)に使うことができるようになっているが、この機能はFreeBSDでは現状サポートされていない。 ZVOLをiSCSIで直接使えると構成の自由度はさらに上がることは間違いないが、この機能がなくても十分にiSCSIは使える機能だと思う。
iSCSIのinitiator(クライアント)のデバイスをZFSで利用することは問題なくできる。またFreeBSDではNetBSD由来のiscs-targetが移植されておりマウントしたZFS上のファイルをiSCSIのtargetとして使用することはできるので少々気持ち悪くはあるがtarget側にZFSを使うこともできる。
おまじない
FreeBSD7.0R時点ではiscsi_initiatorはtargetを同時に4つまでしか利用できないようになっている。ネットワーク越しにRAID-Zを構築しようとする場合4つでは不足しがちなので制限に引っかかりそうなら増やしておいた方がいい。
/usr/src/sys/dev/iscsi/initiator/iscsi.h --- iscsi.h.orig 2008-03-16 20:03:47.000000000 +0900 +++ iscsi.h 2008-03-16 13:51:29.000000000 +0900 @@ -38,7 +38,8 @@ #define ISCSIDEV "iscsi" -#define ISCSI_MAX_TARGETS 4 //64 +/* #define ISCSI_MAX_TARGETS 4 //64 */ +#define ISCSI_MAX_TARGETS 64 #define ISCSI_MAX_LUNS 4
カーネルモジュールで使っている場合はモジュールを作り直しカーネルに組み込んでいる場合はカーネルを再構築する。 時間に余裕があるなら普通にカーネル再構築すれば確実。 お好みに応じてZFSやSCSIまわりの設定をやっておくと吉。
portsのNetBSD由来のiscsi-targetを使ってローカルで試す場合 例えば/usr/local/etc/iscsi/targetsをこんな風にする。 1Gbyteづつのファイルを割り当ててみる。
# extents file start length extent0 /usr/local/tmp/iscsi-target0 0 1024MB extent1 /usr/local/tmp/iscsi-target1 0 1024MB extent2 /usr/local/tmp/iscsi-target2 0 1024MB extent3 /usr/local/tmp/iscsi-target3 0 1024MB extent4 /usr/local/tmp/iscsi-target4 0 1024MB extent5 /usr/local/tmp/iscsi-target5 0 1024MB # target flags storage netmask target0 rw extent0 127.0.0.1/32 target1 rw extent1 127.0.0.1/32 target2 rw extent2 127.0.0.1/32 target3 rw extent3 127.0.0.1/32 target4 rw extent4 127.0.0.1/32 target5 rw extent5 127.0.0.1/32
ローカルホストなので認証なしでもいいよね?
あとは/etc/rc.confにiscsi_target_enable="YES"を書いて /usr/local/etc/rc.d/iscsi_target startでtarget側の準備は完了
initiator側の設定は/etc/iscsi.confに行う
iscsi0 { # nickname targetaddress = localhost targetname = iqn.1994-04.org.netbsd.iscsi-target:target0 } iscsi1 { # nickname targetaddress = localhost targetname = iqn.1994-04.org.netbsd.iscsi-target:target1 } : :iscontrolを実行するとdaデバイスとして見えるようになる。
#iscontrol -n iscsi0 -t localhost #iscontrol -n iscsi1 -t localhost : # camcontrol devlist <NetBSD NetBSD iSCSI 0> at scbus0 target 0 lun 0 (pass0,da0) <NetBSD NetBSD iSCSI 0> at scbus0 target 1 lun 0 (pass1,da1) <NetBSD NetBSD iSCSI 0> at scbus0 target 2 lun 0 (pass2,da2) <NetBSD NetBSD iSCSI 0> at scbus0 target 3 lun 0 (pass3,da3) <NetBSD NetBSD iSCSI 0> at scbus0 target 4 lun 0 (pass4,da4) <NetBSD NetBSD iSCSI 0> at scbus0 target 5 lun 0 (pass5,da5)
ほーらこんなにdaデバイスが生えた
# ps ax | grep iscontrol 4745 ?? Is 0:00.01 iscontrol -t localhost -n iscsi0 4749 ?? Is 0:00.01 iscontrol -t localhost -n iscsi1 4753 ?? Is 0:00.01 iscontrol -t localhost -n iscsi2 4757 ?? Is 0:00.01 iscontrol -t localhost -n iscsi3 4761 ?? Is 0:00.01 iscontrol -t localhost -n iscsi4 4765 ?? Is 0:00.01 iscontrol -t localhost -n iscsi5
それぞれiscontrolがdaemonとして動いているのでsessionを終了する場合は各 プロセスに対してHUPを送る。shutdownするときには先にsessionを終了させな いと暫く待たされる。
おもむろにRAID-Zでボリュームを作る
# zpool create tank raidz da0 da1 da2 # zpool status tank pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 # df /tank Filesystem 1K-blocks Used Avail Capacity Mounted on tank 2051200 0 2051200 0% /tank
1GBのデバイス3つでRAID-Zを構成している。1つ分パリティに使われる換算になるので2GBのボリュームとなっている。
# time dd if=/dev/urandom of=/tank/hoge count=100000 100000+0 records in 100000+0 records out 51200000 bytes transferred in 8.058210 secs (6353768 bytes) # df /tank Filesystem 1K-blocks Used Avail Capacity Mounted on tank 2051200 50048 2001152 2% /tank
RAID-Zを構成するデバイスを置き換えてみよう。
# zpool replace tank da0 da3 # zpool status tank pool: tank state: ONLINE scrub: resilver completed with 0 errors on Sun Mar 16 21:25:34 2008 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz1 ONLINE 0 0 0 replacing ONLINE 0 0 0 da0 ONLINE 0 0 0 da3 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0
少し待つと同期がかかってda3の内容が有効になり自動的にda0はRAID-Zの構成 から外れる。
# zpool status tank pool: tank state: ONLINE scrub: resilver completed with 0 errors on Sun Mar 16 21:25:34 2008 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da3 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors # df /tank Filesystem 1K-blocks Used Avail Capacity Mounted on tank 2051200 50048 2001152 2% /tank
RAID-Zのボリュームに追加を行ってみる。zpool addでボリュームにもう一組RAID-Zを追加して全体の容量を増やす。これは実質的にはRAID-Z+RAID-Zのストライピングになるはず。
# zpool add tank raidz da0 da4 da5 # zpool status tank pool: tank state: ONLINE scrub: resilver completed with 0 errors on Sun Mar 16 21:25:34 2008 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da3 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 # df /tank Filesystem 1K-blocks Used Avail Capacity Mounted on tank 4103040 50048 4052992 1% /tank
1GBのデバイス6個を使って4GBの高信頼性ボリュームを作成した。 追加は簡単にできるが減らす方は難しい(w
RAID-Zを使っている場合同じサイズのボリュームをまとめていくなら簡単。 iSCSIを使えば柔軟にネットワーク越しにストレージを確保できるので、突発 的にストレージが必要になった場合には使える手段だと思う。
今のところiSCSI+ZFSの信頼性は不明だが、高い信頼性が得られるのであれば最初からストレージを分散させておきzpoolにまとめて共有するというような使い方もありだろう。
こういう実験が簡単にできてしまうのもありがたい。
blosxom 2.0
and
modified by
blosxom starter kit