CentOS 7.3でiSCSIターゲットを構成
目次
概要
iSCSI接続のディスクについて、性能や運用性を確認したくて ディスク装置の価格を見てみたのですが、とても個人で手が出せる代物ではなかったので、 簡易的にLinuxで構築してみることにしました。 今回は1台のLinuxサーバに専用のツールをインストールして、iSCSIターゲットととして構成します。
構成
サーバ構成
OSバージョン
CentOS 7.3.1611 x86_64
ソフトウェア・パッケージ一覧
- targetcli-2.1.fb46-1.el7.noarch.rpm
環境構築
インストール
iSCSIターゲット構成ツールのインストール
iSCSIターゲットの構成を行うためのツールは targetcli という名で CentOSのbaseリポジトリで提供されています。 これをyumでインストールします。
# yum install -y targetcli 読み込んだプラグイン:fastestmirror, langpacks base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/4): base/7/x86_64/group_gz | 156 kB 00:00:05 (2/4): extras/7/x86_64/primary_db | 145 kB 00:00:05 (3/4): base/7/x86_64/primary_db | 5.7 MB 00:00:15 (4/4): updates/7/x86_64/primary_db | 4.5 MB 00:00:15 Determining fastest mirrors * base: ftp.riken.jp * extras: ftp.riken.jp * updates: ftp.riken.jp 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ targetcli.noarch 0:2.1.fb46-1.el7 を インストール --> 依存性の処理をしています: python-rtslib >= 2.1.fb41 のパッケージ: targetcli-2.1.fb46-1.el7.noarch --> 依存性の処理をしています: python-ethtool のパッケージ: targetcli-2.1.fb46-1.el7.noarch --> 依存性の処理をしています: python-configshell のパッケージ: targetcli-2.1.fb46-1.el7.noarch --> トランザクションの確認を実行しています。 ---> パッケージ python-configshell.noarch 1:1.1.fb23-3.el7 を インストール --> 依存性の処理をしています: python-urwid のパッケージ: 1:python-configshell-1.1.fb23-3.el7.noarch --> 依存性の処理をしています: pyparsing のパッケージ: 1:python-configshell-1.1.fb23-3.el7.noarch ---> パッケージ python-ethtool.x86_64 0:0.8-5.el7 を インストール ---> パッケージ python-rtslib.noarch 0:2.1.fb63-2.el7 を インストール --> 依存性の処理をしています: python-kmod のパッケージ: python-rtslib-2.1.fb63-2.el7.noarch --> トランザクションの確認を実行しています。 ---> パッケージ pyparsing.noarch 0:1.5.6-9.el7 を インストール ---> パッケージ python-kmod.x86_64 0:0.9-4.el7 を インストール ---> パッケージ python-urwid.x86_64 0:1.1.1-3.el7 を インストール --> 依存性解決を終了しました。 依存性を解決しました ============================================================================================================================================ Package アーキテクチャー バージョン リポジトリー 容量 ============================================================================================================================================ インストール中: targetcli noarch 2.1.fb46-1.el7 base 64 k 依存性関連でのインストールをします: pyparsing noarch 1.5.6-9.el7 base 94 k python-configshell noarch 1:1.1.fb23-3.el7 base 67 k python-ethtool x86_64 0.8-5.el7 base 33 k python-kmod x86_64 0.9-4.el7 base 57 k python-rtslib noarch 2.1.fb63-2.el7 base 97 k python-urwid x86_64 1.1.1-3.el7 base 654 k トランザクションの要約 ============================================================================================================================================ インストール 1 パッケージ (+6 個の依存関係のパッケージ) 総ダウンロード容量: 1.0 M インストール容量: 4.6 M Downloading packages: 警告: /var/cache/yum/x86_64/7/base/packages/python-ethtool-0.8-5.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEYETA python-ethtool-0.8-5.el7.x86_64.rpm の公開鍵がインストールされていません (1/7): python-ethtool-0.8-5.el7.x86_64.rpm | 33 kB 00:00:05 (2/7): python-configshell-1.1.fb23-3.el7.noarch.rpm | 67 kB 00:00:05 (3/7): python-kmod-0.9-4.el7.x86_64.rpm | 57 kB 00:00:05 (4/7): targetcli-2.1.fb46-1.el7.noarch.rpm | 64 kB 00:00:00 (5/7): python-rtslib-2.1.fb63-2.el7.noarch.rpm | 97 kB 00:00:05 (6/7): python-urwid-1.1.1-3.el7.x86_64.rpm | 654 kB 00:00:00 (7/7): pyparsing-1.5.6-9.el7.noarch.rpm | 94 kB 00:00:12 -------------------------------------------------------------------------------------------------------------------------------------------- 合計 85 kB/s | 1.0 MB 00:00:12 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 から鍵を取得中です。 Importing GPG key 0xF4A80EB5: Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 Package : centos-release-7-3.1611.el7.centos.x86_64 (@anaconda) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : python-kmod-0.9-4.el7.x86_64 1/7 インストール中 : python-rtslib-2.1.fb63-2.el7.noarch 2/7 インストール中 : pyparsing-1.5.6-9.el7.noarch 3/7 インストール中 : python-ethtool-0.8-5.el7.x86_64 4/7 インストール中 : python-urwid-1.1.1-3.el7.x86_64 5/7 インストール中 : 1:python-configshell-1.1.fb23-3.el7.noarch 6/7 インストール中 : targetcli-2.1.fb46-1.el7.noarch 7/7 検証中 : python-rtslib-2.1.fb63-2.el7.noarch 1/7 検証中 : 1:python-configshell-1.1.fb23-3.el7.noarch 2/7 検証中 : python-urwid-1.1.1-3.el7.x86_64 3/7 検証中 : python-ethtool-0.8-5.el7.x86_64 4/7 検証中 : pyparsing-1.5.6-9.el7.noarch 5/7 検証中 : python-kmod-0.9-4.el7.x86_64 6/7 検証中 : targetcli-2.1.fb46-1.el7.noarch 7/7 インストール: targetcli.noarch 0:2.1.fb46-1.el7 依存性関連をインストールしました: pyparsing.noarch 0:1.5.6-9.el7 python-configshell.noarch 1:1.1.fb23-3.el7 python-ethtool.x86_64 0:0.8-5.el7 python-kmod.x86_64 0:0.9-4.el7 python-rtslib.noarch 0:2.1.fb63-2.el7 python-urwid.x86_64 0:1.1.1-3.el7 完了しました!
設定
targetサービスの自動起動設定
targetcliをインストールするとSystemdの管理下に target という名のサービスが構成されます。 iSCSIターゲットの構成に必要であるため、自動起動の設定を行います。
# systemctl status target.service ● target.service - Restore LIO kernel target configuration Loaded: loaded (/usr/lib/systemd/system/target.service; disabled; vendor preset: disabled) ←自動起動無効 Active: inactive (dead) ←サービス停止状態 # systemctl enable target.service ←自動起動の有効化 Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service. # systemctl status target.service ● target.service - Restore LIO kernel target configuration Loaded: loaded (/usr/lib/systemd/system/target.service; enabled; vendor preset: disabled) ←自動起動有効 Active: inactive (dead) ←サービス停止状態
targetサービスの起動
targetサービスを起動します。
# systemctl start target.service ←サービスの起動 # systemctl status target.service ● target.service - Restore LIO kernel target configuration Loaded: loaded (/usr/lib/systemd/system/target.service; enabled; vendor preset: disabled) ←自動起動有効 Active: active (exited) since 土 2017-12-16 21:30:33 JST; 4s ago ←サービス起動状態 Process: 8260 ExecStart=/usr/bin/targetctl restore (code=exited, status=0/SUCCESS) Main PID: 8260 (code=exited, status=0/SUCCESS) 12月 16 21:30:32 centos73 systemd[1]: Starting Restore LIO kernel target configuration... 12月 16 21:30:33 centos73 target[8260]: No saved config file at /etc/target/saveconfig.json, ok, exiting 12月 16 21:30:33 centos73 systemd[1]: Started Restore LIO kernel target configuration.
iSCSIターゲットのデバイス作成
iSCSIターゲットとして構成するデバイスを作成します。 今回はLVMの論理ボリューム(以下の例では LogVol00 という名前)をiSCSIターゲットとして構成します。 物理デバイス /dev/sdb をLVMのボリュームグループ VolGroup01 として構成し、 その全容量を1つの論理ボリューム LogVol00 に割り当てます。
# fdisk -l /dev/sdb ←/dev/sdbの情報表示 Disk /dev/sdb: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト # fdisk /dev/sdb ←/dev/sdbの構成 Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x75470942. コマンド (m でヘルプ): p ←パーティション情報表示 Disk /dev/sdb: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk label type: dos ディスク識別子: 0x75470942 デバイス ブート 始点 終点 ブロック Id システム コマンド (m でヘルプ): n ←新規パーティション作成 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p ←プライマリパーティション作成 パーティション番号 (1-4, default 1): 1 最初 sector (2048-83886079, 初期値 2048): ←何も入力せずに[Enter]キーを押す 初期値 2048 を使います Last sector, +sectors or +size{K,M,G} (2048-83886079, 初期値 83886079): ←何も入力せずに[Enter]キーを押す 初期値 83886079 を使います Partition 1 of type Linux and of size 40 GiB is set コマンド (m でヘルプ): t ←パーティションタイプの変更 Selected partition 1 Hex code (type L to list all codes): 8e ←パーティションタイプをLinux LVMに変更 Changed type of partition 'Linux' to 'Linux LVM' コマンド (m でヘルプ): p ←パーティション情報表示 Disk /dev/sdb: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk label type: dos ディスク識別子: 0x75470942 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 2048 83886079 41942016 8e Linux LVM コマンド (m でヘルプ): w ←変更したパーティション情報をパーティションテーブルに書き込み パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 ディスクを同期しています。 # pvcreate /dev/sdb1 ←LVMの物理ボリューム作成 Physical volume "/dev/sdb1" successfully created. # pvdisplay /dev/sdb1 --- Physical volume --- PV Name /dev/sdb1 VG Name VolGroup01 PV Size 40.00 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 10239 Free PE 10239 Allocated PE 0 PV UUID btv2h1-xIUl-5W8t-NjBh-8shQ-QGt9-MDkCdc # vgcreate VolGroup01 /dev/sdb1 ←LVMのボリュームグループ作成 Volume group "VolGroup01" successfully created # vgdisplay VolGroup01 --- Volume group --- VG Name VolGroup01 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 40.00 GiB PE Size 4.00 MiB Total PE 10239 Alloc PE / Size 0 / 0 Free PE / Size 10239 / 40.00 GiB VG UUID XwM1am-QqRH-GVGn-tr2l-pWhy-P7FR-qjs1n2 # lvcreate -l 10239 -n LogVol00 VolGroup01 ←LVMの論理ボリューム作成 Logical volume "LogVol00" created. # vgdisplay -v VolGroup01 --- Volume group --- VG Name VolGroup01 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 40.00 GiB PE Size 4.00 MiB Total PE 10239 Alloc PE / Size 10239 / 40.00 GiB Free PE / Size 0 / 0 VG UUID XwM1am-QqRH-GVGn-tr2l-pWhy-P7FR-qjs1n2 --- Logical volume --- LV Path /dev/VolGroup01/LogVol00 LV Name LogVol00 VG Name VolGroup01 LV UUID c1p4yz-L2gk-DEBu-Oxrz-j49o-h8ht-UNh0u8 LV Write Access read/write LV Creation host, time centos73, 2017-12-16 22:49:00 +0900 LV Status available # open 0 LV Size 40.00 GiB Current LE 10239 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3 --- Physical volumes --- PV Name /dev/sdb1 PV UUID btv2h1-xIUl-5W8t-NjBh-8shQ-QGt9-MDkCdc PV Status allocatable Total PE / Free PE 10239 / 0 #
バックストアの定義
作成した論理ボリューム LogVol00 を lun1 という名前のブロックデバイスとして登録します。
# targetcli ls Warning: Could not load preferences file /root/.targetcli/prefs.bin. 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] # targetcli /backstores/block create name=lun1 dev=/dev/VolGroup01/LogVol00 Created block storage object lun1 using /dev/VolGroup01/LogVol00. # targetcli ls o- / ......................................................................................................................... [...] o- backstores .............................................................................................................. [...] | o- block .................................................................................................. [Storage Objects: 1] | | o- lun1 .......................................................... [/dev/VolGroup01/LogVol00 (40.0GiB) write-thru deactivated] | | o- alua ................................................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized] | o- fileio ................................................................................................. [Storage Objects: 0] | o- pscsi .................................................................................................. [Storage Objects: 0] | o- ramdisk ................................................................................................ [Storage Objects: 0] o- iscsi ............................................................................................................ [Targets: 0] o- loopback ......................................................................................................... [Targets: 0]
IQN(iSCSI Qualified Name)の定義
今回構成するiSCSIターゲットを一意に識別するためにIQNという名前を設定します。 IQNの形式は iqn.yyyy-mm.naming-authority:unique-name です。
iqn | 先頭は iqn の3文字で固定です |
---|---|
yyyy-mm | ドメインを取得した年月です。ossfan.netを取得したのは2011年2月なので、2011-02 となります。 |
naming-authority | 取得したドメインを逆にした形です。ossfan.net は net.ossfan となります。 |
unique-name | ドメイン内で一意になる名前です。今回は storage1 としました。 |
上記条件の場合、IQNは iqn.2011-02.net.ossfan:storage1 となります。 このIQNを設定します。
# targetcli /iscsi create iqn.2011-02.net.ossfan:storage1 Created target iqn.2011-02.net.ossfan:storage1. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260. # targetcli ls o- / ......................................................................................................................... [...] o- backstores .............................................................................................................. [...] | o- block .................................................................................................. [Storage Objects: 1] | | o- lun1 .......................................................... [/dev/VolGroup01/LogVol00 (40.0GiB) write-thru deactivated] | | o- alua ................................................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized] | o- fileio ................................................................................................. [Storage Objects: 0] | o- pscsi .................................................................................................. [Storage Objects: 0] | o- ramdisk ................................................................................................ [Storage Objects: 0] o- iscsi ............................................................................................................ [Targets: 1] | o- iqn.2011-02.net.ossfan:storage1 ................................................................................... [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]
IQNとバックストアの紐付け
上記で設定したIQNにバックストア(ブロックデバイス)を紐付ける設定を行います。
# targetcli /iscsi/iqn.2011-02.net.ossfan:storage1/tpg1/luns create /backstores/block/lun1 Created LUN 0. # targetcli ls o- / ......................................................................................................................... [...] o- backstores .............................................................................................................. [...] | o- block .................................................................................................. [Storage Objects: 1] | | o- lun1 ............................................................ [/dev/VolGroup01/LogVol00 (40.0GiB) write-thru activated] | | o- alua ................................................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized] | o- fileio ................................................................................................. [Storage Objects: 0] | o- pscsi .................................................................................................. [Storage Objects: 0] | o- ramdisk ................................................................................................ [Storage Objects: 0] o- iscsi ............................................................................................................ [Targets: 1] | o- iqn.2011-02.net.ossfan:storage1 ................................................................................... [TPGs: 1] | o- tpg1 ............................................................................................... [no-gen-acls, no-auth] | o- acls .......................................................................................................... [ACLs: 0] | o- luns .......................................................................................................... [LUNs: 1] | | o- lun0 ....................................................... [block/lun1 (/dev/VolGroup01/LogVol00) (default_tg_pt_gp)] | o- portals .................................................................................................... [Portals: 1] | o- 0.0.0.0:3260 ..................................................................................................... [OK] o- loopback ......................................................................................................... [Targets: 0]
ACL定義
以上でiSCSIターゲットの構成は完了していますが、最後にACL(Access Control List)の設定を行います。 ACLは簡単に言うと、どのiSCSIイニシエータから(今回構成した)iSCSIターゲットに接続を許可するのかを設定します。 今回の手順ではiSCSIイニシエータの設定は示していませんが、iSCSIイニシエータのサーバ上で下記コマンドを実行すると iSCSIイニシエータのIQNが表示されます。
# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:2951af797f3e
このIQNからの接続であれば許可するという設定を行います。 ※IQNはサーバによって異なるので、iSCSIターゲットに接続したいiSCSIイニシエータのIQNを確認して設定してください。 上記例のIQNを設定してもiSCSIターゲットには接続できません。
# targetcli /iscsi/iqn.2011-02.net.ossfan:storage1/tpg1/acls create iqn.1994-05.com.redhat:2951af797f3e Created Node ACL for iqn.1994-05.com.redhat:2951af797f3e Created mapped LUN 0. # targetcli ls o- / ......................................................................................................................... [...] o- backstores .............................................................................................................. [...] | o- block .................................................................................................. [Storage Objects: 1] | | o- lun1 ............................................................ [/dev/VolGroup01/LogVol00 (40.0GiB) write-thru activated] | | o- alua ................................................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized] | o- fileio ................................................................................................. [Storage Objects: 0] | o- pscsi .................................................................................................. [Storage Objects: 0] | o- ramdisk ................................................................................................ [Storage Objects: 0] o- iscsi ............................................................................................................ [Targets: 1] | o- iqn.2011-02.net.ossfan:storage1 ................................................................................... [TPGs: 1] | o- tpg1 ............................................................................................... [no-gen-acls, no-auth] | o- acls .......................................................................................................... [ACLs: 1] | | o- iqn.1994-05.com.redhat:2951af797f3e .................................................................. [Mapped LUNs: 1] | | o- mapped_lun0 .................................................................................. [lun0 block/lun1 (rw)] | o- luns .......................................................................................................... [LUNs: 1] | | o- lun0 ....................................................... [block/lun1 (/dev/VolGroup01/LogVol00) (default_tg_pt_gp)] | o- portals .................................................................................................... [Portals: 1] | o- 0.0.0.0:3260 ..................................................................................................... [OK] o- loopback ......................................................................................................... [Targets: 0]
設定内容の保存
最後にこれまで設定したiSCSIターゲットに関する設定を保存します。
# targetcli saveconfig Last 10 configs saved in /etc/target/backup. Configuration saved to /etc/target/saveconfig.json