Debianで iSCSI + OCFS2 試した

Debian testing (Wheezy) で試したが,多分 Ubuntu Natty (11.04) でも一緒です! Maverick のアップグレードが終わったら後で試す! 悔しいがUbuntuのことを書いておいた方がヒット率が高まる気がする!!
あくまでテストなんで同じPCでマウントしてみた.なお zbox == 192.168.1.200 である.
iSCSIの「ターゲット」デーモン ietdNFSサーバ相当)を aptitude install iscsitarget iscsitarget-dkms で入れて,実パーティション /dev/sdb8iqn.2011-08.localdomain.zbox.target:zbox-loopback という名前で公開するよう /etc/iet/ietd.conf (および /etc/default/iscsitarget)を設定:

Target iqn.2011-08.localdomain.zbox.target:zbox-loopback
        Lun 0 Path=/dev/sdb8,Type=blockio

/etc/init.d/iscsitarget start で動き出すので netstat -tln | grep 3260 で確認.
iSCSIの「イニシエータ」デーモン iscsidNFSクライアント相当)を aptitude install open-iscsi で入れて,先の iqn.2011-08.localdomain.zbox.target:zbox-loopback にアクセス:

# iscsiadm -m discovery -t sendtargets -p zbox
192.168.1.200:3260,1 iqn.2011-08.localdomain.zbox.target:zbox-loopback
# iscsiadm -m node --targetname iqn.2011-08.localdomain.zbox.target:zbox-loopback --login

これでイニシエータがターゲットに接続したはず(両方自分だが...)なので確認:

# iscsiadm -m session
tcp: [3] 192.168.1.200:3260,1 iqn.2011-08.localdomain.zbox.target:zbox-loopback
$ netstat -tn|grep 3260
tcp        0      0 192.168.1.200:41618     192.168.1.200:3260      ESTABLISHED
tcp        0      0 192.168.1.200:3260      192.168.1.200:41618     ESTABLISHED
$ dmesg | tail
[941976.025488] scsi10 : iSCSI Initiator over TCP/IP
[941976.294621] scsi 10:0:0:0: Direct-Access     IET      VIRTUAL-DISK     0    PQ: 0 ANSI: 4
[941976.295238] sd 10:0:0:0: Attached scsi generic sg2 type 0
[941976.298137] sd 10:0:0:0: [sdc] 209715200 512-byte logical blocks: (107 GB/100 GiB)
[941976.299253] sd 10:0:0:0: [sdc] Write Protect is off
[941976.299267] sd 10:0:0:0: [sdc] Mode Sense: 77 00 00 08
[941976.300788] sd 10:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA

ターゲット上の実パーティション /dev/sdb8 が,イニシエータ上にブロックデバイス /dev/sdc として見えるようになった.これがiSCSIの仕事である.ここに fdisk(8)パーティション切って mkfs(8)ファイルシステムを初期化:

# mkfs.ocfs2 -L Corega_iSCSI_OCFS2 /dev/sdc1

「なんだ,この流れはローカルのファイルシステムと一緒じゃん」と調子に乗ってマニュアルを読まず mount /dev/sdc1 /mnt/test/ocfs すると,この時点ではまだエラーになる.OCFS2は専用のクラスタ制御システム o2cb(7) が動いてないと駄目なのだ.aptitude install ocfs2-tools で入れて設定ファイル2つをこねる.まず /etc/default/o2cb

O2CB_ENABLED=true
O2CB_BOOTCLUSTER=zbox-ocfs2

(ここで新たにOCFS2層での名前 zbox-ocfs2 が必要になった.)ちなみに最初 O2CB_ENABLED=yes と書いたら /etc/init.d/o2cb start が動かず悩んだのは内緒.そういうときは bash -x /etc/init.d/o2cb start と打つとトレースが出る.次に cp /usr/share/doc/ocfs2-tools-examples/cluster.conf /etc/ocfs2 して,適当に編集:

node:
        ip_port = 7777
        ip_address = 0.0.0.0
        number = 0
        name = zbox
        cluster = zbox-ocfs2

cluster:
        node_count = 1
        name = zbox-ocfs2

正直あんまり意味を理解してないが... 複数イニシエータが同じパーティション(上のOCFS2)にアクセスする設定なら上の "node" 等をその数だけ増やして各イニシエータの /etc/ocfs2 に rsync(1) すりゃいいんだろう.ともあれ,それが済んだら

# /etc/init.d/o2cb start
Setting cluster stack "o2cb": OK
Starting O2CB cluster zbox-ocfs2: OK
$ netstat -tna | grep 7777
tcp        0      0 0.0.0.0:7777            0.0.0.0:*               LISTEN
# mount /dev/sdc1 /mnt/test/ocfs
# df -Th /mnt/test/ocfs
Filesystem    Type    Size  Used Avail Use% マウント位置
/dev/sdc1    ocfs2     30G  1.6G   29G   6% /mnt/test/ocfs

よっしゃー.後は適当にI/Oベンチでもしてくれ.Sequential I/Oが30 MB/s, random I/Oが >1 MB/s だったよ... どうでもいいが1台から成るOCFS2クラスタだと 7777 番ポートの netstat(1) が寂しいね.
今回はiSCSI経由で貰ったディスク容量を,まぁ要するに「flock(2) 内蔵ファイルシステム」であるところのOCFS2経由で利用した訳だが,「ディスク容量を貰う」だけで同時にマウントしないならOCFS2でなくext3でもNTFS-3gでも何でもいいはず.
iSCSI + OCFS2とNFSを比べたときの利点は,

  1. iSCSIの方が数倍高速らしい(確かめてない.我が家のハブは100BASE-Tだしな)
  2. NFSで面倒なユーザアカウント云々が無い(イニシエータがターゲットに認証されればそこでお終いで,ディスクのブロックの使い道はターゲットのセキュリティに一任される)

こんなもんか.後者だけでも嬉しい用途はあるんじゃないかな.LDAPの保守とか nfsnobody って何? とか,めんどいからね... 欠点としてはターゲット本人が接続してないときにパーティションの中を覗くのが面倒という点かな.まぁ losetup(8) を駆使すればいい気もするが,ブラックボックス度が高いのは否めない.
後で細部を直す予定.