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コマンドを使用します。手順は
- iSCSIターゲットの作成
- ターゲットにファイルを登録
- アクセス許可の設定
です。ターゲットを作成します。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..."をクリックします。