##目標
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.