はじめに
Linuxサーバから共有Storageを利用する方法の一つにiSCSIがあります。iSCSIを利用すると、EthernetとTCP/IP Networkを通じて、離れた場所にあるStorageの領域をLocal Diskに近いBlock Deviceとして扱えます。
iSCSIを理解するには、Initiator、Target、LUN、SCSI Commandという用語の関係を整理する必要があります。InitiatorはStorageへ接続してI/Oを要求する側、TargetはStorageを提供する側、LUNはTargetから公開される論理的なStorage領域です。
ApplicationがiSCSI LUN上のFileへI/Oを行うと、FilesystemとBlock Layerを通ったI/O RequestはSCSI Subsystemへ渡されます。SCSI CommandはiSCSI PDUとしてTCP/IP Networkを通じてTargetへ送信され、Target側で処理された結果やDataがInitiatorへ返されます。
本記事では、SCSIとiSCSIの違いから、LinuxがiSCSI LUNをBlock Deviceとして認識するまでの処理、SATA・SAS・NVMeとの関係、FC SANとの違い、実際のI/O Flowまでを順番に解説します。
iSCSIとは
iSCSIはInternet Small Computer Systems Interfaceの略で、SCSI CommandをTCP/IP Network上で転送するProtocolです。一般的なEthernet Networkを利用して、ServerとStorageの間でBlock I/Oを実行します。
NFSやSMBがFile単位で共有するProtocolであるのに対し、iSCSIはBlock単位のStorageを提供します。iSCSI Targetから公開されたLUNは、Initiator側のLinuxではDiskに似たBlock Deviceとして認識されます。
| 方式 | 共有する単位 | Filesystemの配置 |
|---|---|---|
| iSCSI | Block | 一般にInitiator側で作成・管理する |
| NFS | File | Server側のFilesystemを共有する |
| SMB | File | Server側のFilesystemを共有する |
iSCSIでは通常TCP Port 3260が使用されます。ただし、利用PortはTargetの設定で変更できます。Networkを通じてStorage I/Oが流れるため、帯域、Latency、Packet Loss、冗長化、Securityの設計が性能と可用性へ直接影響します。
そもそもSCSIとは
SCSIはSmall Computer System Interfaceの略で、ComputerとStorageなどのPeripheral Deviceとの間でCommandやDataをやり取りするためのArchitectureとCommand Setです。
歴史的にはParallel SCSI Cableで接続する規格として知られていますが、現在のSCSIは物理Cableだけを意味しません。Read、Write、Inquiry、Report LUNs、Test Unit ReadyなどのCommand体系として、SAS、Fibre Channel、iSCSI、USB Storageなど、さまざまなTransportの上で利用されています。
- READ:指定したLogical BlockからDataを読み込む
- WRITE:指定したLogical BlockへDataを書き込む
- INQUIRY:Deviceの種類や識別情報を取得する
- TEST UNIT READY:Deviceが利用可能かを確認する
- REPORT LUNS:Targetが公開するLUNを取得する
SCSIではCommandを発行する側をInitiator、Commandを受けて処理する側をTargetと呼びます。Targetは一つ以上のLogical Unitを公開でき、それぞれがLUNによって識別されます。
SCSIとiSCSIの関係
SCSIはStorageを操作するCommand体系であり、iSCSIはそのSCSI CommandとDataをTCP/IP上で運ぶTransport Protocolです。iSCSIという名前にSCSIが含まれるのは、この関係によるものです。

