浅析SCSI协议

文章目录

    • SCSI协议介绍
      • SCSI协议发展历程
      • SCSI协议标准
        • SCSI命令集文档
    • SCSI体系结构
      • SCSI基本术语
      • SCSI client-server模型
    • SCSI命令模型
      • 命令描述块(CDB)
        • 通用CDB字段
      • 命令响应状态
        • Status code
        • Status qualifier
      • Sense Data
        • Sense key信息
    • 相关参考

SCSI协议介绍

SCSI,全称Small Computer System Interface,即小型计算机接口,是一种用于连接计算机及其外围IO设备(如磁盘、光驱等)的接口标准,目前最大部分的应用是在存储设备上。SCSI协议定义了统一的信息交互模型和必要的命令集,用于计算机与不同设备间进行数据通信;同时SCSI协议不与特定的传输介质绑定,因此可以在多种传输介质上实现,如基于光纤的FCP链路协议、基于IP网络的ISCSI协议以及SAS链路协议等。

SCSI协议发展历程

SCSI协议的发展可划分为SCSI-1/SCSI-2/SCSI-3三个阶段,最新的为SCSI-3,也是目前应用最广泛的SCSI版本。下表展示了SCSI协议的整体发展历程:
浅析SCSI协议_第1张图片
早期SCSI协议都是采用的并行总线技术,随着串行高速总线技术的加入,并行SCSI技术也在后来被SAS总线技术被替代。

SCSI协议标准

时至今日,SCSI协议已经发展成了一个庞大的协议体系,并且已成为了存储企业级应用领域事实上的协议标准。由于SCSI协议并不局限于某一特定的链路传输技术,各种支持SCSI协议的链路实现标准被加入了SCSI协议当中,如今的SCSI协议是一个大量标准的集和。整体来说,SCSI协议标准文档被划分成了如下的多个部分:
浅析SCSI协议_第2张图片
这些标准文档可以大致可以分为三类:体系结构文档、设备实现文档和链路实现文档。

  • 体系结构文档:包括SAM和SPC文档,其中SAM定义了SCSI协议的体系结构模型、SCSI标准集合的功能划分以及SCSI实现标准的通用要求等;SPC为所有SCSI设备类型定义模型的实施标准,此标准指定了所有SCSI设备通用的所需命令和行为,并规定了SCSI启动器设备在向任何SCSI目标设备发送命令时要遵循的要求;
  • 设备实现文档:定义了同介质无关实现该设备必要的命令集,例如实现块设备(如硬盘)的SBC命令集,实现流设备(如磁带)的SSC命令集等;
  • 链路实现文档:描述了SCSI协议在各种链路协议的实现细节,这些都在单独的协议文档里面定义,例如基于光纤的FC链路协议、基于SAS的链路协议以及基于IP链路的iSCSI协议。
SCSI命令集文档

SCSI命令集文档由SPC(SCSI Primary Commands)、SBC(SCSI Block Commands)、ZBC(Zoned Block Commands)、SES(Enclosure Services Commands)等构成,其中,最常使用的是SPC和SBC文档:

  • SPC文档定义了适用于所有SCSI设备的通用命令集,如INQUERY、TUR等命令以及Sense信息格式;
  • SBC文档中定义了适用于块设备的命令集,如READ、WRITE、VERIFY等。

通常SCSI文档推荐阅读的顺序为SAM、SPC以及特定于设备类型的命令集文档。

SCSI体系结构

SCSI体系结构主要包含了SCSI通信模型、命令模型、任务管理等方面的内容。

SCSI基本术语

SCSI协议定义了一系列概念,这里针对一些基本术语进行简单的说明。
浅析SCSI协议_第3张图片

  • Initiator:启动器,可以发送SCSI命令并接收响应的设备;
  • Target:目标器,充当SCSI命令接收器的设备;
  • LUN:逻辑单元,是SCSI目标器中充当数据源或目的地的名字空间资源,一个目标器可以包含多个LUN,每个LUN可以具有不同的属性;
  • NEXUS:NEXUS用于描述启动器端口和目标器端口之间的连接。

SCSI client-server模型

SCSI的Initiator与Target共同构成了一个典型的C/S模型,每个指令都是“请求/应答”这样的方式来实现。
浅析SCSI协议_第4张图片

SCSI client-server模型中包含两个重要的角色:

  • SCSI启动器:SCSI Initiator Device,SCSI是一个C/S架构,其中Client端成为启动器,负责向SCSI目标器发送请求指令,如SAS主机适配器;
  • SCSI目标器:SCSI Target Device,作为Server端,接收来自SCSI启动器的指令并解析处理,如SAS硬盘。

完整的SCSI协议的体系结构模型在SAM文档中进行描述,可以查阅以对SCSI协议有更多的了解。

