Mar 17, 2008

FreeBSD上のiSCSIとZFS [computer]

(3/18)iscsi.hのパス明記、ほか細かな修正

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にまとめて共有するというような使い方もありだろう。

こういう実験が簡単にできてしまうのもありがたい。

Posted at 02:19 in computer

Archives
Powered by
blosxom 2.0
and
modified by
blosxom starter kit