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为例,它的通用格式定义如下:
关于其它长度的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格式定义如下:
日常维护过程中,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)》