SCSI 错误信息表整理
前言
USB 管道的第一大使用场景非 U盘、移动硬盘莫属了!U盘、移动硬盘即 Mass Storage,使用USB 管道的 Bluk 传输承载 SCSI 协议进行资源交互。
SCSI 协议是让数据以块的方式进行传输的一种协议规范。
正文
Mass Storage 插入单板时总会有 “sd xxxx: [sdx] Result: xxxxxxx” 的log,这打印是 USB 枚举成功后,SCSI 识别设备的过程log。U盘即是USB 设备,也是 SCSI 设备。
下面是 SCSI 识别过程出错的 log,我们从中可以看到三个关键词:hostbyte、driverbyte 和 Sense Key。通过这查询这三个值,结合后续的文件系统 log,我们就可以大概了解出错的原因。
1 |
|
hostbyte 含义
hostbyte | 符号(Symbol) | 含义 |
---|---|---|
0x00 | DID_OK | 没有错误 |
0x01 | DID_NO_CONNECT | 在超时之前,不能连接 |
0x02 | DID_BUS_BUSY | 在超时期间,BUS一直处于忙状态 |
0x03 | DID_TIME_OUT | 因为其他原因超时 |
0x04 | DID_BAD_TARGET | BAD target |
0x05 | DID_ABORT | 因为其他原因取消 |
0x06 | DID_PARITY | Parity错误 |
0x07 | DID_ERROR | 内部错误(internal error) |
0x08 | DID_RESET | 被复位 |
0x09 | DID_BAD_INTR | 得到一个未被期望的中断 |
driverbyte 含义
driverbyte | 符号(Symbol) | 含义 |
---|---|---|
0x00 | DRIVER_OK | 没有错误 |
0x01 | DRIVER_BUSY | 未使用 |
0x02 | DRIVER_SOFT | 未使用 |
0x03 | DRIVER_MEDIA | 未使用 |
0x04 | DRIVER_ERROR | 内部驱动错误 |
0x05 | DRIVER_INVALID | 完成(DID_BAD_TARGET或DID_ABORT) |
0x06 | DRIVER_TIMEOUT | 超时完成 |
0x07 | DRIVER_HARD | 完成,但有致命错误 |
0x08 | DRIVER_SENSE | 有sense信息 |
0x10 | SUGGEST_RETRY | 重试SCSI请求 |
0x20 | SUGGEST_ABORT | 取消请求 |
0x30 | SUGGEST_REMAP | 重新映射block,但没有完成 |
0x40 | SUGGEST_DIE | 让内核Panic |
0x80 | SUGGEST_SENSE | 从设备上获取Sense信息 |
0xff | SUGGEST_IS_OK | 不需要做任何操作 |
Sense Key 含义
Sense Key 代码 | Sense Key符号 (Symbol) | 具体含义描述 |
---|---|---|
0x00 | NO_SENSE | 在特定逻辑单元上,没有特殊的Sense Key信息。发生这种情况情形包括: (1)成功完成一个命令;(2)命令收到CHECK CONDITION或COMMAND TERMINATED状态,原因为filemark,EOM或ILI某个比特位设置为1。 |
0x01 | RECOVERED_ERROR | 表示最后一个命令成功执行,但在该Target上有恢复动作。 详细原因由Additional Sense Key和信息区域来确定。当一条命令中出现多个纠正的错误时,报告哪一个错误被纠正是和设备相关。 |
0x02 | NOT_READY | 表示访问的逻辑地址单元不可访问,此时需要人为干预来纠正这种错误。 |
0x03 | MEDIUM_ERROR | 表示命令因为不可恢复的错误条件而终止,原因可能为存储介质的缺陷或 记录的数据存在错误。当Target区别不了存储介质的缺陷和特定硬件失效(Sense Key 4h)时,也会报告”MEDIUM ERROR”错误。 |
0x04 | HARDWARE_ERROR | 表示执行一条命令或在自检期间,Target发现了一个不可纠正的硬件错误,如控制器失效、设备失效、校验错误。 |
0x05 | ILLEGAL_REQUEST | 表示在SCSI命令描述块中有非法参数,或在数据/某些命令中(如FORMAT UNIT、SEARCH DATA等) 非法参数。当Target检测到命令块中有非法参数时,应该终止该命令而不能改变介质。当Target检测到额外参数数据中的无效参数时,Taget可能已经更改了介质。该Sense Key也可以表示收到无效的IDENTIFY消息。 |
0x06 | UNIT_ATTENTION | 表示可移除的介质可能已经被更改或Target被复位。 |
0x07 | DATA_PROTECT | 表示命令试图读/写被设置为读/写保护的block。读写操作不会被执行。 |
0x08 | BLANK_CHECK | 表示一次性写/顺序访问的设备遇到空介质或 |
0x0a | COPY_ABORTED | 表示COPY、COMPARE或COPY AND VERIFY命令取消,原因是源设备或目标设备或两者有一个错误条件。 |
0x0b | ABORTED_COMMAND | 表示Target取消了命令,SCSI initiator可以重试这个命令来修复。 |
0x0d | VOLUME_OVERFLOW | 带缓冲的设备中,访问量分区的末尾,但数据仍在Buffer中,没有写入介质。 RECOVER BUFFERED DATA命令来从缓冲区中读取数据。 |
0x0e | MISCOMPARE | 表示源数据和从介质中读取的数据不一致。 |
hostbyte、driverbyte 和 Sense Key 含义摘自 http://ilinuxkernel.com/ 。
SCSI 错误信息表整理
http://xxxdk.xyz/xxx/2020/01/SCSI-错误信息表整理/