文章目录
- 概述
- DIF与DIX
- 端到端数据保护
- DIF
- DIF保护类型
- SCSI设备支持DIF
- Standard INQUIRY Data
- Extended INQUIRY Data VPD page
- SPT字段
- GRD_CHK、APP_CHK、REF_CHK字段
- READ CAPACITY(16)响应信息
- SCSI命令请求
- 读命令请求
- 写命令请求
- DIF盘格式化
- 相关参考
概述
DIF与DIX
DIF(Data Integrity Field),也称T10 PI(T10 Protection Information),主要用来防止和检测静态数据破坏,包括数据通道上的硬件故障和软件bug导致的数据破坏,以及磁盘不可检测和纠正的数据错误等。DIF通过在主机适配器和存储设备之间增加额外的数据保护信息,确保传输过程中数据的完整性。
DIF设计用来对主机适配器到存储介质的数据进行保护,但是数据从主机应用下发到主机适配器的过程中,也有可能会出现错误,为了解决这个问题,出现了DIX(Data Integrity Extension)。DIX对应用下发的IO请求也加上了额外的保护信息,从而实现对应用到主机适配器之间数据的保护。
端到端数据保护
DIX保护了从主机应用到主机适配器HBA的数据完整性,T10 PI保护了从主机适配器HBA到存储介质的数据完整性,DIX和T10 PI一起组成了从主机应用到存储介质的端到端数据完整性保护。
DIF
通常磁盘会被格式化成512B(或4096B)的扇区,但在物理上,扇区长度要更大一些,多出来的部分可以用来存储扇区数据的保护信息。
- Guard Tag:16位值,通常是存放扇区数据的CRC校验和;
- Application Tag:16位值,由应用或者操作系统定义使用;
- Reference Tag:32位值,通常记录写入扇区LBA地址的低32位,用于确保数据写入了正确的物理扇区。
DIF保护类型
T10 DIF定义的保护类型如下:
- Type 0:Type 0表示不对传输过程中的数据进行完整性保护检查等动作;
- Type 1:只会对Guard Tag和Reference Tag字段进行检查;
- Type 2:很少使用;
- Type 3:只对Guard Tag字段进行检查;
当设备被格式化成支持保护信息后,所有能正常访问设备的命令会依据CDB中携带的相关字段,包括RDPROTECT/WRPROTECT/VRPROTECT/ORPROTECT字段,来确定在传输数据过程中是否也会传输保护信息。
通常:
- 对于写命令,支持DIF的主机适配器会生成8字节的保护信息,并将其追加到上层下发的512B扇区数据后,发送到存储设备;
- 对于读命令,主机适配器从存储设备接受520B的数据,校验保护信息后,返回512B的扇区数据到上层。
SCSI设备支持DIF
Standard INQUIRY Data
标准INQUIRY数据中PROTECT字段指示设备是否支持PI。
Extended INQUIRY Data VPD page
Extended INQUIRY Data VPD page中SPT、GRD_CHK、APP_CHK、REF_CHK指示了设备支持的DIF保护类型。
SPT字段
SPT(Supported Protection Type)表示设备支持的保护类型,这个字段的含义取决于具体的设备类型,设备类型由PERIPHERAL DEVICE TYPE字段指示。如果PROTECT字段设置为0,说明设备不支持T10 PI,则SPT字段保留不使用;当PROTECT字段设置为1时,根据PERIPHERAL DEVICE TYPE字段决定SPT字段的含义,如下:
-
PERIPHERAL DEVICE TYPE字段设置为00h,SPT字段定义如下:
-
PERIPHERAL DEVICE TYPE字段设置为01h,SPT字段定义如下:
-
PERIPHERAL DEVICE TYPE字段值不为00h或者01h,SPT字段保留。
GRD_CHK、APP_CHK、REF_CHK字段
GRD_CHK\APP_CHK\REF_CHK字段指示了设备在传输数据是否会对保护信息中的对应字段进行检查。
-
GRD_CHK
-
APP_CHK
-
REF_CHK
READ CAPACITY(16)响应信息
通过READ CAPACITY(16)命令,也可以查询设备的DIF配置信息。
其中,PT_TYPE和PROT_EN字段指示了设备支持的DIF保护类型。
SCSI命令请求
通过INQUIRY信息,可以知道设备支持T10 PI的情况,但设备是否会传输保护信息,还要SCSI读写命令指示。
读命令请求
这里以READ (10)命令说明,其它读命令字类似。READ (10)的CDB中包含了RDPROTECT字段,RDPROTECT字段指示了主机在下发读请求时,设备是否会传输保护信息以及检查。如果设备没有格式化成支持PI,主机下发命令请求时,RDPROTECT字段应当设置成全0,否则,设备会返回错误,表明这是一个不合法的命令请求。
写命令请求
这里以WRITE (10)命令说明,其它写命令字类似。WRITE (10)的CDB中包含了WRPROTECT字段,WRPROTECT字段指示了主机在下发读请求时,设备是否会检查保护信息。
DIF盘格式化
对于DIF/DIX的支持,可使用sg_utils工具对不同类型的DIF硬盘进行格式化。
- 检查是否支持DIF:
sg_vpd --page=ei --long /dev/sda | grep SPT
- 格式化盘为DIF TYPE1:
sg_format --format --fmtpinfo=2 /dev/sda
- 格式化盘为DIF TYPE3:
sg_format --format --fmtpinfo=3 --pfu=1 /dev/sda
- 恢复成正常盘:
sg_format -F -s 512 /dev/sda
相关参考
- 《存储技术原理分析——基于Linux 2.6内核源码》
- 《SCSI Block Commands – 5 (SBC-5)》