クイックスタート(5分)
iSCSIは、標準的なTCP/IPネットワーク経由でSCSIストレージコマンドを伝送するプロトコルです。NFSやSambaがファイルシステムレベルでファイルやフォルダーを共有するのに対し、iSCSIは未フォーマットのRAWブロックストレージをサーバーへ直接提供します。クライアントはリモートディスクを/dev/sdbのようなデバイスノードとしてローカルハードウェア同様に扱い、ext4、XFS、ZFSなどで自由にフォーマットして利用できます。
iSCSIの構成には、常に2つの主要な役割が存在します。
- ターゲット(Target):未加工のディスク、LVM論理ボリューム、またはファイルベースのディスクイメージをエクスポートするストレージサーバー。
- イニシエーター(Initiator):ターゲットにログインし、公開されたブロックストレージをマウントするクライアントマシン。
Ubuntu 24.04およびDebian 12で動作する最小限の構成手順は以下のとおりです。
1. ターゲットサーバー(IP: 192.168.10.50):
sudo apt update && sudo apt install -y targetcli-fb
sudo targetcli
# targetcliの対話シェル内で以下のコマンドを実行:
> cd /backstores/fileio
> create name=disk01 file_or_dev=/var/storage_disk01.img size=10G
> cd /iscsi
> create iqn.2026-10.com.itfromzero:storage.target01
> cd iqn.2026-10.com.itfromzero:storage.target01/tpg1/luns
> create /backstores/fileio/disk01
> cd ../acls
> create iqn.2026-10.com.itfromzero:client01
> exit
2. イニシエータークライアント(IP: 192.168.10.60):
sudo apt update && sudo apt install -y open-iscsi
echo "InitiatorName=iqn.2026-10.com.itfromzero:client01" | sudo tee /etc/iscsi/initiatorname.iscsi
sudo systemctl restart iscsid
sudo iscsiadm -m discovery -t sendtargets -p 192.168.10.50
sudo iscsiadm -m node -T iqn.2026-10.com.itfromzero:storage.target01 -p 192.168.10.50 --login
lsblk --scsi
lsblk --scsiコマンドを実行すると新しくアタッチされたディスクが表示され、フォーマットおよびマウントが可能な状態になります。
詳細解説
iSCSI修飾名(IQN)の仕組み
iSCSIネットワーク上のすべてのノードには、IQNと呼ばれるグローバルに一意な識別子が必要です。この文字列はRFC 3720で定義された厳格な形式に従います。
iqn.yyyy-mm.naming-authority:unique-name
iqn: 必須のタイプ指定子プレフィックス。2026-10: 組織がドメイン名を取得・登録した年と月。com.itfromzero: 逆順にしたインターネットドメイン名。storage.target01: この特定のストレージプールやホストを識別するために任意で指定する文字列。
LIOによるターゲットサーバーの設定
Linuxは、高性能なiSCSIターゲットエミュレーションのためにLinux-IO(LIO)カーネルサブシステムを使用します。LIOの管理はtargetcli対話型シェルを通じて行います。本番環境のワークロードでは、ファイルシステムのバッファリングオーバーヘッドを回避するため、ループバックファイルイメージではなく専用のLVM論理ボリュームをバックストアとして使用することをお勧めします。
この例では、ストレージサーバー上の既存の20GBボリューム(/dev/vg_storage/lv_iscsi)をマッピングします。
sudo targetcli
シェル内で、LVMボリュームにリンクしたブロックレベルのバックストアを作成します。
cd /backstores/block
create name=iscsi_block01 dev=/dev/vg_storage/lv_iscsi
ターゲットエンドポイントとそのターゲットポータルグループ(TPG)を定義します。
cd /iscsi
create iqn.2026-10.com.itfromzero:target.dbdata
そのターゲットグループ配下のLUN 0にストレージバックストアをバインドします。
cd /iscsi/iqn.2026-10.com.itfromzero:target.dbdata/tpg1/luns
create /backstores/block/iscsi_block01
アクセスコントロールリスト(ACL)を設定します。この文字列と完全に一致するイニシエーターのみがセッションを確立できます。
cd /iscsi/iqn.2026-10.com.itfromzero:target.dbdata/tpg1/acls
create iqn.2026-10.com.itfromzero:initiator.dbnode1
exit
ファイアウォールでポート3260を開放し、イニシエーターからの着信接続を許可します。
sudo ufw allow 3260/tcp
イニシエーターの設定
クライアントマシン(192.168.10.60)に移動します。サーバー側で作成したACLエントリと一致するようにクライアントのIQNを設定します。
echo "InitiatorName=iqn.2026-10.com.itfromzero:initiator.dbnode1" | sudo tee /etc/iscsi/initiatorname.iscsi
sudo systemctl restart iscsid open-iscsi
sudo systemctl enable iscsid open-iscsi
ディスカバリー要求を送信して、ターゲット上で利用可能なLUNを検出します。
sudo iscsiadm -m discovery -t sendtargets -p 192.168.10.50
コマンドにより検出されたターゲットIQNが返されます。ログインしてストレージをアタッチします。
sudo iscsiadm -m node -T iqn.2026-10.com.itfromzero:target.dbdata -p 192.168.10.50 --login
カーネルが新しいディスクを認識したことを確認します。
lsblk --scsi
dmesg | grep -i scsi | tail -n 10
/dev/sdbのような新しいSCSIデバイスが表示されます。
フォーマットと永続マウントの設定
ディスクをext4でフォーマットします。予約ブロックを1%に設定することで、大容量ドライブにおける利用可能な容量を最大限に確保できます。
sudo mkfs.ext4 -m 1 /dev/sdb
sudo mkdir -p /mnt/iscsi_storage
sudo mount /dev/sdb /mnt/iscsi_storage
起動時に確実にマウントできるよう、ドライブのUUIDを確認します。
sudo blkid -s UUID -o value /dev/sdb
/etc/fstabにエントリを追記します。_netdevパラメータは必須であり、ネットワークスタックが起動する前にsystemdがパーティションをマウントしようとするのを防ぎます。
UUID=3a7b4c81-8e3d-49f2-b710-d8a1c93f0b22 /mnt/iscsi_storage ext4 defaults,_netdev 0 2
再起動せずにマウント設定の構文を確認します。
sudo umount /mnt/iscsi_storage
sudo mount -a
df -h /mnt/iscsi_storage
応用的な使い方
CHAP認証の適用
IQNによるACLはクライアントの識別を行いますが、ネットワーク上の不正なスニッファーによるコマンド挿入までは防げません。CHAP(Challenge-Handshake Authentication Protocol)を導入することで、セッション確立時に暗号学的な相互認証を追加できます。
ターゲットサーバー側で認証を有効化します。
sudo targetcli
cd /iscsi/iqn.2026-10.com.itfromzero:target.dbdata/tpg1
set attribute authentication=1
cd acls/iqn.2026-10.com.itfromzero:initiator.dbnode1
set auth userid=db_backup_user
set auth password=K8s_Vol_Storage_Pass99!
exit
イニシエーター側の/etc/iscsi/iscsid.confに対応する認証情報を設定します。
node.session.auth.authmethod = CHAP
node.session.auth.username = db_backup_user
node.session.auth.password = K8s_Vol_Storage_Pass99!
イニシエーターのデーモンを再起動し、一度ログアウトしてから再ログインして認証情報を確認します。
sudo systemctl restart iscsid
sudo iscsiadm -m node -T iqn.2026-10.com.itfromzero:target.dbdata --logout
sudo iscsiadm -m node -T iqn.2026-10.com.itfromzero:target.dbdata --login
ボリュームのオンライン拡張
ブロックストレージの大きなメリットの1つは、無停止で容量を拡張できる点です。容量が不足した場合、ディスクをアンマウントしたりアプリケーションを停止したりすることなく、基盤となるLVMスライスとクライアントのファイルシステムを拡張できます。
- ターゲットサーバー上でボリュームを10GB拡張します:
sudo lvextend -L +10G /dev/vg_storage/lv_iscsi - イニシエーター側でSCSIバスを再スキャンし、新しい容量を検出します:
sudo iscsiadm -m node -Rlsblk /dev/sdbを確認します。ドライブが新しい30GBのサイズに反映されています。 - オンライン状態のままext4ファイルシステムをライブで拡張します:
sudo resize2fs /dev/sdb
実践的なヒントと注意点
ネットワークストレージには、物理的なSATAやPCIeバスでは見られないレイテンシや障害モードが存在します。ネットワークの寸断が1回発生するだけで、アプリケーション層全体でI/Oハングアップが引き起こされる可能性があります。
本番環境におけるベストプラクティス
/etc/fstabで_netdevを絶対に省略しない: このオプションがないと、systemdはネットワークが起動する前にパーティションのマウントを試行します。その結果、90秒後にマウントがタイムアウトし、再起動時にマシンが緊急モード(emergency mode)に突入してしまいます。- 専用VLANでストレージトラフィックを分離する: 標準のiSCSIトラフィックは暗号化されていません。独立した物理NICまたは専用の802.1Q VLAN(例:サブネット
10.10.100.0/24上のVLAN 100)経由でiSCSIをルーティングしてください。これにより、大量のバックアップトラフィックが本番Webトラフィックを圧迫するのを防止できます。 - ジャンボフレーム(MTU 9000)を有効化する: 標準的な1500バイトのEthernetパケットは、高負荷I/O時にCPU割り込みを多発させます。すべてのスイッチ、ターゲット、イニシエーターでMTU 9000を有効にすることでパケットヘッダーのオーバーヘッドが削減され、10GbEリンクにおけるシーケンシャルスループットが約850MB/sから1.1GB/s超へと向上します。
- 複数イニシエーターによるデータ破損を防ぐ: 標準的なファイルシステム(ext4、XFS)は内部にブロックキャッシュを保持し、ディスクを単一ホストが排他制御することを前提としています。ext4のまま2台のマシンから同一LUNに同時接続すると、数秒でファイルシステムが破損します。複数のノードから同じターゲットにアクセスする必要がある場合は、OCFS2やGFS2などのクラスタファイルシステムを使用してください。
- セッションは常に正常に切断する: イニシエーター側でファイルが開かれている状態でLANケーブルを抜いたりターゲットを再起動したりしてはいけません。セッションからログアウトする前に、必ずボリュームをアンマウントしてください:
sudo umount /mnt/iscsi_storage sudo iscsiadm -m node -T iqn.2026-10.com.itfromzero:target.dbdata --logout

