深入理解Linux SCSI协议架构
小型计算机系统接口SCSI的全称是Small Computer System Interface,它本质上是一套存储协议族,由标准组织T10定义,包括 SCSI 架构模型(SAM)、基础命令集(SPC)和块设备命令集(SBC)等。
从架构上看,SCSI采用Initiator–Target–LUN三层模型:Initiator(主机 HBA)发起命令,Target(磁盘阵列、磁带库等)接收并执行命令,每个Target下可包含多个逻辑单元LUN,每个LUN就是一个逻辑盘。命令通过CDB(Command Descriptor Block)承载,包含操作码、LBA、传输长度等信息。SCSI命令集本身与传输介质解耦,可承载于多种“传输层”:传统并行SCSI总线、SAS、Fibre Channel(FCP)以及iSCSI(在 IP 网络中承载SCSI)等。因此,现代企业存储中大量“看起来不像 SCSI 的设备”,在协议层仍然使用SCSI命令集。
在Linux中,SCSI子系统是通用块层的重要前端:sd提供磁盘设备/dev/sdX,sg提供用户态直接下发CDB的通用接口,很多SATA/USB盘通过libata或USB Mass Storage协议在内核里以SCSI命令模型呈现。可以说,SCSI是传统存储世界的事实标准“语言”,而NVMe则是为SSD重新设计的新一代“语言”。