【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とは)
【図解】初心者にも分かる iSCSI の仕組み ~FCやNAS(NFS)との違いやメリット,デメリット~(SAN の種類とメリット・デメリット)

SANとNASの違い

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

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

SAN
NASと比べて処理が高速

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

より詳しくは、参考にさせて頂いたサイト
【図解】初心者にも分かる iSCSI の仕組み ~FCやNAS(NFS)との違いやメリット,デメリット~(NAS (CIFS, NFS接続) との違い、メリット・デメリット)

作業の流れ

項番 タイトル
1 イニシエータの構築
2 ターゲットの構築
3 イニシエータからターゲットへの接続
4 iSCSIストレージを実際に利用可能にする

手順

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実行

# 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利用ポート)が開いていることを確認してください。

iSCSIストレージのバックストアとして利用するデータボリューム/dev/sdb(サイズは8GBとしました)もアタッチしておきます。

②ターゲット用パッケージのインストール
ターゲットとして利用する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を実行してみてください。

# エラーなく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

# 「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

# 「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

続いてLUN(iSCSIターゲットの論理ドライブ番号。言い換えるならば、iSCSIターゲットに紐づけられたバックストア群)を設定し、バックストアとiSCSIターゲットの紐づけを行います。

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


# 「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

# 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アドレス>実行

# 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実行


# ログイン成功メッセージが出力されること。
[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実行

[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

# 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

# エラー出力がないこと
[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

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

マウント状態確認
df -h

# /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側でマウントをしようとすると既にイニシエータでストレージが利用されているため、マウントエラーとなります。

# 以下は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対応