searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

LBA数据一致性校验工具

2024-04-30 02:34:47
82
0

LBA工具

目前LBA工具有Linux(x86和arm)和Windows三种版本,github项目:hd_write_verify。
目前该项目开源了工具,没有开源代码,提供的LBA工具有三个分别是hd_write_verify、hd_write_verify.io_retry和hd_write_verify_dump。前两个工具负责向磁盘/文件中写入校验数据同时具有校验功能,当校验出数据不一致时hd_write_verify.io_retry工具会重复执行,hd_write_verify会告警退出。hd_write_verify_dump工具提供只读的数据校验功能,可以校验已经写过的磁盘/文件。

实现原理

如图所示:
1.LBA工具将磁盘/文件划分为M个IO数据簇;
2.每个IO数据簇包含N个扇区;
3.IO数据簇N个扇区中写入verify数据:每个扇区的数据除index字段表示簇中的扇区序号外,其它数据均相同;
4.LBA工具测试磁盘/文件时,为每个磁盘/文件分配全局bitmap内存,并置为全0;
5.LBA工具的工作线程写入IO簇前需要从bitmap结构中获取未被分配的IO簇序号。IO数据簇不会被重复分配,分配新IO数据簇时,随机分配bitmap未被置1的对应数据簇;
6.每个已分配的IO数据簇对应的bitmap被置位为1;
7.LBA工具的工作线程写入的第一个IO簇位置是固定的,例如使用10个工作线程则前十个簇分别作为线程1-10写入的第一个IO簇;

lba工具实现原理

LBA工具实现原理-数据布局

Verify数据的数据结构:强双向链表、数组、队列的混合体。

HF是硬编码的flag,占用4字节;

MAGIC是魔法数字,占用4字节;

PRE_LBA[10]是指向当前IO簇写入前写入的前十个IO簇的前向指针队列,占用40字节;

LBA_LIST[100]是指向当前写入IO簇之后写入的IO簇的后向指针队列,占用400字节,其中LBA_LIST[0]指向自己;

TIME是IO簇写入的时间,占用56字节;

RANDOM是每轮的随机数,占用4字节;

NUM是IO簇中的扇区数,占用2字节;

INDEX是IO簇中的扇区索引,占用2字节,例如:如果有1024个扇区则index为0-1023;

数据结构

LBA工具以簇为单位进行IO写入,对于一个IO簇的写入首先会生成一个占用512字节的verify数据,然后将该数据复制N份(N=簇内扇区数)。这N份数据除了INDEX字段不同,其余内容全部相同。工作线程写入第一个IO簇时,会从全局bitmap获取后续写入的99个IO簇,因此LBA_list中会写入100个LBA地址。如下图所示,当第M个IO簇写入后,通过将verify数据中的两个数组进行出入队处理(具体为PRE_LBA[0]和LBA_LAST[0]出队,LBA_LAST[0]入队PRE_LBA成为下一个IO簇的verify数据中的PRE_LBA[9],LBA_LAST入队一个新分配的LBA地址指向第M+100个IO簇),修改time和random字段并就可以得到M+1个IO簇写入的verify数据。

LBA中的IO数据

LBA工具写入是会讲扇区分为全零扇区和非全零扇区部分,默认全零扇区为IO簇内最后10%的扇区(可以通过参数修改比例)。因此一个IO簇中的数据如下图所示。

簇内扇区数据

数据校验

LBA工具有两种校验手段,分别是簇内数据校验和簇间数据校验。簇内数据校验会比较同一个IO簇中不同扇区的数据,通过扇区之间的比较发现数据错误,正常情况应该只有index字段不同。簇间校验指一个工作线程内的写入IO簇和它相邻的IO簇之间数据的比较,此时主要比较PRE_LBA和LBA_LAST数组中的LBA地址,正常情况下这110个数据应该有109个错位相同(如图2-2右边所示)。

LBA工具在执行过程中可以设置三种不同的校验模式,分别为全盘数据校验、批量数据校验和随机数据校验。

全盘数据校验在hd_write_verify工具完成全盘/整个文件的写入或使用hd_write_verify_dump工具时执行。每个工作线程在完成写入后会得到一个IO强双向链表,全盘数据校验指沿着链表对该工作线程写入的每个IO簇进行簇内数据校验和簇间数据校验,如下图所示。

LBA全盘数据校验

批量数据校验在hd_write_verify工具运行时执行,即一边写入数据一边校验之前写入数据的一致性。如下图所示,LBA工具中的每个工作线程分批向磁盘写入数据,每批写入磁盘的IO数据簇个数是随机的。批量数据校验指:在写下一批IO数据簇之前,先校验上一批数据的一致性,对上一批数据执行簇间数据校验和簇内数据校验,当一个线程的所有数据写完成后,这个线程数据校验也的每个IO簇都执行过校验。

LBA批量数据校验

在LBA工具中工作线程负责需要从全局bitmap中获取自己负责写入的IO簇,当每个IO数据簇被分配时,对应的线程bitmap也被置位为1。随机数据校验指:每个线程定期随机查找在线程bitmap中被置位为1的索引,读取对应IO簇的数据进行校验,如下图所示。

LBA随机数据校验

