めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

RHEL7/CentOS7のiSCSIターゲット構成手順

何の話かというと

RHEL7/CentOSでは、iSCSIターゲット(Linux上のディスク領域をiSCSIディスクとして公開する機能)の構成手順が変わっています。特にOpenStack CinderのLVMドライバーを使っている際の問題判別手順に影響するので、ここで解説しておきます。

事前準備

iSCSIターゲットを構成するRHEL7/CentOS7には、targetcliを導入して、target.serviceを起動しておきます。

# yum -y install targetcli
# systemctl enable target.service
# systemctl start target.service

iSCSIディスクを接続するサーバー(イニシエーター)のRHEL7/CentOS7には、iscsi-initiator-utilsを導入して、iscsid.serviceを起動しておきます。

# yum install iscsi-initiator-utils
# systemctl enable iscsid.service
# systemctl start iscsid.service

iscsidサービスはバックエンドでiSCSIの処理をするデーモンですが、この他に、システム起動時に登録済みのターゲットを自動認識するiscsi.serviceも存在します。こちらは、システム起動時に実行されるように有効化だけ行っておきます。

# systemctl enable iscsi.service

iSCSIターゲットの構成

iSCSIターゲットの構成は、targetcliコマンドで行います。引数無しで実行するとコマンドプロンプトが出て、対話的な設定が可能になりますが、ここでは、targetcliコマンドを個別に実行していきます。

主な設定項目は、バックエンドデバイスの指定、IQN(ターゲットの固有名)、ポータル(デーモンがバインドするIP,ポート)、ACL(接続を許可するクライントの指定)です。これらの設定は、擬似的なディレクトリー構造にまとめられていて、次のようにlsサブコマンドで確認できます。今はまだ何も設定が存在しません。

# targetcli ls /
o- / ........................................................... [...]
  o- backstores ................................................ [...]
  | o- block .................................... [Storage Objects: 0]
  | o- fileio ................................... [Storage Objects: 0]
  | o- pscsi .................................... [Storage Objects: 0]
  | o- ramdisk .................................. [Storage Objects: 0]
  o- iscsi .............................................. [Targets: 0]
  o- loopback ........................................... [Targets: 0]

はじめにバックエンドデバイスを定義します。ここでは、LVMの論理ボリューム /dev/vgdata00/lvdata00 をブロックデバイスバックエンドとして定義します。「name」は任意の名前を指定します。

# targetcli /backstores/block create name=lun0 dev=/dev/vgdata00/lvdata00
# targetcli ls /
o- / ........................................................... [...]
  o- backstores ................................................ [...]
  | o- block .................................... [Storage Objects: 1]
  | | o- lun0  [/dev/vgdata00/lvdata00 (2.0GiB) write-thru deactivated]
  | o- fileio ................................... [Storage Objects: 0]
  | o- pscsi .................................... [Storage Objects: 0]
  | o- ramdisk .................................. [Storage Objects: 0]
  o- iscsi .............................................. [Targets: 0]
  o- loopback ........................................... [Targets: 0]

次に、IQNを定義します。IQNは、お作法のフォーマットにしたがって、任意の固有名を指定します。

# targetcli /iscsi create iqn.2015-12.com.example:myhost01
# targetcli ls /
o- / ........................................................... [...]
  o- backstores ................................................ [...]
  | o- block .................................... [Storage Objects: 1]
  | | o- lun0  [/dev/vgdata00/lvdata00 (2.0GiB) write-thru deactivated]
  | o- fileio ................................... [Storage Objects: 0]
  | o- pscsi .................................... [Storage Objects: 0]
  | o- ramdisk .................................. [Storage Objects: 0]
  o- iscsi .............................................. [Targets: 1]
  | o- iqn.2015-12.com.example:myhost01 .................... [TPGs: 1]
  |   o- tpg1 ................................. [no-gen-acls, no-auth]
  |     o- acls ............................................ [ACLs: 0]
  |     o- luns ............................................ [LUNs: 0]
  |     o- portals ...................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ....................................... [OK]
  o- loopback ........................................... [Targets: 0]

この時、デフォルトのポータルとして「0.0.0.0:3260」が定義されていますので、このまま使用することにします。このポータルに、先ほどのバックエンドデバイスを紐付けます。

# targetcli /iscsi/iqn.2015-12.com.example:myhost01/tpg1/luns create /backstores/block/lun0
# targetcli ls /
o- / ........................................................... [...]
  o- backstores ................................................ [...]
  | o- block .................................... [Storage Objects: 1]
  | | o- lun0 . [/dev/vgdata00/lvdata00 (2.0GiB) write-thru activated]
  | o- fileio ................................... [Storage Objects: 0]
  | o- pscsi .................................... [Storage Objects: 0]
  | o- ramdisk .................................. [Storage Objects: 0]
  o- iscsi .............................................. [Targets: 1]
  | o- iqn.2015-12.com.example:myhost01 .................... [TPGs: 1]
  |   o- tpg1 ................................. [no-gen-acls, no-auth]
  |     o- acls ............................................ [ACLs: 0]
  |     o- luns ............................................ [LUNs: 1]
  |     | o- lun0 .............. [block/lun0 (/dev/vgdata00/lvdata00)]
  |     o- portals ...................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ....................................... [OK]
  o- loopback ........................................... [Targets: 0]

