从CSDN上得到很多资料,贡献不多,很惭愧。
由于工作关系,近期学习一些Linux 软件RAID相关的代码,网上找到一些相关的介绍内容,对于bitmap机制介绍得较少,正好看到这块,在共享精神感召下,咱不揣浅薄,也把自己的一些学习情况记录下来,希望大家多多指正。
在RAID1,RAID5等存在数据冗余的磁阵结构中,数据的完整性要求冗余的数据和原始数据的信息要保证一致。磁阵的写操作是一个过程,这个过程中发生异常,可能导致冗余数据和原始数据不一致,例如磁盘更换,写盘失败,系统掉电等。
在系统要尽快使数据恢复一致,以使得磁阵后续可以正常工作,磁阵从数据不一致状态恢复的过程就是同步。
假设系统重新上电后,如何知道哪些数据出于不一致状态呢?如果没有其他信息的话,它只能假定所有数据都可能不一致,进行所有数据块的一致性恢复。对于RAID5,就是重新计算所有条带的效验和;对于RAID1,就是重新同步所有数据块到镜像盘。这种全局数据同步会导致系统开机过程及其漫长(或者就整个放任磁阵上电后处于不一致的状态)。
专业的磁阵中,一般都会有NVRAM(非易失性内存),在对一个数据块写操作开始的时候,在NVRAM中保存写位置信息,写操作结束后,在NVRAM中删除这个信息。这样,在系统开机时,从NARAM中读出保存的写位置信息,这些位置信息记录了未成功写入的数据块,系统只需要对这些数据块进行同步即可,而不用同步磁阵全部数据。
NVRAM需要硬件支持,也比较昂贵,那我们PC机上使用软件RAID构建的磁阵,又该咋办呢?这个就引出了bitmap文件,可以理解bitmap文件的作用等同于上述专业磁阵的NVRAM(当然上述的场景只是NVRAM应用的一个小的方面)的作用,不过这个bitmap是保存在磁盘上的。
Bitmap的工作原理说来也是直截了当的,文件的内容就是一个位图,每个位对应磁阵的一个数据块(粒度可以做得比块更粗些),在磁阵数据写入前,设置该数据块对应的位,磁阵写入完成,则清除该数据块对应位。要进行同步时,参照bitmap,只有设置了的位对应的数据块才需要进行同步,是不是很简单?
下面对代码的分析基于2.6.21内核。
阅读(960) | 评论(0) | 转发(0) |