CentOS7上にiSCSIターゲットを立てる方法

## 検証環境
* CentOS7.4 x64 (ターゲット)
* WindowsServer2016 Standard (イニシエータ)

ターゲットは「iSCSIを提供する側」、イニシエーターは「iSCSIを利用する側」である。
ターゲット-イニシエータ間はネットワーク的に通信出来ること。

本ページ中にある「iqn...」の部分はIQNと呼ばれるものであり、ISCSI構成要素には必ず付与しなければならない。[IQN命名規則](https://en.wikipedia.org/wiki/ISCSI#Addressing)にならって指定すること。

例えば、2017年9月に登録されたhogehige.co.jpドメイン内のiscsi-storageサーバーのターゲット0番なら以下のようにすると良い。

```
iqn.2017-09.jp.co.hogehige:iscsi-storage.target0
```

## ターゲットのセットアップ

### iSCSI管理ツールのインストール
```shell-session:
# yum install targetcli
...
インストール:
  targetcli.noarch 0:2.1.fb46-1.el7                                                                                                                                                               

依存性関連をインストールしました:
  libnl.x86_64 0:1.1.4-3.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-six.noarch 0:1.9.0-2.el7    python-urwid.x86_64 0:1.1.1-3.el7            

完了しました!

# rpm -qa | grep targetcli
targetcli-2.1.fb46-1.el7.noarch

# systemctl enable target
# systemctl stop target
```

### iSCSIターゲットの作成
本ページではディスクイメージファイルを作成しそれにターゲット紐づけを行う。なお、ディスクイメージの他にもブロックデバイスも紐づけることも出来る。
iSCSI管理ツールの仮想ディレクトリ構造とOSファイル構造が似ていて混乱しやすいので注意すること。

```shell-session:
# mkdir /iscsi_disks
# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

# iSCSIディスクイメージを作成する
> cd backstores/fileio
> create disk0 /iscsi_disks/disk0.img 500G

# iSCSIターゲットの作成
> cd /iscsi
> create iqn.2017-09.jp.co.hogehige:test-iscsi.target0
> cd iqn.2017-09.jp.co.hogehige:test-iscsi.target0/tpg1/luns

# LUNの作成(iSCSIターゲットとiSCSIディスクイメージの紐づけ)
> create /backstores/fileio/disk0

# iSCSIターゲットにアクセスを許可するiSCSIイニシエーターの設定
> cd ../acls
> create iqn.2017-09.jp.co.hogehige:hyperv-host1.init0

# iSCSI管理ツール内の状態を確認する
> cd /
> ls
o- / ......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- block .................................................................................................. [Storage Objects: 0]
  | o- fileio ................................................................................................. [Storage Objects: 1]
  | | o- disk0 .............................................................[/iscsi_disks/disk0.img (500.0GiB) write-back activated]
  | |   o- alua ................................................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]
  | o- pscsi .................................................................................................. [Storage Objects: 0]
  | o- ramdisk ................................................................................................ [Storage Objects: 0]
  o- iscsi ............................................................................................................ [Targets: 1]
  | o- iqn.2017-09.jp.co.hogehige:test-iscsi.target0 ..................................................................... [TPGs: 1]
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]
  |     o- acls .......................................................................................................... [ACLs: 1]
  |     | o- iqn.2017-09.jp.co.hogehige:hyperv-host1.init0 ........................................................ [Mapped LUNs: 1]
  |     |   o- mapped_lun0 ................................................................................ [lun0 fileio/disk0 (rw)]
  |     o- luns .......................................................................................................... [LUNs: 1]
  |     | o- lun0 ....................................................... [fileio/disk0 (/iscsi_disks/disk0.img) (default_tg_pt_gp)]
  |     o- portals .................................................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]
  o- loopback ......................................................................................................... [Targets: 0]
> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

# ls -la /iscsi_disks/
合計 0
drwxr-xr-x   2 root root           23  9月 25 12:40 .
dr-xr-xr-x. 18 root root          263  9月 25 12:39 ..
-rw-r--r--   1 root root 536870912000  9月 25 12:40 disk0.img

# systemctl restart target
```

### iSCSIターゲットの動作確認
デフォルト設定では3260でリッスンされる。

```shell-session:
# systemctl status target
● target.service - Restore LIO kernel target configuration
   Loaded: loaded (/usr/lib/systemd/system/target.service; enabled; vendor preset: disabled)
   ...
# netstat -an | grep 3260
tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN
```


## iSCSIイニシエータの接続
ISCSIイニシエーターの設定を開き、自身のIQNを確認する。

iSCSIターゲットサーバーのIPアドレスを入力し、接続を試行する。

問題が無ければターゲットIQNを自動で発見し、接続される。

iSCSIディスクが接続されると、ディスク管理上にiSCSIディスクが見えるようになる。

## 備考
### ターゲットにてファイアウォールが有効の場合
以下のコマンドで通信を許可しておく。

```shell-session:
# firewall-cmd --add-service=iscsi-target --permanent
# firewall-cmd --reload
```

### ターゲットに接続可能なイニシエータIQNを追加する手順

```shell-session:
# systemctl stop target
# targetcli
> cd iscsi/{ターゲットIQN}/tpg1/acls/
> create {イニシエータIQN}
> cd {イニシエータIQN}
> set auth userid={ユーザーID} password={パスワード}
> exit
# systemctl start target
```

## 参考
https://www.server-world.info/query?os=CentOS_7&p=iscsi