LinuxのiSCSIの仕組みを徹底解説|SCSI・Initiator・Target・LUN・I/Oの流れ

はじめに

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の配置
iSCSIBlock一般にInitiator側で作成・管理する
NFSFileServer側のFilesystemを共有する
SMBFileServer側の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 NameiSCSI Targetを識別するiqn.2026-08.example.com:storage.target01
Portal接続先のIP AddressとPort192.0.2.10:3260
ACL接続可能なInitiatorを制御するInitiator IQNによる許可
LUNInitiatorへ公開するLogical UnitLUN 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上の例
SATASATA LinkATA/dev/sdaなど
SASSerial Attached SCSISCSI/dev/sdaなど
NVMePCIeNVMe/dev/nvme0n1
iSCSITCP/IP / EthernetSCSI/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と運用方法が異なります。

項目iSCSIFC SAN
TransportTCP/IPFibre Channel Protocol
NetworkEthernetFC Fabric
Server側Interface一般的なNICまたはiSCSI Offload対応AdapterFibre Channel HBA
主な接続識別IQN、IP Address、PortalWWPN、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冗長化、フェイルオーバの検証手順については、以下の記事で詳しく解説しています。

Linux Multipathを徹底解説|iSCSI構築からWWID・Device Mapper・フェイルオーバまで

コメント