浅析DIX与DIF(T10 PI)

news2024/9/22 19:29:00

文章目录

    • 概述
      • 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)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/901621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 API 介绍

文章目录 一、RKNN 初始化及对象释放二、RKNN 模型配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN-Toolkit2 API 详细说明。 一、RKNN 初始化及对象释放 在使用 RKNN Toolkit2 的所有 API 接口时,都需要先调用 RKNN()方法初始化 RKNN 对象,…

C++进阶 特殊类的设计

本篇博客介绍:介绍几种特殊的类 特殊类的设计 设计一个类不能被拷贝设计一个类 只能在堆上创建对象设计一个类 只能在栈上创造对象设计一个类不能被继承单例模式饿汉模式懒汉模式单例模式对象的释放问题 总结 设计一个类不能被拷贝 我们的拷贝只会发生在两个场景当…

【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 写在前面 本系列文章将对LOAM源代码进行讲解,在讲解过程中,涉及到论文中提到的部分,会结合论文以及我自己的理解进行解读,尤其是对于其中坐标变换的部分&…

chatGPT-对话爱因斯坦

引言 阿尔伯特爱因斯坦( 1879年 3 月 14 日 – 1955 年 4 月 18 日)是一位出生于德国的理论物理学家,被广泛认为成为有史以来最伟大、最有影响力的科学家之一。他以发展相对论而闻名,他还对量子力学做出了重要贡献,因…

安装搭建私有仓库Harbor

目录 一、安装docker编排工具docker compose 二、安装Harbor软件包 三、修改配置文件 四、运行安装脚本 五、安装后验证 六、使用Harbor 一、安装docker编排工具docker compose 在github上选择自己想要的版本下载 https://github.com/docker/compose/releases 下载好…

Android AppCompatActivity标题栏操作

使用 AndroidStudio 新建的工程默认用 AppCompatActivity ,是带标题栏的。 记录下 修改标题栏名称 和 隐藏标题栏 的方法。 修改标题栏名称 Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R…

语言基础2 矩阵和数组

语言基础2 矩阵和数组 矩阵和数组是matlab中信息和数据的基本表示形式 可以创建常用的数组和网格 合并现有的数组 操作数组的形状和内容 以及使用索引访问数组元素 用到的函数列表如下 一 创建 串联和扩展矩阵 矩阵时按行和列排列的数据元素的二维数据元素的二维矩…

华为OceanStore V3存储模拟器搭建教程

1 软件下载 软件地址:https://pan.baidu.com/s/12-5mZmq3cNiyC7J6KC0XxA?pwd1234 提取码:1234 2 软件安装 2.1 VMware软件安装 VMware软件安装请参考百度教程,注意事项如下: (1)软件安装前电脑需要开启虚拟…

2021年06月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数对 给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。 比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2个两倍,18是9的两倍。 时间限制:1000 内存限制:65536 输入 一行,给出2到15个两两不同且…

第十章MyBatis的参数

单个简单参数处理 MyBatis中的sql语句中的属性 id:为mapper接口的方法名resultType:为返回参数的类型parameterType:为传递过来的参数类型,MyBatis会自动推断一般不用填写 javaType表示说明这个字段的java类型 jdbcType表示说明…

C++ 的关键字(保留字)完整介绍

1. asm asm (指令字符串):允许在 C 程序中嵌入汇编代码。 2. auto auto(自动,automatic)是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明…

[python爬虫] 爬取图片无法打开或已损坏的简单探讨

本文主要针对python使用urlretrieve或urlopen下载百度、搜狗、googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨。同时,作者将进一步帮你巩固selenium自动化操作和urllib…

csapp archlab PartC满分解答

任务 修改ncopy.ys和pipe-full.hcl以尽可能的提高ncopy.ys的运行速度 思路 pipe-full.hcl: 实现iaddq指令(家庭作业4.54)实现加载转发(家庭作业4.57) ncopy.ys: 使用循环展开(第5.8节&…

Python将本地文件上传到百度网盘

Python将本地文件上传到百度网盘 前言相关介绍Python将本地文件上传到百度网盘下载相关依赖库获取授权打开链接复制授权码粘贴授权码到终端,并回车连接到百度网盘 上传文件文件同步上传文件夹下载文件夹 前言 由于本人水平有限,难免出现错漏,…

Golang文件操作详解

打开和关闭文件 从 Go 1.16 开始,现在提供了相同的功能 通过包 IO 或包操作系统,以及这些实现 应该在新代码中首选。 有关详细信息,请参阅特定函数文档。 弃用了"io/ioutil"对文件的操作 读取文件方法一(os.open+file.read只读形式): os.Open() 函数能够打开…

攻防世界-Web_python_template_injection

原题解题思路 一说到python的web我就想到flask框架,但从没用过flask注入。 从零学习flask模板注入,这篇文章有详细的介绍。 经过尝试很快就能发现使用{{}}就能注入,并且会回显报错信息,3的位置是{{}}中语句的执行结果。 找可用的引…

T113-S3-LAN8720A网口phy芯片调试

目录 前言 一、LAN8720A介绍 二、原理图连接 三、设备树配置 四、内核配置 五、调试问题 总结 前言 在嵌入式系统开发中,网络连接是至关重要的一部分。T113-S3开发板搭载了LAN8720A系列的网口PHY芯片,用于实现以太网连接。在开发过程中&#xff0c…

STC15单片机PM2.5空气质量检测仪

一、系统方案 本设计采用STC15单片机作为主控制器,PM2.5传感器、按键设置,液晶1602显示,蜂鸣器报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化: void lcd_init()//液晶初始化设置 { de…

C#程序变量统一管理例子 - 开源研究系列文章

今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为:1)窗体;2)…

熔断降级的理解和基于feign的熔断降级

什么是熔断降级: 在微服务保护中我们使用sentinel进行了熔断降级,熔断降级时为了防止雪崩效应,什么是雪崩效应,因为微服务是一层调用一层的,如果下面某一个微服务宕机了,就会导致全部的微服务宕机&#xf…