没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux软RAID MD源码分析
资源详情
资源评论
资源推荐

I
RAID 阅读笔记
前言 .................................................................................................................................................. 1
1 RAID 概述 ............................................................................................................................... 1
1.1 RAID 在 linux 内核中的位置 ..................................................................................... 2
1.2 mdadm .......................................................................................................................... 3
1.3 参考文献 ...................................................................................................................... 3
2 RAID-5(一)基础 ................................................................................................................. 3
2.1 stripe, strip 与 P .................................................................................................. 4
2.2 RAID-5 基本原理 ......................................................................................................... 5
3 RAID-5(二)数据结构 ......................................................................................................... 5
3.1 bio 与 stripe_head .................................................................................................. 5
4 RAID-5(三)简单的读写 ..................................................................................................... 8
4.1 一次简单的读处理 ...................................................................................................... 8
4.2 一次简单的写处理 ...................................................................................................... 9
5 RAID-5(四)make_request ................................................................................................. 10
6 RAID-5(五)rmw 与 rcw .................................................................................................... 12
7 RAID-5(六)延迟写 ........................................................................................................... 13
8 RAID-5(七)Error 处理 ...................................................................................................... 14
8.1 错误处理 .................................................................................................................... 14
8.2 Bad Sector Remapping(BSR) .............................................................................. 15
9 RAID-5(八)失效处理 ....................................................................................................... 16
10 RAID-5(九)handle_stripe .............................................................................................. 17
11 RAID-5(十)raid5d 线程 ......................................................................................................... 19
12 RAID-5(十一)stripe_head 的管理 ................................................................................ 20
13 RAID-5(十二)resync 与 recovery ................................................................................. 22
14 RAID-5(十三)其它 ....................................................................................................... 24
15 Multiple Device .................................................................................................................. 25
16 MD(一)数据结构 .......................................................................................................... 27
17 MD(二)resync 和 recovery 概论 .................................................................................. 28
18 MD(三)resync 和 recovery 的调度............................................................................... 29
18.1 resync 和 recovery 的调度(上) ..................................................................... 29
18.2 resync 和 recovery 的调度(下) ..................................................................... 31
19 MD(四)进入 syncd 内部............................................................................................... 33
20 MD(五)MD 中的线程 .................................................................................................. 37
21 MD(六)小议 superblock ............................................................................................... 38
22 MD(七)In_sync 标志与 resync ..................................................................................... 39
23 RAID5 Write Hole .............................................................................................................. 41
24 Zone in RAID0 ................................................................................................................... 43
25 Data flow in Raid0 .............................................................................................................. 45
26 Chunk Aligned Read ........................................................................................................... 46

1
前言
转载自:http://knighraincn.spaces.live.com/,吴素贞整理。
作者的话:我打算尝试用条块分割,分门别类方式去论述,而不是像源码注
释那般按照代码的顺序,以期达到抽丝剥茧,庖丁解牛的效果,当然如果由于水
平有限反而造成逻辑混乱的话,我目前也只能先说声 sorry。我会以内核源码
2.6.16.33(以后简称 2.6)中的 RAID 源码为蓝本进行论述,其中可能会提到 2.4
版内核,那是基于内核代码 2.4.18 的。
1 RAID 概述
RAID 就是冗余磁盘阵列。目前市面上的电脑主板上,一般都不难看到产品
参数中看到支持磁盘阵列 Raid0,Raid1 等等,这在一定程度上说明 RAID 已经越
来越普遍,用句古文说就是“旧时王榭堂前燕,飞入寻常百姓家”。虽然我自己
目前还不知道这些主板上说明的 RAID 跟 linux 的软件 RAID 有些什么关系,或
者说我从来没机会使用这些 RAID 功能,但是这确实是说明了 RAID 技术的广泛
应用,了解一些 RAID 知识不会错的。
在linux 内核中,软件 RAID 是一个不可缺少的一部分,通常它会和 LVM 共
同出现。现在 google 一下能找到不少这方面的资料。但介绍点基本知识似乎还
是必要的。拙嘴笨舌,姑且简而言之。
假设我们有两块硬盘,我 们要将这两块硬盘统一管理,那么最简单的办法就
是将两个硬盘地址首尾相连,也就是说两块硬盘的地址是连续的,如果第一块硬
盘的地址空间是 0~0ffff 那么第二块硬盘的编址就应该从 10000 开始,例如
10000~1ffff。这样做很简单,第一块硬盘写满后,就写到第二块硬盘上。但这样
做问题是性能上并不高效,因为应用程序很可能因为集中读写某个文件而集中读
写某个盘,而另一块盘闲置。
于是有了另外一种更高性能组织模式 RAID-0。RAID-0 就是将两块硬盘并行
管理,简单的说,可能并不准确,就是将总的磁盘编址空间均匀的分布在两个盘
上(也就是所谓的条纹化 striping), 那 么 如果应用程序要集中读写某个文件,由
于这个文件散布在两个盘上,那么两个能同时工作以提高整体的吞吐率。