SCSI命令模型

SCSI协议对链路传输没有进行严格的限制,但约束了SCSI的命令模型。协议允许使用SAS、FC以及以太网等不同的链路实现,但对所有的SCSI传输层实现而言,都必须遵循统一的SCSI命令模型。SCSI命令模型约束了SCSI命令执行过程、命令请求格式、命令响应状态以及错误描述等内容。

命令描述块(CDB)

一个完整的SCSI请求由CDB、数据、命令属性信息构成,其中,CDB描述了该SCSI命令的具体细节,包括命令操作类型(read/write/inquiry等)、数据的处理方式等信息。最早的SCSI-1支持的是6个字节的指令,后来慢慢演变成了10字节,12字节,16字节,后续还有应用扩展为32字节的CDB。这里以16字节长度CDB为例,它的通用格式定义如下:
浅析SCSI协议_第5张图片
关于其它长度的CDB格式定义,可以参考《SCSI Primary Commands》(SPC)手册。

通用CDB字段

对于不同格式的CDB,都会包含一些通用的字段,对于这些通用的CDB字段描述如下:

  • Operation Code:定义在CDB的第一个字节,描述命令请求类型,详细的命令描述可以参考SPC以及设备相关的命令手册中;
  • Service action:与Operation Code配合执行特定的操作;
  • Logical block address:简称LBA,描述数据读取或者写入的LUN地址;
  • Transfer length:描述数据传输长度,使用扇区作为基本单位;
  • Parameter list length: 用于描述从Data-out缓冲区发送的字节数,可以为0;
  • Allocation length:用于描述Data-in缓冲区已分配的最大字节数。

命令响应状态

当目标器设备完成命令处理后,会返回状态响应给启动器,用于指示命令的完成状态:完成或者异常。SCSI协议约定使用特定的状态码(Status code)和状态限定符(Status qualifier)来告知应用命令的处理结果。

Status code

SCSI协议定义的状态码如下表所示:

状态码 状态 描述
00h GOOD 命令正常完成,未发生错误
02h CHECK CONDITION 命令处理返回Sense Data,需要根据Sense信息确定后续执行的动作
04h CONDITION MET 仅限于为其指定的命令使用
08h BUSY 设备处于忙碌状态,暂时无法处理新的命令
18h RESERVATION CONFLICT NA
28h TASK SET FULL 设备task set资源不足
30h ACA ACTIVE NA
40h TASK ABORTED 命令被终止
Status qualifier

Status qualifier与配合Status code,提供更多返回该状态的原因的信息。Status qualifier格式定义如下:
浅析SCSI协议_第6张图片
日常维护过程中,Status code使用的比较多,Status qualifier通常不太关注,需要了解的话可以查看SAM手册。

Sense Data

当命令以CHECK_CONDITION状态终止时,目标器设备会返回Sense Data,用于告知上层应用命令终止的原因,应用会根据Sense data确定如何进一步处理。Sense data主要通过Sense key、Asc(additional sense code)以及Ascq(additional sense code qualifier)来描述命令执行的异常信息,其中:

  • Sense key描述了主要错误信息的类别;
  • Asc和Ascq在Sense key的基础上进一步说明了具体的错误原因。
Sense key信息

Sense key是对错误信息做的一个分类,协议定义的Sense Key及其描述如下:

Sense Key 定义 描述
0h NO SENSE 表示没有上报Sense信息
1h RECOVERED ERROR 表示命令完成,但是处理过程中设备执行了修复的动作
2h NOT READY 表示设备未准备就绪
3h MEDIUM ERROR 表示介质或者记录数据出现了错误
4h HARDWARE ERROR 表示设备出现了硬件错误
5h ILLEGAL REQUEST 表示非法请求,通常是设备在CDB中检测到了无效的参数
6h UNIT ATTENTION 表示出现了需要上层注意的事件,例如Lun复位、新接入设备可能触发
7h DATA PROTECT 表示设备在尝试访问受保护的区域
8h BLANK CHECK 表示遇到非预期的空白或非空白介质
9h VENDOR SPECIFIC 表示特定厂商定义的错误
Ah COPY ABORTED 表示在传输某些数据之后但在传输所有数据之前,第三方复制命令被中止。
Bh ABORTED COMMAND 表示设备终止了命令的执行
Ch Reserved 保留
Dh VOLUME OVERFLOW 表示缓冲的SCSI设备已到达分区末尾,数据可能保留在尚未写入介质的缓冲区中
Eh MISCOMPARE 表示出现了数据不一致
Fh COMPLETED 表示需要上报命令完成的Sense Data

相关参考

  • 《SCSI Architecture Model - 5(SAM-5)》
  • 《SCSI Primary Commands - 4(SPC-4)》

你可能感兴趣的:(存储技术手札,SCSI,存储)