= iSCSIをLinux上で使う =
ストレージをFCなどで構築するとコストがかさみますが、Linux上でソフトウェアのiSCSIターゲットを利用すると、Linuxマシンを用意すれば格安でストレージを構築できます。LinuxをiSCSIのターゲットとして利用するには、[http://stgt.sourceforge.net/ Linux SCSI target framework](tgt)または[http://iscsitarget.sourceforge.net/ iSCSI Enterprise Target](IET)を利用します。
※ SCSTというのもあります http://scst.sourceforge.net/comparison.html
tgtはRedHat、CentOS、FedoraなどのOSで標準でパッケージが用意されています。ietはUbuntuには用意されていますが、RedHat系のOSではソースコードからビルドする必用があります。
私が使った感触では、ietの方が情報が多く簡単に使えました。
それぞれ、tgtとietの使い方を見て行きましょう。
== Linux SCSI target framework (tgt) ==
=== 準備 ===
Ubuntuの場合、
{{{
# apt-get install tgt
# service tgt start
}}}
でokです。CentOS/Fedoraは、
{{{
# yum install iscsi-target-utils
# service tgtd start
}}}
です。
=== tgtの使い方 ===
最初にターゲットを作成します。--tidの引数はターゲットidです。
{{{
# tgtadm --lld iscsi --op new --mode=target --tid=1 --targetname iqn.2001-04.com.example:storege.disk3
}}}
次にLUNを作成します。--lunにlunのidを指定します。
{{{
# tgtadm --lld iscsi --op new --mode=logicalunit --tid=1 --lun=1 -b /disk/disk.img
}}}
tgtを利用した場合、これだけでは、イニシエーターからiSCSIターゲットにアクセスできません。次のようにして、ターゲットにアクセスできるイニシエータを指定します。
{{{
# tgtadm --lld iscsi --op bind --mode=target --tid=1 --initiator-address=ALL
}}}
iscsiadmで認識されているかどうか確認する。
{{{
# iscsiadm -m discovery -t sendtargets -p 127.0.0.1
127.0.0.1:3620,1 iqn.2001-04.com.example:storege.disk3
}}}
※うまくいかない場合は、
{{{
# setenfoce 0
# system-config-firewall-tui
}}}
でSELinuxとFirewallを無効化する
== tgt.confの設定 ==
tgtadminで逐一設定するのは面倒。/etc/tgt/targets.confで下記のように設定することもできる。
{{{
backing-store /var/iscsi/disk.img
}}}
設定後、tgtdをリロードする。
{{{
[CentOS/Fedora]
# service tgtd reload
[Ubuntu]
# service tgt reload
}}}
ディスクが作られているか確認する。
{{{
# tgtadm --ll iscsi --op show --mode target
Target 1: iqn.2008-09.com.example:server.target1
System information:
Driver: iscsi
State: ready
I_T nexus information:
I_T nexus: 1
Initiator: iqn.1994-05.com.redhat:3db1a6cd082
Connection: 0
IP Address: 127.0.0.1
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 105 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: rdwr
Backing store path: /var/iscsi/disk.img
Backing store flags:
Account information:
ACL information:
ALL
}}}
== iSCSIの利用側 ==
iSCSIを利用するには、iSCSIイニシエータ(iSCSIのクライアント)にiSCSIディスクを認識させます。
{{{
# iscsiadm -m discovery --type sendtargets -p 192.168.122.1
192.168.122.1:3260,1 iqn.2001-04.org.ultimana:storage.disk1
}}}
iSCSIディスクをデバイスにマッピングする。
{{{
# iscsiadm -m node -T iqn.2001-04.org.ultimana:storage.disk1 --login
Logging in to [iface: default, target: iqn.2001-04.org.ultimana:storage.disk1, portal: 192.168.122.1,3260]
Login to [iface: default, target: iqn.2001-04.org.ultimana:storage.disk1, portal: 192.168.122.1,3260]: successful
}}}
dmesgで確認すると、認識されたデバイス名が分かります。
{{{
# dmesg
....
scsi6 : iSCSI Initiator over TCP/IP
scsi 6:0:0:0: Direct-Access IET VIRTUAL-DISK 0 PQ: 0 ANSI: 4
sd 6:0:0:0: [sdb] 200000 512-byte logical blocks: (102 MB/97.6 MiB)
sd 6:0:0:0: [sdb] Write Protect is off
sd 6:0:0:0: [sdb] Mode Sense: 77 00 00 08
sd 6:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
sd 6:0:0:0: Attached scsi generic sg2 type 0
sdb: unknown partition table
sd 6:0:0:0: [sdb] Attached SCSI disk
}}}
ここでは、/dev/sdbとして認識されている。あとは、普通のDISKの様に利用すればok。
sessionコマンドでも認識しているデバイス名は確認できる。
{{{
# iscsiadm -m session -P 3 -n iqn.2001-04.org.ultimana:storage.disk1
iSCSI Transport Class version 2.0-870
version 2.0-872
Target: iqn.2001-04.org.ultimana:storage.disk1
Current Portal: 192.168.122.1:3260,1
Persistent Portal: 192.168.122.1:3260,1
**********
Interface:
**********
Iface Name: default
Iface Transport: tcp
Iface Initiatorname: iqn.1994-05.com.redhat:372347eab80
Iface IPaddress: 192.168.122.1
Iface HWaddress:
Iface Netdev:
SID: 7
iSCSI Connection State: LOGGED IN
iSCSI Session State: LOGGED_IN
Internal iscsid Session State: NO CHANGE
************************
Negotiated iSCSI params:
************************
HeaderDigest: None
DataDigest: None
MaxRecvDataSegmentLength: 262144
MaxXmitDataSegmentLength: 8192
FirstBurstLength: 65536
MaxBurstLength: 262144
ImmediateData: Yes
InitialR2T: Yes
MaxOutstandingR2T: 1
************************
Attached SCSI devices:
************************
Host Number: 10 State: running
scsi10 Channel 00 Id 0 Lun: 0
Attached scsi disk sdb State: running
}}}
利用が終了したらログアウトする。
{{{
# iscsiadm -m node -T iqn.2001-04.org.ultimana:storage.disk1 --logout
Logging out of session [sid: 3, target: iqn.2001-04.org.ultimana:storage.disk1, portal: 192.168.122.1,3260]
Logout of [sid: 3, target: iqn.2001-04.org.ultimana:storage.disk1, portal: 192.168.122.1,3260]: successful
}}}
==== ※ iSCSIのターゲット名について ====
iSCSIのターゲット名は、[http://tools.ietf.org/html/rfc3720 RFC3720]で定義されていて、次のような形式となります。
* iqn.{yyyy-mm}.{ドメイン名の逆}:{識別子}
識別子は、ストレージのベンダー名、タイプ、ホスト名などを含めます。
"Example Storage Arrays, Inc."が"example.com"ドメインを持っていると仮定します。
"EXAMPLE Storage Arrays, Inc."によって、次のようなターゲット名が付与されます。
{{{
Naming String defined by
Type Date Auth "example.com" naming authority
+--++-----+ +---------+ +--------------------------------+
| || | | | | |
iqn.2001-04.com.example:storage:diskarrays-sn-a8675309
iqn.2001-04.com.example
iqn.2001-04.com.example:storage.tape1.sys1.xyz
iqn.2001-04.com.example:storage.disk2.sys1.xyz
}}}
== iSCSI Enterprise Target ==
=== ドライバのビルド/インストール ===
==== Fedoraの場合 ====
IETのサイトから[http://sourceforge.net/projects/iscsitarget/files/ ソースコード]を取得し、次のようにしてパッケージをビルドする。ビルドに必要なパッケージは予めインストールしておくこと。
{{{
# rpmbuild -ta iscsitarget-1.4.20.1.tar.gz
# cd /root/rpmbuild/RPMS/x86_64/
# rpm -Uvh iscsitarget-1.4.20.1-1.x86_64.rpm kmod-iscsitarget-1.4.20.1-1_2.6.33.3_85.fc13.x86_64.x86_64.rpm
}}}
モジュールのインストールが完了したら、モジュールをロードする。
{{{
# insmod iscsi_trgt
# dmesg
iSCSI Enterprise Target Software - version 1.4.20.1
iscsi_trgt: Registered io type fileio
iscsi_trgt: Registered io type blockio
iscsi_trgt: Registered io type nullio
}}}
==== Ubuntuの場合 ====
{{{
# apt-get install openiscsi iscsitarget iscsitarget-source
# m-a a-i iscsitarget-source
}}}
=== ストレージの作成 ===
ストレージの作成は、まずiSCSIのストレージにしたいファイルを作成する。
{{{
# dd if=/dev/zero of=/iscsi/iscsitarget bs=1024 count=100000
}}}
次に、ietd.confに作成したファイルをiSCSIストレージとして利用する設定を行う。
/etc/iet/ietd.confに下記の記述を追加する。
{{{
Target iqn.2001-04.org.ultimana:storage.disk1
Lun 0 Path=/iscsi/iscsitarget,Type=fileio
}}}
iSCSIターゲットの起動と確認しよう。
{{{
# /etc/init.d/iscsi-target start
# iscsiadm -m discovery --type sendtargets -p 192.168.122.1
192.168.122.1:3260,1 iqn.2001-04.org.ultimana:storage.disk1
}}}
== virshにストレージプールを登録 ==
libvirtのストレージ管理機能を利用すると、なんとiscsiadm使わなくてもストレージを管理できる。まず、pool.xmlにiSCSIの設定情報を記述。
{{{
lun1
/dev/disk/by-path
}}}
virshでストレージ定義と開始を行う。
{{{
virsh # pool-define pool.xml
プール lun1 が pool.xml から定義されました
virsh # pool-start lun1
プール lun1 が起動されました
virsh # pool-list
名前 状態 自動起動
-----------------------------------------
default 動作中 yes
lun1 動作中 no
virsh # pool-info lun1
名前: lun1
UUID: 1477ce40-0dd0-91b2-fa7a-ae64ddb27a0f
状態: 実行中
容量: 7.81 GB
割り当て: 7.81 GB
利用可能: 0.00
}}}
/dev/disk/by-pathディレクトリを確認してみると、デバイスができている。
{{{
# ls /dev/disk/by-path/
ip-192.168.122.1:3260-iscsi-iqn.2001-04.org.ultimana:storage.disk1-lun-0
ip-192.168.122.1:3260-iscsi-iqn.2001-04.org.ultimana:storage.disk1-lun-0-part1
ip-192.168.122.1:3260-iscsi-iqn.2001-04.org.ultimana:storage.disk1-lun-0-part2
}}}
libvirt XMLファイルには次のようにしてディスクを定義する。typeをblockにしているところに注意。
{{{
}}}
でもこんな面倒なことするなら、iscsiadm使って/dev/sdxにマッピングしたデバイス使った方が楽かも。
=== iSCSIストレージでisoマウント ===
isoイメージをiSCSIストレージとしてexportして、次のようにやれば、cdromのディスクとして利用できる。
{{{
# attach-disk UbuntuVM /dev/disk/by-path/ip-10.68.99.75:3260-iscsi-iqn.test:test-lun-0 hdc --mode readonly --driver file --type cdrom
}}}
下記のようにadd-disk.xmlとして定義し、
{{{
}}}
{{{
# attach-device <ドメイン名> add-disk.xml
}}}
でもok。