0条评论
0 / 1000
小熊饼干
1文章数
0粉丝数
小熊饼干
1 文章 | 0 粉丝
小熊饼干
1文章数
0粉丝数
小熊饼干
1 文章 | 0 粉丝
原创

LBA数据一致性校验工具

2024-04-30 02:34:47
82
0

LBA工具

目前LBA工具有Linux(x86和arm)和Windows三种版本,github项目:hd_write_verify。
目前该项目开源了工具,没有开源代码,提供的LBA工具有三个分别是hd_write_verify、hd_write_verify.io_retry和hd_write_verify_dump。前两个工具负责向磁盘/文件中写入校验数据同时具有校验功能,当校验出数据不一致时hd_write_verify.io_retry工具会重复执行,hd_write_verify会告警退出。hd_write_verify_dump工具提供只读的数据校验功能,可以校验已经写过的磁盘/文件。

实现原理

如图所示:
1.LBA工具将磁盘/文件划分为M个IO数据簇;
2.每个IO数据簇包含N个扇区;
3.IO数据簇N个扇区中写入verify数据:每个扇区的数据除index字段表示簇中的扇区序号外,其它数据均相同;
4.LBA工具测试磁盘/文件时,为每个磁盘/文件分配全局bitmap内存,并置为全0;
5.LBA工具的工作线程写入IO簇前需要从bitmap结构中获取未被分配的IO簇序号。IO数据簇不会被重复分配,分配新IO数据簇时,随机分配bitmap未被置1的对应数据簇;
6.每个已分配的IO数据簇对应的bitmap被置位为1;
7.LBA工具的工作线程写入的第一个IO簇位置是固定的,例如使用10个工作线程则前十个簇分别作为线程1-10写入的第一个IO簇;

lba工具实现原理

LBA工具实现原理-数据布局

Verify数据的数据结构:强双向链表、数组、队列的混合体。

HF是硬编码的flag,占用4字节;

MAGIC是魔法数字,占用4字节;

PRE_LBA[10]是指向当前IO簇写入前写入的前十个IO簇的前向指针队列,占用40字节;

LBA_LIST[100]是指向当前写入IO簇之后写入的IO簇的后向指针队列,占用400字节,其中LBA_LIST[0]指向自己;

TIME是IO簇写入的时间,占用56字节;

RANDOM是每轮的随机数,占用4字节;

NUM是IO簇中的扇区数,占用2字节;

INDEX是IO簇中的扇区索引,占用2字节,例如:如果有1024个扇区则index为0-1023;

数据结构

LBA工具以簇为单位进行IO写入,对于一个IO簇的写入首先会生成一个占用512字节的verify数据,然后将该数据复制N份(N=簇内扇区数)。这N份数据除了INDEX字段不同,其余内容全部相同。工作线程写入第一个IO簇时,会从全局bitmap获取后续写入的99个IO簇,因此LBA_list中会写入100个LBA地址。如下图所示,当第M个IO簇写入后,通过将verify数据中的两个数组进行出入队处理(具体为PRE_LBA[0]和LBA_LAST[0]出队,LBA_LAST[0]入队PRE_LBA成为下一个IO簇的verify数据中的PRE_LBA[9],LBA_LAST入队一个新分配的LBA地址指向第M+100个IO簇),修改time和random字段并就可以得到M+1个IO簇写入的verify数据。

LBA中的IO数据

LBA工具写入是会讲扇区分为全零扇区和非全零扇区部分,默认全零扇区为IO簇内最后10%的扇区(可以通过参数修改比例)。因此一个IO簇中的数据如下图所示。

簇内扇区数据

数据校验

LBA工具有两种校验手段,分别是簇内数据校验和簇间数据校验。簇内数据校验会比较同一个IO簇中不同扇区的数据,通过扇区之间的比较发现数据错误,正常情况应该只有index字段不同。簇间校验指一个工作线程内的写入IO簇和它相邻的IO簇之间数据的比较,此时主要比较PRE_LBA和LBA_LAST数组中的LBA地址,正常情况下这110个数据应该有109个错位相同(如图2-2右边所示)。

LBA工具在执行过程中可以设置三种不同的校验模式,分别为全盘数据校验、批量数据校验和随机数据校验。

全盘数据校验在hd_write_verify工具完成全盘/整个文件的写入或使用hd_write_verify_dump工具时执行。每个工作线程在完成写入后会得到一个IO强双向链表,全盘数据校验指沿着链表对该工作线程写入的每个IO簇进行簇内数据校验和簇间数据校验,如下图所示。

LBA全盘数据校验

批量数据校验在hd_write_verify工具运行时执行,即一边写入数据一边校验之前写入数据的一致性。如下图所示,LBA工具中的每个工作线程分批向磁盘写入数据,每批写入磁盘的IO数据簇个数是随机的。批量数据校验指:在写下一批IO数据簇之前,先校验上一批数据的一致性,对上一批数据执行簇间数据校验和簇内数据校验,当一个线程的所有数据写完成后,这个线程数据校验也的每个IO簇都执行过校验。

LBA批量数据校验

在LBA工具中工作线程负责需要从全局bitmap中获取自己负责写入的IO簇,当每个IO数据簇被分配时,对应的线程bitmap也被置位为1。随机数据校验指:每个线程定期随机查找在线程bitmap中被置位为1的索引,读取对应IO簇的数据进行校验,如下图所示。

LBA随机数据校验

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0