Initiator側で作成されたSCSI Commandは、iSCSI PDUへ格納されます。PDUはProtocol Data Unitの略で、iSCSIがControl情報やDataを運ぶ単位です。PDUはTCP SegmentとIP Packetを通じてTargetへ送信されます。
なお、iSCSI PDUとTCP Segmentは必ずしも1対1で対応するわけではありません。TCPはByte StreamとしてDataを扱うため、一つのPDUが複数のTCP Segmentに分割される場合があります。
TargetはiSCSI PDUからSCSI Commandを取り出し、対応するLUNへ処理します。つまり、SCSIが「何を実行するか」を定め、iSCSIが「Network上でどう運ぶか」を定めています。
iSCSI Initiatorとは
iSCSI Initiatorは、iSCSI Targetへ接続し、SCSI Commandを発行する側です。一般的な構成では、Storageを利用するLinux ServerがInitiatorになります。
Linuxでは、KernelのiSCSI Transport機能とUser Spaceの管理Toolが連携します。open-iscsiを利用する環境では、iscsidがSessionを管理し、iscsiadmでDiscovery、Login、Logout、設定確認などを行います。
各Initiatorは、通常IQNなどのiSCSI Nameによって識別されます。IQNはiSCSI Qualified Nameの略で、次のような形式を取ります。
iqn.2026-08.example.com:server01
Target側ではInitiator Nameを使ってAccess Controlを設定できます。ただし、IQNによる許可だけを強い認証と考えるべきではありません。必要に応じてCHAP、Network分離、Firewall、IPsecなどを組み合わせます。
iSCSI Targetとは
iSCSI Targetは、Initiatorからの接続を受け付け、LUNを公開する側です。専用Storage Appliance、Linux Server、Storage SoftwareなどがTargetとして動作できます。
TargetもIQNなどのiSCSI Nameを持ちます。一つのTargetは一つ以上のPortalを持ち、一つ以上のLUNをInitiatorへ公開できます。Target Portalは、Initiatorが接続するIP AddressとTCP Portの組み合わせです。
| 要素 | 役割 | 例 |
|---|---|---|
| Target Name | iSCSI Targetを識別する | iqn.2026-08.example.com:storage.target01 |
| Portal | 接続先のIP AddressとPort | 192.0.2.10:3260 |
| ACL | 接続可能なInitiatorを制御する | Initiator IQNによる許可 |
| LUN | Initiatorへ公開するLogical Unit | LUN 0、LUN 1 |
LinuxをTargetとして構成する場合は、KernelのLIO Target Subsystemとtargetcliなどを利用する構成があります。TargetのBackendにはBlock Device、File、RAMなどを指定できますが、実際に利用できる方式や運用方法はDistributionのSupport範囲を確認します。
LUNとは
LUNはLogical Unit Numberの略で、SCSI Target内のLogical Unitを識別する番号です。Targetは物理Disk、RAID Volume、Logical Volume、Storage Poolの一部などをLogical UnitとしてInitiatorへ公開します。
LUNは物理Diskそのものとは限りません。Storage Arrayが複数の物理DriveからRAIDを構成し、その一部を一つのLUNとしてServerへ割り当てることもあります。反対に、一つのStorage Systemが多数のLUNを複数Serverへ提供することもできます。

LUN NumberはTarget内でLogical Unitを選択するために使用されます。一方、Linuxで割り当てられる/dev/sdbなどのDevice名はInitiator側の検出順序によって決まることがあり、LUN 1だから/dev/sdbになるという固定関係ではありません。
同じLUNへ複数Serverから同時にRead / Writeする場合、通常のext4やXFSを各Serverから独立してMountしてはいけません。複数Hostによる同時利用には、Cluster File System、Application側の共有Storage制御、SCSI Persistent Reservationsなど、用途に合った排他・整合性管理が必要です。
iSCSIでStorageへ接続する全体フロー
Linux InitiatorがiSCSI Storageを利用するまでの基本的な流れは、Discovery、Login、Session確立、LUN Scan、Block Device登録という順序で進みます。

① TargetをDiscoveryする
InitiatorはTarget PortalへDiscovery要求を送り、接続可能なTarget NameとPortal情報を取得します。SendTargets Discoveryが一般的に利用されます。
② TargetへLoginする
InitiatorはTargetへTCP Connectionを確立し、iSCSI Loginを行います。Login Phaseでは認証、Parameter Negotiation、利用する機能などが調整されます。CHAPを設定している場合は、この段階で認証が行われます。
③ iSCSI Sessionを確立する
Loginが成功すると、InitiatorとTargetの間にiSCSI Sessionが作られます。一つのSessionは一つ以上のTCP Connectionを持ち得ますが、一般的な構成ではSessionごとに一つのConnectionが利用されます。
④ LUNを検出する
LinuxのSCSI SubsystemはTargetへSCSI Commandを送り、公開されたLUNを探索します。各LUNに対してINQUIRY、容量取得などを行い、Deviceの種類やSizeを確認します。
⑤ Block Deviceとして登録する
Disk型のLUNであれば、SCSI Disk DriverがBlock Deviceとして登録します。udevがDevice Eventを受け取り、/dev/sdbなどのDevice Nodeや/dev/disk/by-path、/dev/disk/by-idなどのSymbolic Linkを作成します。
SCSI CommandがTCP/IPで運ばれる仕組み
ApplicationがiSCSI LUN上のBlockをReadすると、LinuxのBlock LayerとSCSI SubsystemがSCSI READ Commandを作ります。iSCSI Initiatorは、このCommandをSCSI Command PDUへ格納してTCP Connectionへ送信します。

