linux 软件raid

软件raid占用cpu资源,性能不是很好,不建议生产使用。

linux内核中 md模块实现软raid。用户不能直接操作md。

md可以将任何块设备(磁盘,分区)组合成raid

mdadm 供用户使用的命令。用户-->mdadm-->md

mdadm是个 模式化的工具,有多个模式,每种模式完成不同的功能。


流行的系统中一般已经将MD驱动模块直接编译到内核中或编译为可动态加载的驱动模块,我们可以在机器启动后通过cat /proc/mdstat看内核是否已经加载MD驱动或者cat /proc/devices是否有md块设备,并且可以使用lsmod看MD是否可以模块加载到系统中. 

如果MD驱动被编译到内核中,当内核调用执行MD驱动时,会自动查找分区为FD(linux raid autodetect格式的磁盘或分区。所以一般会使用fdisk工具将HD磁盘或者SD磁盘分区,再设置为FD的磁盘。 


mdadm [mode] <raidDevice> [options] [component-devices]

mode:工作的具体模式

raidDevice:将要配置的raid设备文件

component-devices:构成raid设备的设备,类似于各块单独的硬盘。


--B、--build:创建或组装不需要元数据的阵列,每个设备没有元数据块 


-C 、--create:创建模式,使用空闲的设备创建一个新的阵列,每个设备具有元数据块

        -n # 、raid-devices# :构建riaid的基本设备个数

        -x # 、--spare-devices # :热备设备个数

        -l 级别、--level 级别:指定raid的种类

        -a,--auto{=yes,md,mdp,part,p}{NN}  :为创建的raid设备文件

        -c # 、--chunk #:表示每个条带单元的大小,以KB为单位,默认为64KB,条带单元的大小配置对不同负载下的阵列读写性能有很大影响

     mdadm -C /dev/md0 -a yes -l 0 -n 2  /dev/sdb{1,2}

    mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sdb{3,4}

    /proc/mdstat 记录软raid的状态

    watch -n#  "命令"     每隔#秒运行一下命令

    watch -n1 "cat /proc/mdstat"  监视raid的状态,每1秒刷新一下


/etc/mdadm.conf作为默认的配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。Assemble命令也可以使用--config(或者其缩写-c)来指定配置文件。我们通常可以如下命令来建#立配置文件
#echo DEVICE /dev/sdc1 /dev/sdb1 /dev/sdd1 > /etc/mdadm.conf
#mdadm --detail --scan >> /etc/mdadm.conf

使用配置文件启动阵列时,mdadm会查询配置文件中的设备和阵列内容,然后启动运行所有能运行RAID阵列。如果指定阵列的设备名字,则只启动对应的阵列。 


-G、--grow:改变阵列中每个设备被使用的容量或阵列中的设备的数目 


-A 、--assemble 装配模式,让内核识别到之前已经做好的raid, 将原来属于一个阵列的每个块设备组装为阵列

        主要是检查底层设备的元数据信息,然后再组装为活跃的阵列。如果我们已经知道阵列由那些设备组成,可以指定使用那些设备来启动阵列。

            [root@fc5 mdadm-2.6.3]# ./mdadm -A /dev/md0 /dev/sd[b-h]

            mdadm: /dev/md0 has been started with 6 drives and 1 spare.

        如果有配置文件(/etc/mdadm.conf)可使用命令mdadm -As /dev/md0。mdadm先检查mdadm.conf中的DEVICE信息,然后从每个设备上读取元数据信息,并检查是否和ARRAY信息一致,如果信息一致则启动阵列。

        如果没有配置文件  mdadm -A --scan    会扫描每个磁盘和分区,查看超级快,从而发现阵列信息,如果合适,将组装并启动

        如果没有配置/etc/mdadm.conf文件,而且又不知道阵列由那些磁盘组成,则可以使用命令--examine(或者其缩写-E)来检测当前的块设备上是否有阵列的元数据信息。

     ./mdadm -E /dev/sdi    找到阵列的uuid

    mdadm -A  /dev/md0 uuid=uuid    通过uuid来识别、并加载启动阵列  。这里的/dev/md0可以是别的名字,

来源: <http://blog.csdn.net/yuesichiu/article/details/8502680>

 


-I、--incremental :添加/移除 一个单独的设备 到/从 一个已存在的阵列上,可能的话还会启动阵列


--auto-detect : 如果md被编译到内核,则通知内核启动所有 auto-detected阵列;如果md作为一个模块,则不具有这个功能。

-F 、--follow 、-- monitor :监控模式Monitor,监控一个或多个阵列,上报指定的事件 

可以使用mdadm对RAID阵列进行监控,监控程序定时查询指定的事件是否发生,然后根据配置来妥善处理。例如当阵列中的磁盘设备出现问题的时候,可以发送邮件给管理员;或者当磁盘出现问题的时候由回调程序来进行自动的磁盘替换,所有监控事件都可以记录到系统日志中。目前mdadm支持的事件有RebuildStarted, RebuildNN(NN is 20, 40, 60, or 80), RebuildFinished, Fail,FailSpare,SpareActive,NewArray, DegradedArray, MoveSpare, SparesMissing, TestMessage。
如果配置每300秒mdadm监控进程查询MD设备一次,当阵列出现错误,会发送邮件给指定的用户,执行事件处理的程序并且记录上报的事件到系统的日志文件。使用--daemonise参数(或者其缩写-f)使程序持续在后台运行。如果要发送邮件需要sendmail程序运行,当邮件地址被配置为外网地址应先测试是否能发送出去。
[root@fc5 mdadm-2.6.3]#./mdadm --monitor --mail=root@localhost --program=/root/md.sh 
--syslog --delay=300 /dev/md0 --daemonise 

--Misc:报告或者修改阵列中相关设备的信息,比如查询阵列或者设备的状态信息 

    

manage:管理模式(默认)管理已经存储阵列中的设备,比如增加热备磁盘或者设置某个磁盘失效,然后从阵列中删除这个磁盘

    -f 、--fail 指定损坏的设备        mdadm /dev/md0 -f /dev/sda1

        如果有热备盘,则会在指定坏设备后立即顶替上去

    -r、 --remove参数将这个磁盘从磁盘阵列中移走;但如果设备还正在被阵列使用,则不能从阵列中移走移除损坏设备        mdadm /dev/md0 -r /dev/sda1

·    -a 添加更换新设备  mdadm /dev/md0 -a /dev/sda2



-Q --query 显示阵列的简要信息

        mdadm -q /dev/md0

-D,--detail 显示阵列的详细信息

        mdadm -D /dev/md0

-S  停止某个阵列(停止前需要先卸载)

        mdadm -S /dev/md1



查询阵列的状态
我们可以通过cat /proc/mdstat信息查看所有运行的RAID阵列的状态,在第一行中首先是MD的设备名,active和inactive选项表示阵列是否能读写,接着是阵列的RAID级别,后面是属于阵列的块设备,方括号[]里的数字表示设备在阵列中的序号,(S)表示其是热备盘,(F)表示这个磁盘是faulty状态。在第二行中首先是阵列的大小,单位是KB,接着是chunk-size的大小,然后是layout类型,不同RAID级别的layout类型不同,[6/6]和[UUUUUU]表示阵列有6个磁盘并且6个磁盘都是正常运行的,而[5/6]和[_UUUUU] 表示阵列有6个磁盘中5个都是正常运行的,下划线对应的那个位置的磁盘是faulty状态的。 

[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
unused devices:  



小结:

1.mdadm -C 创建一个新的阵列并启用。

       这个操作将引起一些变化: 生成新的设备文件和目录:

       I:  生成 /dev/mdx     这个设备文件将在阵列信息查询、阵列控制和阵列挂载时使用

        II   生成/dev/md/md-device-map       这个文件中记录mdx的名字、版本号、uuid、路径

       III  在文件   /proc/mdstat    /proc/partitions 中做记录  

    

2.mdadm -S  停用阵列,将引起以下变化

        删除设备文件  /dev/mdx

        清空记录 /dev/md/md-device-map

        删除 /proc/mdstat    /proc/partitions 中的记录

3.mdadms -A  启用之前曾做好的阵列,将引起以下变化

        识别并生成设备文件 和记录文件,设备文件名可以指定新的,也可以默认是识别到的

        /dev/mdx     这个设备文件将在阵列信息查询、阵列控制和阵列挂载时使用

        /dev/md/md-device-map       这个文件中记录mdx的名字、版本号、uuid、路径 。如果之前曾做过或已经有阵列在运行,则这个文件应该已经存在了。

        在文件   /proc/mdstat    /proc/partitions 中做记录  


        mdadms -A --scan  先查找配置文件,如果有,就按照配置文件的记录来识别启动阵列;否则将扫描每个磁盘和分区的super-block来设别阵列,如果设别到就启动


4.启动磁盘这列后可以rm掉 /dev/mdx  和 /dev/md/md-device-map,但是这样做会影响到使用到 /dev/mdx 的所有操作(除了卸载,卸载参考的是/etc/mtab);对于已经挂载的,可以正常使用。

针对这种情况,可以重新生成阵列图。  mdadm -Ir 或者 重新识别mdadm -As  (重新识别时,对于已经在用的阵列设备将跳过)