何の話かというと
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.