MD(六)小议superblock

这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。

 

Superblock通常总是用来保存一些配置信息,MD中的superblock也不例外,通过看md_p.h中的mdp_superblock_s的定义大致就能了解其内容。MD的Superblock保存的信息主要包括:
(1)基本信息(Constant generic information) :主从设备号,UUID,RAID级,size,设备数量等;
(2)一般状态信息(Generic state information):包括一般MD运行的统计信息;
(3)Personality information:看上去似乎是能够手动配置的信息;
(4)磁盘信息(Disks information):记录子设备的信息;
(5)保留(Reserved):留做他用。
有了superblock,MD即使停止以后,通过收集这些子设备也能再重建起来使用。这一点在重启计算机时尤为重要,我想着也不用多说。因此保持各子设备上superblock的一致和更新是一个重要的动作。
关于superblock,更多的还是跟MD控制信息相关,大多数是细节问题,能抽出来讨论并不多,而且有点凌乱,所以我打算从总体上说一说就行。在2.6内核中支持两种superblock,按版本分为0.90版和1.0版。显然1.0版的更强、更灵活,但是因为我更多的是使用0.90版,感觉0.90的superblock更明白些。
Superblock是保存在每一个子设备的特定区域中。我曾经有过疑问,superblock可不可以写在MD设备上而不是子设备上?既然是写在各子设备上,那么mdadm –D显示的信息是从那个设备读出来的?下面是我的一些结论,当然先声明,这些结论我还没有机会证实。写在子设备上的原因很简单,那就是superblock是用来重组MD信息,但是如果MD不能重组的话,就不能读出superblock,这就是个死循环了。Mdadm –D显示的信息应该不是从设备上读出来的,而是从内存中将MD的各种变量读出来显示的。
MD中将对superblock的操作分为3个:load,validate和sync。Load就是将superblock从子设备中读到内存;validate我觉得就是用内存中superblock来构建md的信息;sync就是将更新了的MD信息写回到各子设备上。Load和validate两个操作主要是在重组MD的时候,在md_import_device或者do_md_run等函数中能看到他们的身影。关于对superblock的读和分析,似乎都跟具体的应用有关,没什么可说的,我想还是花点儿精力在更新superblock上。
更新superblock的函数就是md_update_sb()。在代码中搜索这个函数,就能找到MD何时需要更新superblock。通常需要更新superblock时,会将sb_dirty标志设为1。现在来看看md_update_sb函数。这个函数一上来就先记下了in_sync这个子段的值,我打算在下一篇中专门讲解这个字段的用法。紧接着,记下更新superblock的时间,更新events计数。当然,event计数器可能会溢出,这就需要处理一下溢出问题。接下来sync_sbs()函数被调用来更新各子设备的sb结构,于是各子设备内存中的superblock信息就是同步的了。如果我们不在子设备上存储superblock(称为nonpersistent),那这个函数就可以结束任务,直接返回就行。但通常superblock都是persistent的,所以接下来我们还需要将superblock写入到子设备中。可想而知,这就需要一个循环,对每一个子设备调用md_super_write()函数,它的作用就是构造一个bio将内存中的superblock送到子设备中。md_update_sb必须等所有bio都返回了才能进行下一步的工作,这是通过调用md_super_wait()函数来完成的。
在向各子设备写superblock的过程中,也可能出IO错误,md_update_sb也对这种情况做了处理。它首先在函数的开始部分将sb_dirty标志设为2,如果在函数结束之前,sb_dirty又被设为1了,很可能就是某些子设备写失败,那么md_update_sb会再重新写一次superblock。更新完毕以后就将sb_dirty清零。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值