このエントリーをはてなブックマークに追加

概要

 iSCSI接続のディスクについて、性能や運用性を確認したくて ディスク装置の価格を見てみたのですが、とても個人で手が出せる代物ではなかったので、 簡易的にLinuxで構築してみることにしました。 今回は1台のLinuxサーバに専用のツールをインストールして、iSCSIターゲットととして構成します。

構成

サーバ構成

OSバージョン

CentOS 7.3.1611 x86_64

ソフトウェア・パッケージ一覧

  • targetcli-2.1.fb46-1.el7.noarch.rpm

サーバ構築

インストール

(1) 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

完了しました!

設定

(1) 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) ←サービス停止状態

(2) 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.

(3) 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

#

(4) バックストアの定義

 作成した論理ボリューム 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]

(5) 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]

(6) 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]

(7) 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]

(8) 設定内容の保存

 最後にこれまで設定したiSCSIターゲットに関する設定を保存します。

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