这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。
要看MD的数据结构,那就得看md_k.h了。这里有最主要的三个结构定义:mddev_s这是MD本身的结构;mdk_rdev_s这是对应于MD中子设备的结构;mdk_personality这是个有函数指针组成的结构,各函数交由各RAID级自己去实现。
首先来说说mdk_rdev_s,我觉得其中最重要的有这么几个字段:
struct list_head same_set; /* RAID devices within the same set */
sector_t size; /* Device size (in blocks) */
mddev_t *mddev; /* RAID array if running */
unsigned long flags;
int desc_nr; /* descriptor index in the superblock */
int raid_disk; /* role of device in array */
same_set相当于一个链表节点,通过它一个rdev可以被组织到一个md中。size就是这个rdev的容量大小。mddev则是其所在的MD的指针。在RAID-5中我们提到过flags的一些内容,注释里对这些状态的解释其实都很清楚了。desc_nr其实就是cat /proc/mdstat中看到的[]中索引值,大多数情况下其值是与raid_disk是一致的,但是当它没有正式加入到RAID中时,raid_disk的值是-1,而此时desc_nr就是一个不同的值。所以raid_disk的值就是rdev在RAID中的索引。
关于mddev_s,由于里面的东西太多了,一个个摘取出来分门别类介绍也是个精细活儿,偷个懒,还是放到后面去,碰到需要解释的字段再花力气去解释更好些。mdk_personality在RAID-5中也有介绍,这里也不多说,又碰到要讲的再说。
上一篇已经提到了一些MD中我能想到的比较重要的一些内容,由于是从RAID-5讲起的,有点从下到上的意思,所以下一篇打算从resync的调度为切入点,进入到MD内部。