自宅で検証・学習用に使っているVMware ESXiの環境がある。
ちまちまとストレージを増設していったら、いつの間にかSATAのSSDが4台、3.5インチのHDDが1台になり、内蔵ベイを使い切ってしまった。
こういうとき、普通のLinuxやWindowsマシンであればUSBの外付けHDDやSSDを追加していけるのだけれど、ESXiだとそのあたりが少々面倒。やろうと思えばUSBデバイスをデータストアとして利用することもできなくはないらしいのだが、その場合仮想マシンに対するUSBのバススルー機能を無効化する必要がある。
ESXiはiSCSIが使えるので、iSCSIのストレージサーバを別途立ち上げてそちらをデータストアとしてマウントすることにした。
用意した環境
以前ESXiを動かしていた古い機械が余っていたのでそれを使うことにする。メモリ16GB、CPUはXeon E3-1220 v3(4コア4スレッド)なのでストレージサーバとして使うだけなら十分な性能。マザーボードはASUSのP9D-Iというやつで、オンボードのNICが2つ載っているため片方を管理用、片方をiSCSI専用にできる。肝心のストレージには、とある事情で余っていた東芝のMN08ADA400E(4TB)を使うことにした。
OSにはOracle Linux 8を使う。
iSCSIターゲットの構築
OSの下準備
Oracle Linux 8 は最小構成でインストール済みという前提。
まずはストレージとして使うHDDを準備。parted でパーティションを作成する。全領域を使用するので、開始を「0G」、終了を「4T」と指定。
# parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart
パーティションの名前? []?
ファイルシステムの種類? [ext2]? xfs
開始? 0G
終了? 4T
(parted) quit
ファイルシステムを作成する。XFSで。
# mkfs -t xfs /dev/sdb1
fstabにマウント設定を行う。UUIDでディスクを識別させるためあらかじめblkidで確認しておく。
# blkid
/dev/mapper/ol-root: UUID="3ca95c15-2b73-4bff-8dbd-e34cf0192679" BLOCK_SIZE="4096" TYPE="xfs"
/dev/sda2: UUID="BO9NVE-xZHX-8YjD-R6M1-1BHv-HfEo-QBdkP8" TYPE="LVM2_member" PARTUUID="dbc201a7-02"
/dev/sdb1: UUID="a58bc760-40d2-4c4f-92f1-76a55bf704ee" BLOCK_SIZE="4096" TYPE="xfs" PARTUUID="25bc881e-ded8-4e11-b878-d4e9486ae394"
/dev/sda1: UUID="af03bd4e-231b-4cd8-a17e-ba3f7a0eaea7" BLOCK_SIZE="4096" TYPE="xfs" PARTUUID="dbc201a7-01"
/dev/mapper/ol-swap: UUID="4e5e1fb3-5856-4d8d-9424-83b439da924c" TYPE="swap"
/dev/mapper/ol-home: UUID="3cb24f34-c2ea-4890-a0bd-73f890573d03" BLOCK_SIZE="4096" TYPE="xfs"
/etc/fstab に以下のように追記。
UUID=a58bc760-40d2-4c4f-92f1-76a55bf704ee /disks xfs defaults 0 0
マウント先のディレクトリを作成し、ファイルシステムをマウントする。
# mkdir /disks
# systemctl daemon-reload
# mount -a
外部からの接続を受け付けるため、ファイアウォールを設定しておく。通常は3260ポートが使われるのでそこだけ穴をあけておくか、firewalldを停止するか。プライベート環境なので今回はfirewalldを停止する。
# systemctl stop firewalld
# systemctl disable firewalld
いろいろ悪さをするSELinuxも深く考えずに停止。あくまでも、プライベート環境。
sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
LinuxでiSCSIターゲットを構築する際は、targetcli というパッケージをインストールする。
# dnf -y install targetcli
# systemctl enable target
targetcliを使ったiSCSIターゲットの設定
iSCSIのストレージデバイスを設定するには、targetcliを使用する。詳細なやり方はすべてRedHatのドキュメントに記載されている。
今回は、バックストアにfileioストレージオブジェクトを使う方法で設定していくことにする。これはファイルとして作成したディスクイメージをiSCSIのストレージとして提供する方法になる。
例えば、/disks/vm-esxi/disk1.img としてディスクイメージを作成し、これをESXiからデータストアとして利用することを考える。
まず、事前にディスクイメージの格納先ディレクトリを作成しておく。
# mkdir /disks/vm-esxi
次に、targetcliを起動する。
# targetcli
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/>
targetcli は仮想的なディレクトリ構造になっており、各階層でオブジェクトを作ることによってターゲットのIQNを設定したり、バックストアを作成したり、アクセスルールを定義したりする仕組みになっている。
まず、イニシエータからアクセスする際にターゲットを識別するための識別名として、IQNを作成する。IQNは自動生成も可能だが、今回は手動で生成する。/iscsi に移動して、以下のように実行する。
> cd /iscsi
> create iqn.2023-09.home.dn:iscsi.vm-esxi-gems2
上記IQNの命名は割と適当。ちゃんとした命名規則もあるようだが、あくまでもプライベート利用なので。
次に、fileioバックストアにストレージオブジェクトを作成する。/backstores/fileio に移動して以下のように実行する。
> cd /backstores/fileio
> create esxi-disk1 /disks/vm-esxi/disk1.img 1T
これで、物理ファイルとして1TBのイメージファイルが作成される。
続いて、作成したストレージオブジェクトのLUNを作成する。
> cd /iscsi/iqn.2023-09.home.dn:iscsi.vm-esxi-gems2/tpg1/luns
> create /backstores/fileio/esxi-disk1
最後に、イニシエータへのアクセス許可を行うためにACLを作成する。事前にイニシエータ側のIQNを確認しておく必要があるので、ESXiのWeb画面から「ストレージ」→「アダプタ」タブ → 「iSCSIの設定」を開き、「名前とエイリアス」に記載されているIQNをコピーしておく。
targetcli で以下のようにACLを作成する。完了したら、targetcli をexitで抜ければ、自動的に設定が保存される。
> cd /iscsi/iqn.2023-09.home.dn:iscsi.vm-esxi-gems2/tpg1/acls
> create iqn.1998-01.com.vmware:gems2.dn.home:389250222:64
:
> exit
ESXiのイニシエータ設定
今回はiSCSI用に新たに物理NICを追加した。このNICをiSCSIで使用するためにはVMkernel NICとして設定する必要がある。Web画面の「ネットワーク」から「VMkernel NIC」タブ選び、「VMkernel NICの追加」を押下。
新しいポートグループを作る。今回、仮想スイッチは事前に作成しているものを使っているが、無い場合は別途作成しておくこと。
VMkernel NICの設定とポートグループの追加が完了したら、iSCSIの設定を行う。
「ストレージ」→「アダプタ」タブ → 「iSCSIの設定」を開くき、「ネットワークポートのバインド」には、先ほど作成したポートグループを設定し、IPアドレスを割り当てる。「固定ターゲット」にはターゲットのIQNとIPアドレス、ポート番号を指定する。
そうすると、「LIO-ORG iSCSI Disk」としてiSCSIのディスクが認識される。なぜかステータスが「低下しました」となっているが実用上特に問題は出ていない。
あとはこのデバイスに対して新しいデータストアを作成すればOK。
iSCSIのパフォーマンスについて
ネットワークがGigabit Ethernetなので上限の性能が決まってしまう(約125MB/s)ことは想像できるが、実際にどの程度のパフォーマンスが出るのか。
別のストレージオブジェクトを作ってWindowsマシンからマウント、Crystal Disk Markで速度を計ってみた結果が以下。
シーケンシャルな速度は想定内だけれど、ランダムアクセスがやたらと速い。HDDだと通常は1MB/s以下になることが多いのだが。キャッシュが効いているということだろうか?
コメント