wiki:linux/iscsi

iSCSIをLinux上で使う

ストレージをFCなどで構築するとコストがかさみますが、Linux上でソフトウェアのiSCSIターゲットを利用すると、Linuxマシンを用意すれば格安でストレージを構築できます。LinuxをiSCSIのターゲットとして利用するには、 Linux SCSI target framework(tgt)または 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で下記のように設定することもできる。

<target iqn.2008-09.com.example:server.target1>
    backing-store /var/iscsi/disk.img
</target>

設定後、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: <empty>
		Iface Netdev: <empty>
		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のターゲット名は、 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のサイトから ソースコードを取得し、次のようにしてパッケージをビルドする。ビルドに必要なパッケージは予めインストールしておくこと。

# 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の設定情報を記述。

<pool type="iscsi">
  <name>lun1</name>
  <source>
    <host name="192.168.122.1" />
    <device path="iqn.2001-04.org.ultimana:storage.disk1"/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>

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にしているところに注意。

    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2001-04.org.ultimana:storage.disk1-lun-0'/>
      <target dev='hda' bus='ide'/>
    </disk>

でもこんな面倒なことするなら、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として定義し、

<disk type='file' device='cdrom'>
  <source file='/dev/disk/by-path/ip-10.68.99.75:3260-iscsi-iqn.test:test-lun-0'/>
  <target dev='hdc' bus='ide'/>
  <readonly/>
</disk>
# attach-device <ドメイン名> add-disk.xml

でもok。

Attachments