Software-RAID 笔记(转载)
1、 软件介绍
a) raidtools 提供了多个命令:/sbin/arytst 、/sbin/detect_multipath、/sbin/lsraid、/sbin/mkraid、/sbin/raid0run、/sbin/raidhotadd、/sbin/raidhotremove、/sbin/raidreconf、/sbin/raidsetfaulty、/sbin/raidstart、/sbin/raidstop。我们只需要使用其他几个就可以了。raidtools 在建立RAID 时需要/etc/raidtab ,也可以用–-config 指定其他的配置文件。raidtools 没有监控功能,也不支持spare-group 功能。
b)mdadm 是raidtools 的代替品。在RHEL 中已经没有raidtools ,取而代之的是mdadm 了。mdadm 的最大特点是它只用一个命令就可以完成绝大部分的
RAID 的相关操作,虽然也可以使用配置文件(/etc/mdadm.conf)。它有多种工作模式:assemble (装配模式,类似于raidstart 命令);build/create 模式(类似于mkraid);manage 模式(是raidhotadd/remove/setfaulty的组合)、Misc 模式(类似lsarid 命令)、Monitor 模式(mdadm 专有,用于监控RAID 状态)、Grow 模式(用于增大或者缩小一个Raid ,或者进行RAID-5 的reshaping 操作)。mdadm 还支持一项spare-group 的功能,就是在多个Software-RAID 中共享一个spare 盘,当一个支持Spare 盘的RAID 进入降级(degrade)模式时,如果它没有spare 盘,mdadm 会从其他的正常的、带有spare 判断RAID 中找出一个spare 盘,以hot add 的方式加入该故障RAID ,以便进行resync 操作,确保数据的安全。
2、 Software-RAID 的组成
Software-RAID 是由一个个的分区(partition)组成的,而不是一个个的物理硬盘。每个分区就好象一个物理硬盘一样。所以要想建立Software-RAID ,必须先用fdisk 在多个盘上分出若干个分区,用t 命令把它们标记为0xFD ,记住!!
3、 /etc/raidtab 文件及其格式
-)1、先定义MD 设备(raiddev <md_device>)
-)2、再定义该RAID 的属性
a)级别:raid-level <N>
b)RAID 组成设备的数量(不含spare 盘):nb-raid-disks <N>
c)spare 盘的数量:nr-spare-disks <N>
d)是否建立超级块:persistent-superblock <0|1>
e)奇偶校验算法:parity-algorithm <left-symmetric|left-asymmetric|right-symmetric|right-asymmetric>
f)chuk size :chunk-size <N>, N 最小4KB ,必须是2的幂,否则mkraid 时会报错。即使是RAID-1 也要用该语句,否则会出错。
-)3、定义每个组成设备
a)定义组成设备:device <device>
b)定义设备的属性(可选四样)
i)是普通的RAID 设备:raid-disk <N>, N 从0开始计算
ii)是一个sapre 盘:spare-disk <N> :N 从0开始计算
iii)是一个faulty 盘:failed-disk <N> : N 从0 开始计算。允许你建立一个处于degrade 模式的RAID ,没有什么太大用途。
iiii)是一个奇偶校验专用盘:parity-disk <N>,只用于RAID-4。
-)4、下面提供一个样本:
[root@mail root]# vi /etc/raidtab
raiddev /dev/md0
raid-level linear
nr-raid-disks 2
persistent-superblock 1
chunk-size 4k
device /dev/hda8
raid-disk 0
device /dev/hdb5
raid-disk 1
[root@mail root]#
-)5、下面是一些注意点:
a)每行最好不要以空白开头,有些旧版本的md drvier 会出错
b)大小写不区分
c)不是每个语句都可以用于任意一个级别的RAID 的,例如spare-disks 就不能出现于raid0/linear 中。
d)chunk-size 一定要写,即使是RAID-1/linear 这类不需要用到chunk-size 的RAID,且必须是2 的N次幂
e)raid-disk、spare-disk、failed-disk、parity-disk 必须紧跟在device 后面
f)nr-raid-disks 不包含spare-disks ,但包含failed-disk
g)nr-raid-disks 必须等于所有非spare-disk 的device 的数量;nr-spare-disks 必须等于所有spare-disk 的device 的数量
g)raid-disk、spare-disk、failed-disk 都是从0开始编号的。
h)raidstart/raidstop 是依赖于/etc/raidtab 的,所以必须确保要启动/停止的RAID 出现在/etc/raidtab 中。、
i)spare-disk 必须是最后一个device 。
4、 persistent-superblock 的作用
1)阵列中的每个设备都有一个superblock ,它记录着阵列的结构和状态。它使得阵列在shutdown 后也能重新恢复(之前的状态)。对于2.6.10 的内核来说,支持两种不同格式的superblock ,还可以增加其他格式的superblock。在这个版本之前,只支持一种格式。首先是通用格式(common format),也就是0.90 版本。我们可以用dmesg|grep md 来判断当前persistent-superblock 的版本和属性:
[root@monitor sbin]# dmesg |grep md
md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
可以看到当前的版本是0.90。
2)该版本的superblock 一般保存在里分区结束位置的前128-64 KB 之间的位置。所以每个分区在加入RAID 后,其可用大小会减少64-128 KB。而且该版本的superblock 是和处理器相关联的,所以阵列很难在使用不同处理器的机器之上使用。
3)新版的persistent-superblock 是v1 了,它通常储存在离分区结尾的12-8KB 的位置。V1.1 可以存储在分区开始的位置,v1.2 可以存储在分区开始第4KB
的位置。
4)这些都不是主要的,最重要的是persistent-superblock 中存放这几个非常重要的信息:
a) UUID:每个RAID 都有一个编号,这就是UUID 。系统就是通过UUID 来知道那个分区是属于那个RAID 的。
b) LEVEL:它记录了该RAID 的级别
c) md minor number :该RAID 设备的编号。例如0 就表示/dev/md0 ,1 就是/dev/md1
d) chunk size :这对于条带型的RAID 也是非常重要的。
e) disks in array :该RAID 的成员数量
f) position in md device:它记录了每个分区在RAID 中的顺序。也就是它是第几个设备。
5)persistent-superblock 还有一个作用:由于信息都存储在superblock 上,即使你删除了/etc/raidtab ,或者/etc/raidtab 的信息不准确,系统也可以通过persistent-superblock 来激活RAID ,而不用依赖/etc/raidtab 。你可以在RAID 建立好之后把raid-level 随意改动,RAID 仍然可以正常激活;随意修改chunk-size ;修改某个device 的顺序,甚至删除某个device ,这些都不影响RAID 的正常激活。
5、 RAID 的建立步骤
要建立并使用Software-RAID ,必须遵照如下步骤:
-)1、RAID-support 是built-in 方式集成到内核中
-)2、用fdisk 分区,并设置为0xFD 类型的。
-)3、编辑/etc/raidtab
-)4、分区不用事先建立文件系统,否则会报错。除非用mkraid –R 强制建立RAID 。如果分区别mount ,必须先umount ,否则无法建立RAID
-)5、使用mkraid 命令建立Software-RAID 。如果一切正常,RAID 默认就会被激活
-)6、mkfs –t <type> /dev/md[X] 为该RAID 建立文件系统。
-)7、修改/etc/fstab ,加入刚刚建立的文件系统。
-)8、挂载文件系统
6、mkraid 命令的用法
mkraid 命令的语法很简单,基本上就是:
mkraid <md_device> // 这个<md_device> 就是你事先在/etc/raidtab 中定义好的
[root@mail root]# mkraid /dev/md0
handling MD device /dev/md0
analyzing super-block
disk 0: /dev/hda8, 104391kB, raid superblock at 104320kB [ 告诉你 persistent-superblcok 的位置,最好把它记下来]
disk 1: /dev/hdb5, 152554kB, raid superblock at 152448kB
[root@mail root]#
有时会需要用到–R 选项,就是强制建立RAID 。如果mkraid 检测到某个成员分区上面有文件系统存在,就会显示出错信息。使用–R 将强制建立RAID ,不过在
此之前你有5秒的时间可以反悔:
[root@mail root]# mkraid -R /dev/md0
DESTROYING the contents of /dev/md0 in 5 seconds, Ctrl-C if unsure!
handling MD device /dev/md0
analyzing super-block
disk 0: /dev/hda8, 104391kB, raid superblock at 104320kB
disk 1: /dev/hdb6, 104359kB, raid superblock at 104256kB
[root@mail root]
7、/proc/mdstat 文件
/proc/mdstat 文件可以说是Software-RAID 系统中最重要的文件之一了。它记录了当前系统关于Software-RAID 的支持程度,以及各个RAID 的实时信息。下面就是一个/proc/mdstat 文件的例子:
[bob@mail bob]$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [multipath]
read_ahead 1024 sectors
md0 : active raid1 hdb5[1] hda5[0]
104256 blocks [2/2] [UU]
md1 : active raid1 hdb6[1] hda6[0]
2562240 blocks [2/2] [UU]
md2 : active raid0 hdb8[1] hda8[0]
208640 blocks 4k chunks
unused devices: <none>
[bob@mail bob]$
需要注意的有几项:
-)1、Personalities :这是表示当前系统支持那些级别的RAID 。这些支持可以是module 方式,也可以是built-in 方式。单从这里是看不出来的,必须用上面的check_md脚本来判别。如果linear 是module 方式的,用lsmod 你可以看到有linear 的模块。你用modprboe –r linear ,再查看/proc/mdstat ,[linear] 将会消失掉。假设raid1 built-in 方式的,则固定出现在Personalities 行中。这里的顺序是无关紧要的。
-)2、从上面可以看出当前系统有3个Software-RAID 设备。,它们的状态都是active ,如果是inactive ,那么很有可能是不正常的;要注意,如果一个raid 没有被激活,是不会被显示的,而不是显示inactive 状态。
-)3、active 后面的raid1 或者raid0 就是对应Software-RAID 的级别。后面的就是成员设备。[ ] 中的数字是成员在Software-RAID 中的编号。
-)4、xxx blocks 是该RAID 的大小。Linear/RAID-0 基本上等于所有成员的大小总和;RAID-1 接近于一半,RAID-5 是65% 左右。
-)5、[2/2] 中的第一个2 表示该RAID 需要2个设备,后面的2 表示当前处于工作状态的成员设备数量。正常情况下两者应该相等。
-)6、[UU] 也是一个很有用的字段,每个U对应一个成员设备,第一个U 对应第1个设备,第2个U对应第2个设备,依此类推。如果有某个设备出故障了,对应的U 的位置就会显示一个下划线”_” ,你可以迅速知道是那个设备出问题了。
-)7、如何辨别那个是spare 盘:
a)如果看到最高设备编号小于[#/#] 中的第一个# ,则表示没有spare 盘存在。
b)如果看到最高设备编号等于[#/#] 中的第一个# ,则表示有spare 盘,且最高编号的那个盘就是spare 盘。
c)如果看到[#/#] 中第一个# 的值大于第2个# 的值,则表示有盘坏了,且没有spare 盘
d)以下面为例:hdb9 就是spare 盘了,因为它的编号是最大的。
[root@mail root]# vi /etc/raidtab
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 1
persistent-superblock 1
chunk-size 4k
device /dev/hda9
raid-disk 0
device /dev/hdb8
raid-disk 1
device /dev/hdb9
spare-disk 0
[root@mail root]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 hdb9[2] hdb8[1] hda9[0]
104320 blocks [2/2] [UU]
unused devices: <none>
[root@mail root]#
-)8、对于RAID-1/5 来说,mkraid 后会立即开始“同步“过程(resync)。此时的/proc/mdstat 显示如下:
[root@mail root]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md1 : active raid1 hdb6[1] hda9[0]
248896 blocks [2/2] [UU]
[=====>...............] resync = 27.8% (70060/248896) finish=0.2min speed=11676K/sec
unused devices: <none>
[root@mail root]#
稍等一会儿就变成:
[root@mail root]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md1 : active raid1 hdb6[1] hda9[0]
248896 blocks [2/2] [UU]
unused devices: <none>
[root@mail root]#
-)9、每个级别的RAID 都有最少成员数量的限制:对于Linear/RAID-0/RAID-1 来说,nr-raid-disks 最小是1;对于RAID-5 来说是2;
8、神奇的RAID-1
你是否认为mkraid 一定会摧毁原来分区上的所有数据呢?不错,大部分情况下是这样,但RAID-1 比较特殊。下面就来演示一下。
注:这个实验是在Software-HOWTO 中的第7.6 节看到的,后面我们还要用到该特性。
假设我们现在有一个分区/dev/hda ,ext3 格式,上面已经有数据了。内容如下:
[root@mail root]# mkdir /testraid
[root@mail root]# mount /dev/hda10 /testraid/
[root@mail root]# ls -l /testraid/
total 14
-rw-r--r-- 1 root root 1472 Apr 3 00:57 anaconda-ks.cfg (这个就是我们要关注的对象)
drwx------ 2 root root 12288 Apr 3 00:57 lost+found
[root@mail root]#
现在我们想把它做成一个RAID-1 ,但又不想丢失上面的数据。怎么办呢?你可能会说先拷贝出来。那如果没有足够的空闲空间呢?
[root@mail root]# cat /etc/raidtab
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
chunk-size 4k
device /dev/hda10 (必须把源分区/dev/hda10 作为RAID-1 的第一个设备,否则会丢失原来的所有数据)
raid-disk 0
device /dev/hdb8
raid-disk 1 (把需要同步的那个盘作为第2个设备)
[root@mail root]#
上面的顺序一定不能搞错,切记切记!!
现在开始建立RAID-1 了:
[root@mail root]# mkraid /dev/md0
handling MD device /dev/md0
analyzing super-block
disk 0: /dev/hda10, 104391kB, raid superblock at 104320kB
/dev/hda10 appears to contain an ext2 filesystem -- use -f to override
mkraid: aborted.
(In addition to the above messages, see the syslog and /proc/mdstat as well
for potential clues.)
[root@mail root]#
由于raidtools 检测到/dev/hda10 上面已经有文件系统存在,就会报错并退出。
[root@mail root]# mkraid -R /dev/md0
DESTROYING the contents of /dev/md0 in 5 seconds, Ctrl-C if unsure!
handling MD device /dev/md0
analyzing super-block
disk 0: /dev/hda10, 104391kB, raid superblock at 104320kB
disk 1: /dev/hdb8, 104391kB, raid superblock at 104320kB
[root@mail root]#
按照以前的步骤,现在应该是mkfs 的时候,不过要是mkfs ,就会丢掉原来的数据,其实这个时候已经有文件系统的。
[root@mail root]# tune2fs -l /dev/md0
tune2fs 1.32 (09-Nov-2002)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: d2e950e5-3394-4627-abb8-2b26f99c38eb
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal filetype sparse_super
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 26104
Block count: 104391
Reserved block count: 5219
Free blocks: 96960
Free inodes: 26092
First block: 1
Block size: 1024
Fragment size: 1024
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2008
Inode blocks per group: 251
Filesystem created: Tue Apr 3 00:57:45 2007
Last mount time: Tue Apr 3 00:58:33 2007
Last write time: Tue Apr 3 00:59:12 2007
Mount count: 2
Maximum mount count: 32
Last checked: Tue Apr 3 00:57:45 2007
Check interval: 15552000 (6 months)
Next check after: Sun Sep 30 00:57:45 2007
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal UUID: <none>
Journal inode: 8
Journal device: 0x0000
First orphan inode: 0
[root@mail root]#
现在直接就mount 这个RAID 设备。
[root@mail root]# mount /dev/md0 /testraid/
[root@mail root]# ls -l /testraid/
total 14
-rw-r--r-- 1 root root 1472 Apr 3 00:57 anaconda-ks.cfg (可以看到这个文件依然存在)
drwx------ 2 root root 12288 Apr 3 00:57 lost+found
[root@mail root]#
所以mkraid –R 并不一定会摧毁原来的数据哦,只要/etc/raidtab 中的device 顺序正确就可以在不摧毁原来数据的情况升级到RAID-1
那升级到其他级别的RAID 可以吗?下面是测试的结果:
Linear :可以保留原来的文件系统。但RAID 大小识别错误,只等于源分区的大小
RAID-0 :不可以,会摧毁原来的数据
RAID-5 :同RAID-0
所以只有RAID-1 才有这个特性。
那是否一切就已经正常了呢?不是的。前面提到,在建立RAID 时会写入superblock ,所以一个普通分区变成RAID 成员之后,物理大小会变小。具体小多少则不却确定。下面就是fsck 的结果:
[root@mail root]# umount /testraid/
[root@mail root]# fsck /dev/md0
fsck 1.32 (09-Nov-2002)
e2fsck 1.32 (09-Nov-2002)
The filesystem size (according to the superblock) is 104391 blocks
The physical size of the device is 104320 blocks
Either the superblock or the partition table is likely to be corrupt!
Abort<y>? no
/dev/md0: clean, 12/26104 files, 7431/104391 blocks
[root@mail root]#
可以看到fsck 报告物理大小和文件系统大小不一致,文件系统比物理设备要大,因为文件系统并不知道分区上多了两个software-RAID 的superblock 。
