CentOS 5をtarget、Windowsをinitiatorとして、iSCSIを使用してみました。iSCSIとは、サーバ・クライアントのシステムで、リモートのサーバにあるディスクやファイルを、あたかも自分のローカルのサーバに繋がったSCSIディスクのように扱えます。

まずはtargetの構築です。最初はまったく何をすればよいかわからなかったので、試しにiscsiをyumで検索してみました。

# yum search iscsi
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
 * base: rsync.atworks.co.jp
 * updates: rsync.atworks.co.jp
 * centosplus: rsync.atworks.co.jp
 * addons: rsync.atworks.co.jp
 * extras: rsync.atworks.co.jp
scsi-target-utils.i386 : The SCSI target daemon and utility programs
iscsi-initiator-utils.i386 : iSCSI daemon and utility programs
scsi-target-utils.i386 : The SCSI target daemon and utility programs
isns-utils.i386 : The iSNS daemon and utility programs

targetを構築するので、scsi-target-utilsが欲しいパッケージのようです。yumでインストールしてみます。

# yum install scsi-target-utils

以下のファイルがインストールされました。

# rpm -ql scsci-target-utils
/etc/rc.d/init.d/tgtd
/usr/sbin/tgtadm
/usr/sbin/tgtd
/usr/share/doc/scsi-target-utils-0.0
/usr/share/doc/scsi-target-utils-0.0/README
/usr/share/doc/scsi-target-utils-0.0/README.iscsi
/usr/share/man/man8/tgtadm.8.gz

ファイル一覧から推測するに、tgtd という起動スクリプトと、tgtadmというコマンドで構築していくみたいですね。ネットで設定方法を調べながら、以下のように設定していきました。

今回はサーバ上に空のファイルを作り、それをiSCSIとして公開します。ファイルはddで作成し、サイズは1GB、ファイル名は/root/disk.imgとします。ddにseekを使うことで、巨大なファイルを一瞬で作ることができます。これはスパース(sparse)フィルと呼ばれる穴あきファイルで、作成時点でディスクを消費しませんが、lsでみると1Gのファイルに見えます。

# dd if=/dev/zero of=/root/disk.img  bs=1G seek=1 count=0
# ls -lh /root/disk.img
-rw-r--r-- 1 root root 1.0G  3月 20 12:59 /root/disk.img

tgtdサーバを起動します。

#  /etc/init.d/tgtd start
Starting SCSI target daemon:     [  OK  ]

作ったファイルをiSCSIとして登録していきます。登録にはtgtadmコマンドを使用します。手順は

  1. iSCSIターゲットの作成
  2. ターゲットにファイルを登録
  3. アクセス許可の設定

です。ターゲットを作成します。SCSIにはtarget IDとLUNがあるので、それを指定してiSCSIターゲットを作成します。

tgtadmのmanを見てみます。適当に日本語に訳してみました。

TGTADM(8)                 System Management Commands                 TGTADM(8)

名前
       tgtadm - Linux SCSI ターゲット管理ユーティリティ

書式
       tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...

説明
       tgtadm は Linux SCSI ターゲットの監視や修正を行うのに使用する。

オプション
       --lld [driver] --op new --mode target --tid=[id] --targetname [name]

       ターゲット ID と ターゲット名 を [id],[name] として新規に
       ターゲットを追加する。

       --lld [driver] --op delete --mode target --tid=[id]

       ターゲット [id] を削除する。ターゲットはアクティブなI_T Nexus
       を持っていてはいけない。     

       --lld [driver] --op show --mode target

       すべてのターゲットを表示する。  

       --lld [driver] --op show --mode target --tid=[id]

       ターゲット [id] のパラメタを表示する。    

       --lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path]

       ターゲット [id] に、新しいロジカルユニット [lun] を追加する。
       ロジカルユニットはイニシエータからアクセスされる。
       [path] はブロックデバイスファイル(LVM と RAID デバイスを含む)、
       または通常のファイルでなければならない。
       lun0 はスペシャルデバイス用に自動的に作成され、予約されている。   

       --lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun]

       ターゲット [id] 、スペシャルロジカルユニット [lun] を削除する。   

       --lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address]

       ターゲット [id] のアクセスリストにアドレスを追加する。
       このアドレスのイニシエータがターゲットにアクセルできる。
       `ALL` は特殊なアドレスで、全てのイニシエータのアクセスを許可する。  

       --lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address]

       ターゲット [id] のアクセスリストからアドレスを削除する。      

       --lld [driver] --op update --mode=target --tid=[id] --name=[parameter] --value=[value]

       ターゲット [id] の [parameter] の値を [value] に変更する。         

       --version

       バージョンを表示し終了する。

       --help

       使用可能なオプションを表示して終了する。

バグ報告
       バグ報告はこちらへ <[email protected]>

System Management Commands        2007-06-20                         TGTADM(8)

すごく使いにくそうなコマンドですね。オプションが長い・・・・

manを参考に新しいターゲットを作成します。

# tgtadm --lld iscsi --op new --mode target --tid 0 --targetname testtarget1

作ったターゲットを確認します。

# tgtadm --lld iscsi --op show --mode target
Target 0: testtarget1
    System information:
        Driver: iscsi
        Status: running
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: deadbeaf0:0
            SCSI SN: beaf00
            Size: 0
            Backing store: No backing store
    Account information:
    ACL information:

見ての通り、lun 0はコントローラが使用しますので、lun 1を新しく作ります。

# tgtadm --lld iscsi --op new --mode logicalunit --tid 0 --lun 1 --backing-store /root/disk.img

また確認します。

# tgtadm --lld iscsi --op show --mode target
Target 0: testtarget1
    System information:
        Driver: iscsi
        Status: running
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: deadbeaf0:0
            SCSI SN: beaf00
            Size: 0
            Backing store: No backing store
        LUN: 1
            Type: disk
            SCSI ID: deadbeaf0:1
            SCSI SN: beaf01
            Size: 1G
            Backing store: /root/disk.img
    Account information:
    ACL information:

アクセスできるイニシエータを登録します。今回はテストなので、全てのアドレスからのアクセスを許可します。

# tgtadm --lld iscsi --op bind --mode=target --tid=0 --initiator-address=ALL

これで、ターゲット側の設定は一通り終わりです。

次にWindows XPからこのターゲットにアクセスしてみます。XPはiSCSIのドライバが標準では使えないので、下記のサイトからダウンロードしてインストールします。

Microsoft iSCSI Software Initiator

インストールすると、Windowsのコントロールパネルに"iSCSI Initiator"が現れますので、これをクリックして設定します。

Discovery タブのTarget Portalsの「Add」をクリックし、IP address or DNS nameにターゲットのIPアドレスを入力します。

「Targets」タブを開くと、ターゲット側で設定した、testtarget1が現れますので"Log On.."をクリック、OKをクリックします。今まで一度もSCSIを使ったことないPCの場合、SCSIドライバのインストール画面になりますので、何も考えずにインストールします。

あとは普通にローカルのディスクのように使用できます。

切断する場合は、Detailをクリック後、"Log off..."をクリックします。

参考

scsiお試し

DRBD+iSCSI夢の共演

iSCSI技術仕様

Windows Xp initiator Setup Manual