TCPはDataを順序どおり、重複なく届けるための再送やFlow Controlを提供します。iSCSIはその上でCommand、Data、Statusをやり取りします。ReadではTargetからInitiatorへData-In PDUが送られ、WriteではInitiatorからTargetへData-Out PDUが送られます。
iSCSI PDUにはCommandを関連付けるための識別情報やSequence情報があります。TargetはCommandを実行し、SCSI StatusをInitiatorへ返します。成功だけでなく、Check ConditionなどのSCSI ErrorもiSCSI経由で運ばれます。
Network障害が起きるとTCP再送によって一時的なPacket Lossを回復できますが、再送待ちによってStorage I/O Latencyが大きくなる場合があります。TCP Connectionが失われた場合は、iSCSI Layerで再接続やSession Recoveryが必要になります。
LinuxでiSCSI LUNがBlock Deviceとして認識されるまで
iSCSI Loginが成功すると、KernelのiSCSI TransportとSCSI Subsystemが連携し、Remote TargetをSCSI Hostに接続されたDeviceのように扱います。
SCSI Mid-Layerは、Host、Channel、Target ID、LUNというAddress体系でDeviceを管理します。lsscsiでは、[host:channel:target:lun]という形式でAddressを確認できます。
Disk型のLogical Unitが検出されると、sd Driverが容量、Logical Block Size、Write Cache、Discard対応などを確認し、Block LayerへDiskを登録します。その結果、/sys/class/blockなどにDevice情報が公開されます。
udevはKernelからのueventを受け取り、/dev/sdXのDevice Nodeと永続的なSymbolic Linkを作成します。どのsdX名が割り当てられるかは検出状況で変わり得るため、運用ではWWID、UUID、by-path、Device Mapper Multipath名などを利用します。
iSCSI LUNをFilesystemから利用する仕組み
iSCSI LUNが/dev/sdbなどのBlock Deviceとして認識されると、Local Diskと同様にPartition TableやFilesystemを作成できます。
新規LUNであれば、必要に応じてPartitionを作り、その上にext4やXFSなどのFilesystemを作成してMountします。LVM Physical Volumeとして利用し、Volume GroupとLogical Volumeを作成することもできます。
Applicationからは通常のFile I/Oに見えます。Filesystemが作るBlock I/OはBlock LayerとSCSI Subsystemを通り、iSCSI DriverによってNetworkへ送信されます。Local Diskとの違いは、下位のTransportがTCP/IP Networkである点です。
複数のNetwork Pathから同じLUNへ接続する構成では、各Pathが別々の/dev/sdXとして見えることがあります。これらへ個別にFilesystemを作成せず、Device Mapper Multipathで一つのMultipath Deviceへ統合して利用します。
また、起動時に自動Mountする場合は、iSCSI LoginとDevice認識が完了してからMountする依存関係が必要です。単に/dev/sdbを/etc/fstabへ記述するだけでなく、UUIDやMultipath名、Network Storage用のMount Option、systemdの依存関係を考慮します。
SATA / SAS / NVMe / iSCSIの関係
SATA、SAS、NVMe、iSCSIは、すべてStorageへアクセスする仕組みに関係しますが、同じ分類ではありません。Interface、Transport、Command Setの関係を分けて考える必要があります。
| 方式 | 主なTransport / 接続 | Command体系 | Linux上の例 |
|---|---|---|---|
| SATA | SATA Link | ATA | /dev/sdaなど |
| SAS | Serial Attached SCSI | SCSI | /dev/sdaなど |
| NVMe | PCIe | NVMe | /dev/nvme0n1 |
| iSCSI | TCP/IP / Ethernet | SCSI | /dev/sdbなど |
SASとiSCSIはどちらもSCSI Commandを利用しますが、Transportが異なります。SASは専用のSerial Storage Interfaceを使用し、iSCSIはTCP/IP Networkを使用します。
NVMeはSCSI CommandをTCP/IPで運ぶiSCSIとは異なるCommand体系です。Network経由のNVMeとしてはNVMe over Fabricsがあり、TCPやRDMAなどをTransportとして使用できますが、iSCSIとは別のProtocolです。
また、iSCSI Targetの内部StorageがSATA HDD、SAS SSD、NVMe SSDのいずれである場合もあります。Initiatorから見えるiSCSIという接続方式と、Target内部の物理MediaやBackend Interfaceは別の層です。
iSCSIとFC SANの違い
iSCSIとFibre Channelは、どちらもServerへBlock Storageを提供するSANで利用されます。両者はSCSI Commandを運べますが、Network Infrastructureと運用方法が異なります。
| 項目 | iSCSI | FC SAN |
|---|---|---|
| Transport | TCP/IP | Fibre Channel Protocol |
| Network | Ethernet | FC Fabric |
| Server側Interface | 一般的なNICまたはiSCSI Offload対応Adapter | Fibre Channel HBA |
| 主な接続識別 | IQN、IP Address、Portal | WWPN、Fabric、Zone |
| Access制御 | ACL、CHAP、Network制御など | Zoning、LUN Maskingなど |
| 導入 | 既存Ethernet技術を活用しやすい | 専用Fabricの知識と機器が必要 |
iSCSIは一般的なIP Network技術を利用できる点が利点です。一方で、Storage Trafficが他のTrafficと競合しないよう、専用VLANや専用Network、QoS、十分な帯域、冗長Pathなどを設計する必要があります。
FC SANは専用Fabricによって安定したStorage Networkを構成しやすい一方、HBAやFC Switch、Zoningなどの専用技術が必要です。どちらが適切かは、既存Infrastructure、規模、性能、可用性、運用Skill、Costによって異なります。
iSCSI I/Oの全体フロー
ApplicationがiSCSI LUN上のFileを読み書きすると、FilesystemとPage Cacheが要求を処理します。実際のStorage I/Oが必要になると、Block Layerとblk-mqがI/O RequestをSCSI Subsystemへ渡します。
SCSI Mid-Layerで作られたREADやWRITE CommandはiSCSI Initiatorへ渡され、iSCSI PDUとしてTCP Connectionから送信されます。PacketはIP NetworkとEthernetを通り、Target Portalへ到達します。
iSCSI TargetはPDUからSCSI Commandを取り出し、指定されたLUNへ処理します。Target内部では、LUNのBackendがSATA HDD、SAS SSD、NVMe SSD、RAID Volume、Fileなどへ対応している場合があります。
Read DataやWriteのStatusはTargetからTCP/IP経由でInitiatorへ返ります。Initiator側でSCSI Commandが完了すると、結果がBlock Layer、Filesystemなどを通じてApplicationへ返されます。
iSCSIではStorage Latencyに加えてNetwork Latency、TCP再送、Switch Queue、NIC処理、Target負荷が関係します。性能調査ではInitiatorのBlock I/Oだけでなく、NetworkとTarget側Storageを含めて確認する必要があります。