最後にACLを定義しますが、これには、接続を許可するイニシエーター名が必要になります。イニシエーター側のRHEL7/CentOS7で次のコマンドから確認します。

# cat /etc/iscsi/initiatorname.iscsi 
InitiatorName=iqn.1994-05.com.redhat:0fa619ccaea

確認したイニシエーター名を用いて、ACLを定義します。ここでは認証無しでのアクセスを許可します。

# targetcli /iscsi/iqn.2015-12.com.example:myhost01/tpg1/acls create iqn.1994-05.com.redhat:0fa619ccaea
# targetcli ls /
o- / ........................................................... [...]
  o- backstores ................................................ [...]
  | o- block .................................... [Storage Objects: 1]
  | | o- lun0 . [/dev/vgdata00/lvdata00 (2.0GiB) write-thru activated]
  | o- fileio ................................... [Storage Objects: 0]
  | o- pscsi .................................... [Storage Objects: 0]
  | o- ramdisk .................................. [Storage Objects: 0]
  o- iscsi .............................................. [Targets: 1]
  | o- iqn.2015-12.com.example:myhost01 .................... [TPGs: 1]
  |   o- tpg1 ................................. [no-gen-acls, no-auth]
  |     o- acls ............................................ [ACLs: 1]
  |     | o- iqn.1994-05.com.redhat:0fa619ccaea ..... [Mapped LUNs: 1]
  |     |   o- mapped_lun0 .................... [lun0 block/lun0 (rw)]
  |     o- luns ............................................ [LUNs: 1]
  |     | o- lun0 .............. [block/lun0 (/dev/vgdata00/lvdata00)]
  |     o- portals ...................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ....................................... [OK]
  o- loopback ........................................... [Targets: 0]

以上でターゲットの構成は完了です。最後に設定内容を保存しておきます。

# targetcli saveconfig
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

iSCSIイニシエーターの構成

続いて、イニシエーター側の構成手順です。基本的には、従来と同じ、iscsiadmコマンドでがんばります。

iSCSIターゲットのIP:ポートを指定してIQNを確認した後、IQNを指定して、ポータルへのログインを行います。

# iscsiadm -m discovery -t st -p 192.168.122.10:3260
192.168.122.10:3260,1 iqn.2015-12.com.example:myhost01

# iscsiadm -m node -T iqn.2015-12.com.example:myhost01 -p 192.168.122.10:3260 -l
Logging in to [iface: default, target: iqn.2015-12.com.example:myhost01, portal: 192.168.122.10,3260] (multiple)
Login to [iface: default, target: iqn.2015-12.com.example:myhost01, portal: 192.168.122.10,3260] successful.

無事にLUNが認識されています。

# lsblk -S
NAME HCTL       TYPE VENDOR   MODEL             REV TRAN
sda  3:0:0:0    disk LIO-ORG  lun0             4.0  iscsi
sr0  1:0:0:0    rom  QEMU     QEMU DVD-ROM     0.12 ata

念のためシステムを再起動して、起動時にiscsi.serviceによって自動認識されることも確認しておきましょう。

逆に認識済みのLUNの認識を解除する際は、次の手順に従います。まず、現在認識しているIQNを確認して、ポータルからログアウトします。

# iscsiadm -m node
192.168.122.10:3260,1 iqn.2015-12.com.example:myhost01

# iscsiadm -m node -T iqn.2015-12.com.example:myhost01 -p 192.168.122.10 --logout
Logging out of session [sid: 1, target: iqn.2015-12.com.example:myhost01, portal: 192.168.122.10,3260]
Logout of [sid: 1, target: iqn.2015-12.com.example:myhost01, portal: 192.168.122.10,3260] successful.

さらに、IQNの認識を削除しておきます。

# iscsiadm -m node -o delete -T iqn.2015-12.com.example:myhost01 -p 192.168.122.10
# iscsiadm -m node
iscsiadm: No records found

iSCSIターゲットの初期化

iSCSIターゲット側の設定をきれいに初期化するのは、次のコマンドです。

# targetcli clearconfig confirm=True

すべてを消すのではなくて、特定の項目だけを削除する際は、createサブコマンドをdeleteサブコマンドに置き換えて実行します。

# targetcli /iscsi/iqn.2015-12.com.example:myhost01/tpg1/acls delete iqn.1994-05.com.redhat:0fa619ccaea
Deleted Node ACL iqn.1994-05.com.redhat:0fa619ccaea.