= 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をリロードする。 {{{ # service tgtd 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。