在此前NVMe 2.0协议规范介绍文章中,我们提到,NVMe 2.0不仅仅是功能的增加与完善,更多的是对整个NVMe协议家族的重新梳理,从技术到架构,全面应对存储技术持续发展带来的挑战。端到端数据保护(End-to-end Data Protection)作为企业级SSD的重要功能,在新的协议中也得到了一定加强,以实现对大规模存储系统的更强数据保护能力,也是NVMe 2.0“迎战未来”的举措之一。
端到端数据保护将数据的完整性保护范围从SSD内部延伸到外部链路,以防止静默错误产生——通过对逻辑块数据(Logical Block Data,通常指用户数据)添加额外的PI(Protection Information,保护信息,如CRC),使其作为数据的元数据被一同传输,主机端和NVM控制器都可以在接收到数据后,根据PI的内容对数据完整性进行校验,以确定这些数据是否真的可用。
命名空间在格式化并开启端到端数据保护功能时需要指定PI在元数据中的存放位置,要么位于元数据的开头,要么位于元数据的结尾。根据协议规定,PI需要提供逻辑块数据以及位于PI前面的元数据(如果有)的完整性保护,即:
● 如果元数据和PI大小相等,则只需要提供逻辑块数据的保护即可;
● 如果元数据大于PI,
a) PI位于元数据开头,只需要提供逻辑块数据的保护;
b) PI位于元数据结尾,需要提供逻辑块数据,以及PI前面所有元数据的保护。
DIF与DIX是我们非常熟悉的两种元数据传输与存放方式,在DIF中,元数据与逻辑块数据毗邻,如下图所示:
在DIX中,元数据会被存放在一个单独的缓冲区中,如下图所示:
NVMe支持的端到端数据保护类型和SBC-3(SCSI Block Commands - 3)中SCSI保护信息模型中的定义保持一致,即同为Type 1、Type 2和Type 3,在命名空间格式化时指定。
上面说完了端到端数据保护的基本概念,接下来我们看看NVMe 2.0增加了哪些内容。
我们知道,16位保护信息可以提供512B和4KiB逻辑块数据的完整性保护。NVMe 2.0协议规范在16位的基础上增加了32位和64位保护信息的定义,对超过4KiB的逻辑块数据提供保护能力。同时,新规范还提出,PI可以携带Storage Tag信息,用于替换部分或全部的Reference Tag,以应对更加复杂的NVM存储架构,并防止数据被误用等情况发生。
16位保护信息
在NVMe 1.x Spec时代,PI由2字节的Guard字段、2字节的Application Tag字段和4个字节的Reference Tag字段组成,共8个字节:
- Guard字段是基于逻辑块数据计算得出的CRC-16校验信息,计算方法在SBC-3中定义;
- Application Tag由上层应用指定,无需NVM控制器处理,也可用于禁用PI的检查;
- Reference Tag用于将逻