2
然而,RAID-0 不能保证数据的可靠性,因为不管哪一块盘坏了,数据就永
久丢失了。提高可靠性的最简单的方法就是将一块盘做为另一块盘的备份来组
织,这就是 RAID-1。RAID-1 大大提高了可靠性,因为两块盘同时出问题的可能
性很低,任何一块盘出了问题都可以由另一块盘补上,而且两块盘可以并行工作
通过平衡负载来获得更高的吞吐率。但是用整块盘来做备份,牺牲了磁盘空间,
数据空间只占整个磁盘空间的 50%。
于是经过一系列的发展到了 RAID-3456。RAID-3 和 RAID-4 简单的说就是
在一个 RAID-0 阵列的基础上又加了一个盘存储校验信息。这样做提高了 RAID-0
的可靠性,同时提高了磁盘空间利用率,假设 3 块盘的 RAID-4 只有一块盘用来
存储冗余数据,因此磁盘空间利用率上升到 66.6%。可靠性的提高通过校验盘来
获得,如果有一块数据盘坏了,就可以利用校验盘和另一块数据盘上的数据计算
出缺失的数据。但是把校验数据都集中放在一个盘上,使得这个盘的负载很重,
成为整个阵列的性能的瓶颈。RAID-5 的出现就是为了解决这个问题。RAID-5
的基本思想就是将校验数据均匀的分布在各个盘上以解除瓶颈。RAID-345 虽然
提高了可靠性,但是只能容忍一块磁盘出问题,如果阵列中有两块磁盘坏了,那
么整个整列数据可靠性都无法保证了。RAID-6 就是在 RAID-345 的基础上再加
入一个校验盘,利用两个冗余校验数据就能容忍阵列中两个磁盘出问题。
在这些 RAID 还可以嵌套使用,其中用的最广的就是 RAID-10 也就是将两
的 RAID-1 设备再按 RAID-0 的方式组织到一起。不过在 2.6 的代码中,已经将
RAID-10 独立作为一种 RAID 形式对待。
1.1 RAID 在 linux 内核中的位置
RAID 的代码在 linux 内核代码中的 driver/md 目录下,这个目录下除了 RAID
的代码外还可以看到 LVM 的代码,devicemapper 相关的代码都以 dm-打头。估
计这里 MD 表示 multiple disk,或者 multiple device,我 没 有 考 证过,以后直接称
为 MD 设备就行。MD 设备是 linux 内核提供的一种块设备驱动程序,但是这个
设 备驱动程序具体是怎样工作的则由其内部使用哪种磁盘组织形式,如
RAID-0156。在 driver/md 目录下,我们除了可以看到 RAID-0156 的代码以外还
可以看到 linear, multipath, 这些都是 MD 提供的内部组织形式。我们可以将 MD

3
设备看作是介于块设备驱动程序与 RAID 层之间的一层,但我常常将其视为包装
了 RAID 的一个统一的管理器,他提供了通用的管理接口,而且并没有直接干预
数据处理,一旦创建了 MD 设备以后,所有的数据都会直接送入 RAID。实际上
用面向对象的观点来看 MD 设备层可能更好:MD 实际上是对各种 RAID 的抽象,
也就是他们的抽象父类,提供了一些共性的属性方法,而各 RAID 子类,则拥有
自己的属性方法,如果没有具体化为某个 RAID 对象,某个 MD 设备就不能直接
使用。所以实际当中我们通常还是将 MD 和 RAID 统称为 RAID 层。
一言以蔽之,MD 设备包装了某种 RAID 以后,以块设备驱动程序的形式为
内核提供服务。至于内核中是怎样实现 MD 的,将放在以后讨论。
1.2 mdadm
如果将 RAID 编译到内核中,就可以使用各种 RAID 了,一 般而言,通过"cat
/proc/mdstat"就能看到 MD 设备的状态。而且用户可以通过 sysfs 中提供的方式来
访问 RAID 属性,具体如何使用这里就不多讲了,在 以后的讨论中也许也会提到
一些。但是,如何在应用层创建 RAID 并使用它的功能呢?linux 软件 RAID 的
作者 Neil Brown 也实现了一个应用层的工具 mdadm。mdadm 工具很方便也很强
大,它几乎涵盖了 RAID 的方方面面。关于这个工具并不是我想讨论的重点,
internet 上应该可以获得更详尽的信息。
1.3 参考文献
我在这一年里对 linux 内核的整体认识来源于两本书:《Linux Device Drivers
3e》(LDD3)《Understanding Linux Kernel 3e》(ULK3)。其他 linux 的知识则主
要是从互联网上获得,当然 LDD3 和 ULK3 在网上都能找到电子版。在正式介
绍 RAID 的过程中我会尽可能提供某些内容的出处,当然,能找到出处的内我就
没有必要细说了,学习 linux 是离不开 internet 的。
2 RAID-5(一)基础
通常阅读 RAID 的代码,都是从 RAID-0 开始,因为 RAID-0 中并没有复杂

4
的逻辑,而是仅仅是将送入 RAID-0 的数据重新映射并送入下层设备。我最初也
是从 RAID-0 开始的,但是由于工作关系目前我对 RAID-5 更熟悉一些,还是从
我熟悉的东西开始入手,虽然 RAID-5 比 RAID-0 复杂百倍。
好吧,那就开始进入 RAID-5 之旅…
2.1 stripe, strip 与 P
RAID-5 的 I/O 处理,特别是写请求,通常是以 stripe 为单位进行的。什么是
stripe 呢?三言两语还挺难表述的,画个图来说说吧。其中 D1,D2,D3,P1 被
称为 chunk,磁盘上的数据就按照 chunk 组织到各个 disk 上。这样,这一排 chunk
也可以看成是一个 stripe,但这种磁盘空间组织上的 stripe,还不是 RAID-5 中的
处理单元的 stripe。RAID-5 中的一个 stripe 的宽度总是 4K(1 page), 如 图 中的
d1,d2,d3,p1 组成的 stripe。也就是说 D1,D2,D3 数据时连续的,但是 d1,
d2,d3 数据时跳跃的。那么每一个 d1,d2,d3 或 p1 在 RAID-5 中我们称之为
strip。
P(parity)表示校验数据,校验数据的计算非常简单,就是 xor,也就是
P=D1+D2+D3,( 这 里 + 表示 xor)。
注(吴素贞):我的理解和作者的不太一样,如下图所示:
disk1 disk2 disk3 disk4
1 5 9 XX
2 6 10 XX
3 7 11 XX
剩余48页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论26