【iSCSI】SANの構築

##目標
iSCSIを利用してSANを構築（AWS環境上に構築）し、動作を確認する。

##はじめに
学習のためAWSネットワーク上にiSCSIによるSAN構築をしてみたのですが、AWSには高速ネットワークストレージのEBSがあるので、
そこに自らSANを構築するメリットが正直あるのか私にはわからないです。。ただ学習用のハンズオンということでご容赦頂ければと思います。

##前提
・AWS EC2サーバ2台が構築済みであること（ターゲットとして利用する側のEC2にはデータボリューム**/dev/sdb**をアタッチし、セキュリティグループで**3260番ポート**を開けておく）

##利用環境
仮想マシン　：　**AWS EC2サーバ 2台**
OS（AMI）　:　**Red Hat Enterprise Linux 8 (HVM), SSD Volume Type**

##iSCSIとは
TCP/IPネットワーク上でSCSI接続を利用可能にする仕組みです。
iSCSIを利用することローカルストレージ同然にネットワーク上のストレージを利用することが可能となります。
また、iSCSI等によって構築された**ストレージ専用ネットワーク**を**SAN**（※）と呼びます。

※補足
SANの実装方法に関しては『Fibre Channel (ファイバチャネル,略称FC)』や『FC over Ethernet (読み方：エフシーオーイー, 略称FCoE)』、『iSCSI (読み方：アイスカジー)』といったものがあり、
Fibre Channel を利用したSANは高速だが、専用のデバイスが必要なため高価というデメリットがあります。
それに対しFC over Ethernet（SCSI コマンドを Ethernet にカプセル）やiSCSI（SCSI コマンドを Ethernet および IPにカプセル化）はカプセル化に伴うオーバヘッドが存在するため多少速度は遅くなりますが、
一般のネットワーク機器が利用できるため安価というメリットがあります。

