LinuxでiSCSIターゲットを構築してESXiのデータストアとして使用する

自宅で検証・学習用に使っている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のドキュメントに記載されている。

第9章 iSCSI ターゲットの設定 | Red Hat Product Documentation
第9章 iSCSI ターゲットの設定 | Red Hat Documentation

今回は、バックストアに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以下になることが多いのだが。キャッシュが効いているということだろうか?

コメント

タイトルとURLをコピーしました