背景:iSCSIが本当に必要になる場面とは?
自宅やスモールチームの環境で仮想化ラボを運用していると、こんな問題によく直面する。マシンAに500GBの空きディスクがあって、マシンBはVMを動かすためにストレージが不足している。NFSはファイルレベルの共有には使えるが、本当のブロックデバイスが必要な場合——たとえばext4に直接フォーマットしたり、物理ディスクのようにマウントしたり、VMware/ProxmoxのデータストアとしてiSCSIを使いたい場合——はiSCSIが正しい選択だ。
Fedoraをメインの開発マシンとして2年間使っており、パッケージの更新速度にはかなり満足している。チームのラボストレージをセットアップする際、Fedora ServeriSCSIターゲットとして選ぶのは自然な判断だった——targetcliは公式リポジトリから入手でき、ドキュメントも充実しており、インタラクティブシェルも非常に直感的だ。
iSCSIの仕組みとは? シンプルだ。ターゲットマシンからブロックデバイス(ファイル、LVMボリューム、または実ディスク)をTCP/IP経由で公開する。イニシエーター(クライアント)マシンが接続すると、それが通常のSCSIディスクとして認識される——パーティション分割、フォーマット、マウントが普通のディスクと同様に行える。
NFSと比べた利点:ブロックワークロードにおいて低レイテンシ、クラスター向けの排他ロックをサポート、そしてイニシエーター側はターゲットが使用しているファイルシステムを気にする必要がない。
targetcliのインストールと環境の準備
Fedora Serverでは、メインパッケージはtargetcli-fb(Red Hat純正targetcliのコミュニティフォーク)だ:
sudo dnf install -y targetcli-fb
サービスの起動と有効化:
sudo systemctl enable --now target
iSCSIポート(3260/TCP)のファイアウォールを開放:
sudo firewall-cmd --permanent --add-service=iscsi-target
sudo firewall-cmd --reload
サービスの確認:
sudo systemctl status target
Active: active (exited) と表示されれば正常だ。サービスはブート時に設定を読み込んで終了する。まだ設定がない場合は何も行わない。
iSCSI Targetの設定手順
すべての設定はtargetcliを通じて行う——ファイルシステムナビゲーション形式のインタラクティブシェルだ:
sudo targetcli
/> というプロンプトが表示される。ls で構造を確認、cd で移動、help でコマンドを確認できる。
ステップ1:バックストアの作成
バックストアは実際のデータが保存される場所だ。よく使われる3種類がある:
ファイルベース——最もシンプル、LVMがない場合に使用:
# ファイルを格納するディレクトリを事前に作成する
sudo mkdir -p /var/lib/iscsi-storage
# targetcli内で:
/backstores/fileio> create storage01 /var/lib/iscsi-storage/disk01.img 20G
ブロックベース——LVMボリューム、本番環境に最適:
# LVMボリュームを作成
sudo lvcreate -L 50G -n iscsi-vol vg0
# targetcli内で:
/backstores/block> create storage02 /dev/vg0/iscsi-vol
RAMディスク——ベンチマーク専用、再起動でデータが消える:
/backstores/ramdisk> create ramdisk01 1G
ホームサーバーのラボではLVMの準備が不要なためfileioをよく使う。本番環境ではLVM上のblock-basedの方が明らかにパフォーマンスが高い。
ステップ2:iSCSI Targetの作成
iSCSIターゲットはIQN(iSCSI Qualified Name)で識別される。フォーマット:iqn.YYYY-MM.tld.domain:identifier
/iscsi> create iqn.2026-06.com.itfromzero:storage01
IQNを指定しない場合、targetcliはホスト名から自動生成する。しかし後の管理がしやすいよう、明確な名前を付けることを推奨する。
ステップ3:LUNの作成
作成したターゲットのTPG(Target Portal Group)に移動する:
/iscsi/iqn.2026-06.com.itfromzero:storage01/tpg1/luns> create /backstores/fileio/storage01
LUN 0が自動的に作成され、指定したバックストアにマッピングされる。
ステップ4:ポータルの設定
ポータルはターゲットがリッスンするIPアドレスとポートだ:
/iscsi/iqn.2026-06.com.itfromzero:storage01/tpg1/portals> create 192.168.1.100 3260
192.168.1.100 をFedora ServerのIPアドレスに置き換える。すべてのインターフェースでリッスンする場合は 0.0.0.0 を使用する。
ステップ5:ACLの設定
これはセキュリティ上最も重要なステップだ。デフォルトではTPGは generate_node_acls=1 モード(すべてのイニシエーターを許可)になっている。本番環境では無効にして、各イニシエーターをホワイトリストに登録すべきだ:
/iscsi/iqn.2026-06.com.itfromzero:storage01/tpg1> set attribute generate_node_acls=0
# 特定のイニシエーターにACLを追加
/iscsi/iqn.2026-06.com.itfromzero:storage01/tpg1/acls> create iqn.2026-06.com.itfromzero:client01
CHAP認証(ユーザー名/パスワード)を追加する場合:
/iscsi/iqn.2026-06.com.itfromzero:storage01/tpg1/acls/iqn.2026-06.com.itfromzero:client01> set auth userid=iscsiuser password=SecretPass123
設定の保存
/> saveconfig
/> exit
設定は /etc/target/saveconfig.json に保存される。targetサービスはブート時にこのファイルを読み込む。
イニシエーター側(Linux クライアント)からの接続
クライアントマシン——Fedora、Ubuntu、その他のLinuxディストリビューションで:
# Fedora/RHEL
sudo dnf install iscsi-initiator-utils
# Ubuntu/Debian
sudo apt install open-iscsi
クライアントマシンのIQNを確認する(ターゲット側でACLを作成するために必要):
cat /etc/iscsi/initiatorname.iscsi
ターゲットの検出:
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100
期待される出力:
192.168.1.100:3260,1 iqn.2026-06.com.itfromzero:storage01
ターゲットへのログイン:
sudo iscsiadm -m node -T iqn.2026-06.com.itfromzero:storage01 -p 192.168.1.100 --login
新しいディスクの確認:
lsblk
# またはdmesgで確認
dmesg | tail -20
/dev/sdb(または /dev/sdc)デバイスが表示される。あとは通常のディスクと同様にフォーマットしてマウントするだけだ:
sudo mkfs.ext4 /dev/sdb
sudo mount /dev/sdb /mnt/iscsi-storage
ステータスの確認とモニタリング
ターゲット構造の確認
sudo targetcli ls
このコマンドはバックストア、ターゲット、LUN、ポータル、ACLの全構造を表示する——デバッグ時に非常に役立つ。
接続中のセッションの確認
sudo targetcli /iscsi/iqn.2026-06.com.itfromzero:storage01/tpg1 sessions
iostatによるI/Oモニタリング
# sysstatがなければインストール
sudo dnf install sysstat
# 1秒ごとにリアルタイムモニタリング
iostat -x 1
fileioバックストアの場合、.img ファイルを格納するディスクのI/Oが表示される。blockバックストアの場合、LVMデバイス上のI/Oが直接表示される。
イニシエーターからのクイックベンチマーク
sudo fio --filename=/dev/sdb --rw=read --bs=128k --iodepth=32 \
--runtime=30 --numjobs=4 --time_based \
--group_reporting --name=seq-read-test
自分のラボ(ギガビットLAN、SSD上のfileioバックストア)では、シーケンシャルリードが約900〜950 MB/sに達する——1Gbpsの回線をほぼ使い切っている。さらなるスループットが必要なら、10GbEの導入またはジャンボフレームの有効化を検討しよう。
実践的な注意点
- SELinuxコンテキスト:SELinux enforcing(Fedoraのデフォルト)を使用している場合、バックストアディレクトリに正しいコンテキストを設定する必要がある:
sudo semanage fcontext -a -t tgtd_var_lib_t "/var/lib/iscsi-storage(/.*)?" sudo restorecon -Rv /var/lib/iscsi-storageこのステップを省略すると、targetサービスがバックストアファイルを読み取れなくなる可能性がある——エラーが表示されにくく、デバッグが困難だ。
- イニシエーターでの永続マウント:ネットワーク起動後にマウントが確実に行われるよう、
/etc/fstabに_netdevオプションを付けて追加する:/dev/sdb /mnt/iscsi-storage ext4 _netdev,auto 0 0 - iSCSI vs NVMe-oF:10GbE以上で最小レイテンシが必要な場合、NVMe-oFは自然なアップグレードステップだ。しかし1GbEのラボではtargetcli経由のiSCSIで十分で、セットアップははるかに簡単だ。
- 未使用時のログアウト:マウントのハングを避けるため、ターゲットを再起動する前にイニシエーター側でクリーンにログアウトする:
sudo iscsiadm -m node -T iqn.2026-06.com.itfromzero:storage01 -p 192.168.1.100 --logout
targetcliのインタラクティブシェルはかなり使いやすい——ls で現在の構造を確認、cd でナビゲート、コマンドを忘れたら help で確認するだけだ。設定ファイルを直接編集する手動のiSCSI設定と比べて、targetcliは大幅な時間節約になり、構文エラーも最小限に抑えられる。