まとめ
iSCSIは、SCSI CommandをTCP/IP Network上で転送し、Remote StorageをLinuxからBlock Deviceとして利用するためのProtocolです。SCSIがStorage操作のCommand体系を定め、iSCSIがCommandとDataをNetwork上で運びます。
InitiatorはSCSI Commandを発行してStorageを利用する側、TargetはCommandを受け取りLUNを提供する側です。LUNはTarget内のLogical Unitを識別し、物理Disk、RAID Volume、Storage Poolの領域などをInitiatorへ公開します。
LinuxがTargetへLoginすると、iSCSI Transport、SCSI Mid-Layer、sd Driverが連携し、LUNを/dev/sdbなどのBlock Deviceとして登録します。その上にFilesystemやLVMを構成することで、ApplicationはLocal Diskと同じFile APIを利用できます。
ただし、Device名は検出順序で変わる可能性があり、同じLUNへの複数Pathが複数の/dev/sdXとして見えることもあります。運用ではUUID、WWID、/dev/disk/by-path、Device Mapper Multipathなど、安定した識別方法を使用します。
iSCSIの仕組みを理解することで、Login障害、LUN未認識、Path障害、I/O LatencyなどをInitiator、Network、Target、Backend Storageの各レイヤーへ分けて考えられるようになります。
本記事ではiSCSIの仕組みを中心に解説しました。実際にAlmaLinuxでiSCSI Target / Initiatorを構築する方法や、iscsiadmによるDiscovery・Login・Session確認、Device Mapper MultipathによるPath冗長化、フェイルオーバの検証手順については、以下の記事で詳しく解説しています。


コメント