参考にさせて頂いたサイト
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典（iSCSIとは）](https://wa3.i-3-i.info/word12371.html)
[【図解】初心者にも分かる iSCSI の仕組み ～FCやNAS(NFS)との違いやメリット,デメリット～（SAN の種類とメリット・デメリット）](https://milestone-of-se.nesuke.com/sv-basic/architecture/iscsi-summary/#toc2)

##SANとNASの違い
SANと似た概念に**NAS**が存在します。
SANがLANとは独立したストレージ専用ネットワークであるのに対し、
NASは**LANに接続されたストレージ**のことを指し、よくあるファイルサーバはこのNASのことを指します。
NASの実装方式にはNFSやSamba等があります。

双方のメリットは簡単に記載すると以下となります。

SAN
・**NASと比べて処理が高速**

NAS
・**競合を気にすることなく、複数のサーバOSが同時に NAS を利用可能**

より詳しくは、参考にさせて頂いたサイト
[【図解】初心者にも分かる iSCSI の仕組み ～FCやNAS(NFS)との違いやメリット,デメリット～（NAS (CIFS, NFS接続) との違い、メリット・デメリット）](https://milestone-of-se.nesuke.com/sv-basic/architecture/iscsi-summary/#toc3)



##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [イニシエータの構築](#1イニシエータの構築) |
| 2 | [ターゲットの構築](#2ターゲットの構築)|
| 3 | [イニシエータからターゲットへの接続](#3イニシエータからターゲットへの接続)|
| 4 | [iSCSIストレージを実際に利用可能にする](#4iscsiストレージを実際に利用可能にする)|

##手順
###1.イニシエータの構築
iSCSIクライアントである**イニシエータ**の構築を行います。

**①イニシエータ用パッケージのインストール**
イニシエータに必要なパッケージをインストールします。

イニシエータとして利用するEC2にOSログイン後、まずはルートスイッチ
`sudo su -`

イニシエータ用パッケージをインストールします。
`yum install -y iscsi-initiator-utils`

**②イニシエータ用サービスの起動**
サービス起動→サービス状態確認→サービス自動起動有効化
`systemctl start iscsid.service`
`systemctl status iscsid.service`
`systemctl enable iscsid.service`

**③イニシエータのIQN確認**
構築したイニシエータの**IQN**（iSCSI上でイニシエータやターゲットを識別するための識別名）を確認します（ここで出力されるイニシエータのIQNは、ターゲット構築時のACL設定で利用するのでメモします）。

`cat /etc/iscsi/initiatorname.iscsi`実行

```bash
# InitiatorName=<イニシエータのIQN>が出力されること
[root@ip-172-31-35-67 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:32c11771b058
```

###2.ターゲットの構築
iSCSIストレージである**ターゲット**を構築します。

**①ターゲット用EC2サーバの設定確認（セキュリティグループ、データボリューム）**
ターゲットとして利用するEC2セキュリティグループの`3260番ポート`（iSCSI利用ポート）が開いていることを確認してください。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/c9bb76f4-56a4-7fd6-db26-5d11a9564ad9.png)

iSCSIストレージのバックストアとして利用するデータボリューム`/dev/sdb`（サイズは8GBとしました）もアタッチしておきます。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/5d5e4acb-df1c-1abc-2951-3a89a2a8eacd.png)

**②ターゲット用パッケージのインストール**
ターゲットとして利用するEC2にOSログイン後、ルートスイッチ
`sudo su -`

ターゲット設定用パッケージのtargetcliをインストールします。
`yum install targetcli`

**③サービス起動**
サービス起動→サービス状態確認→サービス自動起動有効化
`sytemctl start target.service`
`systemctl status target.service`
`systemctl enable target.service`

**④ターゲット構築**
ターゲットでは**targetcliコマンド**を利用してターゲットの設定を行います。
targetcliを引数なしで実行することで対話型の使用となります。

`targetcli`実行（※）
※コマンド失敗時
ディストリビューションによっては必要なパッケージがインストールされていなくコマンドが失敗する可能性があります。
その場合`yum install dbus && yum install dbus-python`を実行後、再度targetcliを実行してみてください。

```bash
# エラーなくiSCSIコンソールに遷移すること。
[root@ip-172-31-34-219 ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.51
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

# LINUXと同様、lsコマンドを実行することでiSCSIの構成（ディレクトリ形式）を確認することが可能
/> 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]
/>
```

まずは**バックストア**（iSCSIで利用する実ストレージ。ブロックデバイスを指定するのが一般的）の設定を行います。
今回はデータボリューム**/dev/xvdb**（EC2の/dev/sdbはOS上では/dev/xvdbとしてマッピングされる）をバックストアとして利用します。
またバックストア名は**test-back-store**としました。

iSCSIコンソール上で以下コマンドを実行
`cd /backstores/block`
`create name=test-back-store dev=/dev/xvdb`

```bash
# 「Created block storage object test-back-store using /dev/xvdb.」と出力されること。
/> cd /backstores/block
/backstores/block> create name=test-back-store dev=/dev/xvdb
Created block storage object test-back-store using /dev/xvdb.
```

続いてiSQSIターゲットを作成します。
**IQN**を`**iqn.2020-09.com.example.redhat:target0**として設定しました。

以下コマンドを実行
`cd /iscsi`
`create iqn.2020-09.com.example.redhat:target0`

```bash
# 「Created block storage object test-back-store using /dev/xvdb.」と出力されること。
/backstores/block> cd /iscsi
/iscsi> create iqn.2020-09.com.example.redhat:target0
Created target iqn.2020-09.com.example.redhat:target0.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
```

なお、iSCSIコンソール上で**引数なしcd**を実行すると、カーソルを利用したディレクトリ移動が可能です。

`cd`実行
以下の図のように、`o- luns`にカーソル移動しENTER
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/7dfb6edf-ba2c-6d0f-656c-5c217e9c66cd.png)
続いて**LUN**（iSCSIターゲットの論理ドライブ番号。言い換えるならば、iSCSIターゲットに紐づけられたバックストア群）を設定し、バックストアとiSCSIターゲットの紐づけを行います。

`create /backstores/block/test-back-store`実行

```bash

# 「Created LUN 0.」と出力されること
/iscsi/iqn.20...et0/tpg1/luns> create /backstores/block/test-back-store
Created LUN 0.
```

iSCSIターゲットの**ACL**（アクセス制御リスト。簡単に言うと、どのiSCSIイニシエータから（該当IQNの）iSCSIターゲットに接続を許可するのか、という設定。）にiSCSIイニシエータ構築時に確認した**iSCSIイニシエータのIQN**を登録し、イニシエータ⇔ターゲット間の疎通を可能とさせます。

以下コマンド実行
`cd ../acls`
`create iqn.1994-05.com.redhat:32c11771b058`

```

# 「Created Node ACL for <iSCSIイニシエータのIQN>」「Created mapped LUN 0.」が出力されること
/iscsi/iqn.20...et0/tpg1/luns> cd ../acls
/iscsi/iqn.20...et0/tpg1/acls> create iqn.1994-05.com.redhat:32c11771b058
Created Node ACL for iqn.1994-05.com.redhat:32c11771b058
Created mapped LUN 0.
```

最後にiSCSIターゲットの設定内容を保存し、iSCSIコンソールを終了します。

`cd /`
`saveconfig`
`exit`

```bash
# saveconfig実行後、「Configuration saved to /etc/target/saveconfig.json」と出力されること。
/iscsi/iqn.20...et0/tpg1/acls> cd /
/> saveconfig
Configuration saved to /etc/target/saveconfig.json
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
```

###3.イニシエータからターゲットへの接続
イニシエータからターゲットへの接続を試みます。

**iscsiadmコマンド**を利用してiSCSIイニシエータからiSCSIターゲットの情報を確認します。

`iscsiadm -m discovery -t sendtargets -p <iSCSIターゲットのプライベートIPアドレス>`実行

```bash
# iSCSIターゲットのIQN（iqn.2020-09.com.example.redhat:target0）が出力されること
[root@ip-172-31-35-67 ~]# iscsiadm -m discovery -t sendtargets -p 172.31.34.219
172.31.34.219:3260,1 iqn.2020-09.com.example.redhat:target0`
```

iSCSIターゲットにログインします。

`iscsiadm -m node --login`実行

```bash

# ログイン成功メッセージが出力されること。
[root@ip-172-31-35-67 ~]# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2020-09.com.example.redhat:target0, portal: 172.31.34.219,3260]
Login to [iface: default, target: iqn.2020-09.com.example.redhat:target0, portal: 172.31.34.219,3260] successful.
```

**lsblk**（ブロックデバイスの一覧表示）に**-Sオプション**を付けることで、
SCSIデバイスのみを表示可能となります。
以下のようにiSCSIストレージの内容が出力されれば、iSCSIストレージが利用可能となりOKです。

`lsblk -S`実行

```bash
[root@ip-172-31-35-67 ~]# lsblk -S
NAME HCTL       TYPE VENDOR   MODEL             REV TRAN
sda  2:0:0:0    disk LIO-ORG  test-back-store  4.0  iscsi
```

###4.iSCSIストレージを実際に利用可能にする
以下操作を**イニシエータ側から**実施します。

**①iSCSIストレージのマウント**
接続したiSCSIストレージはイニシエータ側では/dev/sdaとして認識されたようなので、/dev/sdaのパーティションを1つ切ります。

`fdisk /dev/sda`

```bash
# 2GBのパーティションを1つ作成
[root@ip-172-31-35-67 ~]# fdisk /dev/sda

elcome to fdisk (util-linux 2.32.1).
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.
Created a new DOS disklabel with disk identifier 0xcc899df6.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-16777215, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215): +2G

Created a new partition 1 of type 'Linux' and of size 2 GiB.

Command (m for help): w

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

ファイルシステム（ext3）の作成
`mke2fs -j /dev/sda1`

```bash
# エラー出力がないこと
[root@ip-172-31-35-67 ~]# mke2fs -j /dev/sda1
mke2fs 1.45.4 (23-Sep-2019)
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: 120ec71d-090a-4647-94ed-7f38a6d39fd9
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
```

/mntにマウント
`mount /dev/sda1 /mnt`

```bash
# エラーが出力されないこと
[root@ip-172-31-35-67 ~]# mount /dev/sda1 /mnt
[root@ip-172-31-35-67 ~]#
```

マウント状態確認
`df -h`

```bash
# /dev/sda1がエントリにあればOK
[root@ip-172-31-35-67 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        386M     0  386M   0% /dev
tmpfs           408M     0  408M   0% /dev/shm
tmpfs           408M   11M  398M   3% /run
tmpfs           408M     0  408M   0% /sys/fs/cgroup
/dev/xvda2       10G  1.2G  8.9G  12% /
tmpfs            82M     0   82M   0% /run/user/1000
/dev/sda1       2.0G  3.1M  1.9G   1% /mnt
```

※参考
興味本位の操作です。
iSCSIストレージ側からみても、ext3が作成されているのが分かります。
また、iSCSI側でマウントをしようとすると既にイニシエータでストレージが利用されているため、マウントエラーとなります。

```bash
# 以下はiSCSIストレージ側で実行
[root@ip-172-31-34-219 ~]# sudo parted -l
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdb: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

# ext3ファイルシステム構築されている
Number  Start   End     Size    Type     File system  Flags
 1      1049kB  2149MB  2147MB  primary  ext3

# イニシエータでストレージが利用されているため、マウントエラー
[root@ip-172-31-34-219 ~]# mount /dev/xvdb1 /mnt
mount: /mnt: /dev/xvdb1 already mounted or mount point busy.
```

##参考書籍
[Linux教科書 LPICレベル2 Version4.5対応](https://www.shoeisha.co.jp/book/detail/9784798151250)