mdadm命令 – 管理RAID磁盘阵列组
#为了简洁起见,我们使用Bash的“组合”词 | # For the sake of briefness, we use Bash "group compound" stanza: |
# /dev/sd{a,b,...}1 => /dev/sda1 /dev/sdb1 ... | |
#遵循一下变量 | # Along the following variables: |
# ${M} 阵列标识 (/dev/md${M}) | # ${M} array identifier (/dev/md${M}) |
# ${D} 设备标识 (/dev/sd${D}) | # ${D} device identifier (/dev/sd${D}) |
# ${P} 分区标识(/dev/sd${D}${P}) | # ${P} partition identifier (/dev/sd${D}${P}) |
# 去创建或初始化一个新的阵列: | # To create (initialize) a new array: |
mdadm --create /dev/md${M} --level=raid5 --raid-devices=4 /dev/sd{a,b,c,d,e}${P} --spare-devices=/dev/sdf1 | |
#手动组装或激活现有阵列 | # To manually assemble (activate) an existing array: |
mdadm --assemble /dev/md${M} /dev/sd{a,b,c,d,e}${P} | |
#自动组装或激活所有的阵列 | # To automatically assemble (activate) all existing arrays: |
mdadm --assemble --scan | |
#停止一个组装激活的阵列 | # To stop an assembled (active) array: |
mdadm --stop /dev/md${M} | |
#看下阵列的配置 | # To see array configuration: |
mdadm --query /dev/md${M} | |
#查看阵列构成配置(转储超级块内容): | # To see array component configuration (dump superblock content): |
mdadm --query --examine /dev/sd${D}${P} | |
#查看详细阵列信息或状态 | # To see detailed array confiration/status: |
mdadm --detail /dev/md${M} | |
#保存已有的阵列配置 | # To save existing arrays configuration: |
# (initrd可能需要成功引导) | # (MAY be required by initrd for successfull boot) |
mdadm --detail --scan > /etc/mdadm/mdadm.conf | |
#清除阵列超级块信息 | # To erase array component superblock: |
#(在将分区用于其他目的之前必须这样做) | # (MUST do before reusing a partition for other purposes) |
mdadm --zero-superblock /dev/sd${D}${P} | |
#手动停掉一个设备 | # To manually mark a component as failed: |
#(当设备显示磨损迹象时,例如通过SMART) | # (SHOULD when a device shows wear-and-tear signs, e.g. through SMART) |
mdadm --manage /dev/md${M} --fail /dev/sd${D}${P} | |
#移除一个错误的组员设备 | # To remove a failed component: |
#(在设备故障后,应提前更换设备) | # (SHOULD before preemptively replacing a device, after failing it) |
mdadm --manage /dev/md${M} --remove /dev/sd${D}${P} | |
#准备(格式化)一个新设备来替换一个失败的设备: | # To prepare (format) a new device to replace a failed one: |
sfdisk -d /dev/sd${D,sane} | sfdisk /dev/sd${D,new} | |
#添加一个成员到现有阵列 | # To add new component to an existing array: |
#这将开始重建修复 | # (this will trigger the rebuild) |
mdadm --manage /dev/md${M} --add /dev/sd${D,new}${P} | |
#查看已经组装(激活)的阵列状态 | # To see assembled (active) arrays status: |
cat /proc/mdstat | |
#重命名一个设备 | # To rename a device: |
#(更改主机名后的SHOULD;如。name = " $(主机名- s)”) | # (SHOULD after hostname change; eg. name="$(hostname -s)") |
mdadm --assemble /dev/md${M} /dev/sd{a,b,c,d,e}${P} --name="${name}:${M}" --update=name |
创建阵列(-C或--create)
--raid-devices(-n)
- 功能:指定阵列中成员盘个数。
- 举例:mdadm --create /dev/md0 -l5 -n2 /dev/sdb /dev/sdc -x1 /dev/sdd
- 备注:当创建linear, multipath, raid0和raid1时,允许指定成员盘个数为1,但要使用--force参数。raid4与raid5不允许指定成员盘个数为1。成员盘个数可以通过--grow参数来修改,只有RAID1、RAID5 和RAID6阵列支持。
--spare-devices (-x)
- 功能:指定阵列中热备盘个数。
- 举例:mdadm --create /dev/md0 -l5 -n2 /dev/sdb /dev/sdc -x1 /dev/sdd
- 备注:无
--size (-z)
- 功能:创建阵列时,指定每个成员盘使用多大的空间。单位KB。
- 举例:mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] -z 4194304
- 备注:当创建RAID1/4/5/6时,可以指定每个成员盘使用多大的空间。同时磁盘最后要留下128Kb大小空间,用于存放RAID的superblock。如果没有指定该参数,mdadm将使用最小成员盘的大小指定该值。如果某个成员盘的大小大于最小成员盘1%,将会有警告信息,提示有部分空间没有被使用。创建阵列时,如果RAID中所有成员盘使用了的空间都小于其本身的大小,那么它们剩余的空间可以通过--grow来扩容。--size=max,mdadm将自动选择一个适合的最大值,来创建阵列。
--chunk (-c)
- 功能:指定条带大小。单位KB,默认值64KB。
- 举例:mdadm --create /dev/md0 -l5 -n2 /dev/sdb /dev/sdc -x1 /dev/sdd -c 128
- 备注:测试过指定4、8、16、32、64、128、256、1024、2048、4096、8192、16384、32768、65536、131072。最大值尚未测试出来,不知是否有最大值。
--rounding
- 功能:指定linear阵列的rounding因子。等价于chunk size,但linear设备的chunk不是条带分布在所有磁盘上,第一个磁盘分布完后,再分布到第二个磁盘上。
- 举例:mdadm --create /dev/md1 -llinear -n2 /dev/sdb /dev/sdc --rounding=128
- 备注:如果建立raid5,指定该参数为128。mdadm –D获取详情时,显示Chunk Size为128K。
--level (-l)
- 功能:设置raid级别。
- 举例:mdadm --create /dev/md0 -l5 -n2 /dev/sdb /dev/sdc -x1 /dev/sdd --chunk=128
- 备注:当创建阵列时,--level参数后面可以跟定的值有linear, raid0, 0, stripe, raid1, 1, mirror, raid4, 4,raid5, 5, raid6, 6, raid10, 10, multipath, mp, faulty(指定faulty没有创建成功)。其中,存在多个同义值。当--build阵列时,--level参数后面可以跟定的值有linear, stripe, raid0, 0, raid1, multipath, mp, and faulty。该参数不支持--grow。
--layout (-p)
- 功能:配置raid5和raid10阵列的数据布局,控制faulty失败模式。
- 举例:mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] -p ra
- 备注:raid5奇偶校验块的布局可以为left-asymmetric, left-symmetric, right-asymmetric, right-sym-metric, la, ra, ls, rs。默认为left-asymmetric。
--parity
- 功能:等同于--layout
--bitmap (-b)
- 功能:使用bitmap模式记录RAID阵列有多少个块已经同步(resync),正常停止RAID后,再将RAID组装起来时,磁盘上已同步块不用再次同步。
- 举例:mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] --bitmap=internal --force
- 备注:可以将bitmap记录在文件中,文件名可以是不存在的,如果文件被用来记录过bitmap可以通过指定--force参数来清空原来的信息。如果创建阵列的时候指定了文件,那么组装阵列时,也要指定该文件。如果值为internal,则bitmap将被当作元数据信息,写入到每个成员盘上面。--grow模式下,如果值为none,则bitmap信息将被清除。
- 注意:位图文件只能存储在ext2或者ext3文件系统上。存储到其他文件系统上面,可能导致严重问题。
--bitmap-chunk
- 功能:指定bitmap中的每1个bit位对应RAID中每个数据块的大小,单位为KB。如--bitmap-chunk=1024,则表示bitmap中1个bit对应RAID中1024K。即如果bitmap中第1个bit为1,代表RAID中第1M的数据在各个磁盘上是不一致的,需要同步。
- 举例:mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] --bitmap=internal --bitmap-chunk=1024
- 备注:使用一个文件存储位图时,默认使用最小的。不会小于4,不会超过2^21(2M)。当--bitmap=internal时,成员盘中用用记录bitmap的空间有个最大值,如果指定的bitmap-chunk过小,则bitmap就会使用过大的空间,如果超过了最大空间,则无法创建成功。如果不指定bitmap-chunk,则会使用bitmap允许的大空间来自动计算出一个bitmap-chunk的最小值。
--write-mostly(-w)
- 功能:阵列的成员盘指定该参数后,在应用中该成员盘只进行数据写,而不从它上面读取数据。该参数只针对RAID1有效。
- 举例:mdadm --create -l1 -n2 /dev/sdi --W /dev/sdj
- 备注:--create 、–build和—add时,均可指定该参数。
通过mdadm –D可以查询到哪个设备指定了该参数。
Number Major Minor RaidDevice State
0 8 128 0 active sync /dev/sdi
1 8 144 1 active sync writemostly /dev/sdj
通过cat /proc/mdstat也可以查看该信息。
md1 : active raid1 sdi[0](W) sdj[1](W)
dd if = /dev/md1 of=/dev/null bs=1M count=4096 &iostate –x /dev/sdi /dev/sdj 1 10
发现仅仅有/dev/sdi盘有流量变化。
--write-behind
- 功能:该参数只针对RAID1有效。对于标记为write-mostly的设备,延迟写。若RAID1中有一个盘是本地磁盘,一个盘是网络上导入的磁盘,则对导入的磁盘设置write-behind参数。在写入数据时,本地磁盘数据写完后,RAID则认为该次写操作已完成。
- 举例:mdadm --create /dev/md1 -l1 -n2 /dev/sde --wrtie-mostly /dev/sdf --write-behind –bitmap=internal
- 备注:该参数仅仅支持raid1。使用该参数,必须指定bitmap。该参数没有经过测试。
--assume-clean
- 功能:创建阵列时,不初始化磁盘上的数据,将指定的磁盘直接组成一个RAID。
- 举例:mdadm --create -l5 -n3 /dev/sd[b-d] --assume-clean
- 备注:当我们可以保证RAID上的数据是一致的,不需要初始化,则可以使用这个参数,一方面可以节省初始化时间,更重要的是,当RAID被损坏后,如果磁盘都在系统中,可以使用此参数,恢复RAID上的数据。
--backup-file
- 功能:通过--grow参数来扩充raid5的成员盘数量时,如果没有空闲盘,可以通过该参数指定一个文件顶替。
- 举例:mdadm --grow /dev/md4 –n4 –backup-file=/tmp/file.backup
- 备注:通过该参数,仅仅支持扩展一个磁盘。不能对降级状态的RAID5进行扩容。扩容后,mdadm将执行数据迁移。
--name(-N)
- 功能:阵列名称。
- 举例:mdadm --create /dev/md4 -l5 -n3 /dev/sd[e-g] --metadata=1.0 --name=aaa
- 备注:创建阵列时,superblock采用1.0版本,该参数才生效。组装阵列的时候,可以通过该参数来组装。mdadm -Av --name=aaa /dev/md4 /dev/sd[b-h]。如果创建时,没有指定--name参数,mdadm将自动为阵列选取一个名字。选取规则是,选取md设备名称的最后部分作为该阵列的名字。例如:/dev/md3,则3将被选择为阵列的名称。
--homehost
- 功能:创建时,通过该参数可以将主机名记录在成员盘的superblock信息中,在组装时用来匹配磁盘中记录的主机名与当前主机是否一致,如果不一致,组装不成功。
- 举例:mdadm --create /dev/md1 -l5 -n3 /dev/sd[b-d] --homehost=pc3x
- 备注:它将覆盖mdadm.conf文件里面HOMEHOST字段。homehost信息将被保存在superblock中,对于1.0以上版本superblock,它将作为name的前缀。对于0.90版本superblock,它将存储与UUID后64位中。
--run(-R)
- 功能:当阵列的活跃盘上面存在其他阵列的superblock信息时,强制启动阵列。
- 举例:mdada --create /dev/md0 -l5 -n3 /dev/sd[b-d] --run
- 备注:构建阵列的盘存在其他阵列的superblock信息时,如果不加--run参数,mdadm将会弹出确认信息Continue creating array?。指定--run参数,将跳过确认信息,直接启动阵列。
--force(-f)
- 功能:强制mdadm接受geometry和layout说明。
- 举例:mdadm --create /dev/md0 -l1 -n1 /dev/sde --force
- 备注:正常情况下,mdadm不允许使用一块盘建立阵列,包括linear, multipath, raid0和raid1。加—force,将可以建立一块盘的阵列。
通常情况下,建立raid5时,mdadm会用n-1个成员盘建立一个降级状态的阵列,然后,将最后一块成员盘被当成热备盘的形式加入到阵列中。这样,mdadm将执行recover操作。加--force,mdadm将直接建立一个active状态的阵列,然后执行resync操作。
-a, --auto{=no,yes,md,mdp,part,p}{NN}
- 功能:通知mdadm是否创建设备文件,并分配一个未使用的次设备号。
- 举例:mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] --auto=md
- 备注:
auto默认值是--auto=yes,需要md设备的设备文件名有一个标准格式,根据这个设备文件名的格式来指定RAID是否可分区以及该RAID的次设备号。
当--auto=yes时标准格式为:不可分区阵列,/dev/mdNN、/dev/md/NN,如指定设备文件名为/dev/md0,则该RAID是一个不可分区的,且次设备号为0。可分区阵列/dev/md/dNN和/dev/md_dNN。
--auto=no,将不会创建设备文件,如果不存在指定的设备文件,将不能创建阵列。
--auto=md,创建一个不可以分区的阵列。
--auto=mdp/part/p,创建一个可以分区的阵列。
如果指定了--scan参数,那配置文件(/etc/mdadm.conf)里面指定的auto=将覆盖命令行后面给定的--auto=。
--symlink=no
- 功能:禁止创建软连接。
- 举例:mdadm --create /dev/md/0 -l5 -n3 /dev/sd[b-d] --symlink=no
- 备注:正常情况下,mdadm在/dev/md/下面创建设备时,它会在/dev/目录下面为该设备创建一个软连接,名字以md或者md_开始。指定该参数,将禁止该功能。即使/etc/mdadm.conf文件里面禁止创建软连接,通过--symlink=yes也可以强制创建。
--metadata(-e)
- 功能:指明被使用superblock类型。
- 举例:mdadm --create /dev/md/0 -l5 n3 /dev/sd[b-d] -e1.0
- 备注:当创建阵列时,默认是0.90。默认值可以改变,mdadm.conf文件中,写如下信息:CREATE metadata=1。可选择值为:
0.90,default:使用默认的0.90版本superblock。这个版本限制阵列只能有28个成员盘和RAID1的成员盘不能大于2TB(没有测试过)。
1.0,1.1,1.2:使用新版本superblock。它有新的约束。不同子版本,存储superblock于磁盘不同位置。1.0,末尾;1.1,开始;1.2,开始4K。
Build阵列(--build)
该模式同create参数相同,但该模式创建的是无superblock的raid0 、linear、 multipath、 or faulty的RAID。详细参数说明,见create模式。
组装阵列--assemble或-A)
该模式用来组装阵列。当阵列被停止后,或重启设备时,如要继续使用该阵列,此要将该阵列组装起来。下面详细介绍该模式的参数。
--uuid(-u)
- 功能:通过匹配uuid来重构raid。
- 举例:mdadm -Av --uuid=af25a90b:0d43e494:46533453:86b2b0d4 /dev/md1
- 备注:uuid号指raid的uuid号,如果磁盘中记录的uuid号与指定的uuid号不匹配,则不使用该磁盘。
--super-minor(-m)
- 功能:通过匹配设备次设备号来重构raid。
- 举例:mdadm -A /dev/md0 --super-minor=0
- 备注:
对于superblock版本为1.0的阵列,不能通过该参数进行重组。
次设备号在创建阵列时,已经分配。重组阵列时,对于不包含该次设备号的设备将不能重组到阵列中。例如:重组的md设备为/dev/md0,那么mdadm将寻找次设备号为0的所有设备。
如果创建阵列时,阵列为/dev/md1,那么所有设备的次设备号为1,即使重组后,阵列变为/dev/md3,所有设备的次设备号还为1。
--name(-N)
- 功能:通过name组装阵列。
- 举例:mdadm -A --name=god /dev/md0
- 备注:
仅支持superblock版本为1.0的阵列。
创建阵列时,要指定--name(或homehost)。组装时,--name要匹配每个设备上的name(或homehost)。下面举例说明:
mdadm --create /dev/md1 -l5 -n3 /dev/sd[b-d] --e1.0 --homehost=pc3x --assume-clean
mdadm -D /dev/md1,获取Name字段值,应该为pc3x:N,N为数字。
mdadm --stop /dev/md1
mdadm -A --name=Name字段值 /dev/mdX
--force(-f)
- 功能:当superblock过期时,可以通过该参数强制组装。
- 举例:mdadm -A --super-minor=0 /dev/md0 --force
- 备注:如当RAID在重构过程中,设备重启了,再组装RAID时,需要加--force参数,才能组装成功。
--run(-R)
- 功能:当重组阵列active盘数少于创建时指定个数时,尝试启动阵列。
- 举例:mdadm -A /dev/md0 /dev/sdb /dev/sdc --run
- 备注:正常情况下,组装阵列时,如果指定的active盘数小于期望的盘数,mdadm将组装成功,但状态是inactive,无法使用该RAID。如果指定了--run参数,mdadm将通过各种方式使其启动。下面举例说明。
mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d]
mdadm --stop /dev/md0
mdadm -A /dev/md0 /dev/sdb /dev/sdc;执行结果如下:
mdadm: /dev/md0 assembled from 2 drives - need all 3 to start it (use --run to insist).
cat /proc/mdstate; 查询到md0信息如下:
md0 : inactive sde[0] sdf[1]
mdadm --run /dev/md0;可以启动md0阵列。
mdadm --stop /dev/md0
mdadm -A --run /dev/md0 /dev/sdb /dev/sdc;组装阵列并启动成功。
--no-degraded
- 功能:组装降级阵列,不启动阵列。
- 举例:mdadm -A --no-degraded --scan /dev/md1
- 备注:正常情况下,mdadm -A --scan组装阵列时,即使扫描到盘个数小于阵列创建时指定盘个数,也可以组装并启动成功。当加上--no-degraded参数,则不启动该阵列。
-a, --auto{=no,yes,md,mdp,part}
- 功能:更改md设备名称。
- 举例:mdadm -A --auto=mdp /dev/test /dev/sdb /dev/sdc /dev/sdd
- 备注:关于该参数具体说明,可以看create模式下相关部分。正常情况下,如果运行mdadm -A /dev/test /dev/sd[b-d]将失败,因为/dev/test不是标准md设备名。而指定了--auto=mdp后,可以组装成功,并为该设备产生一个次设备号。
--bitmap(-b)
- 功能:指定组装RAID使用的bitmap文件,该文件为创建时指定的文件。
- 举例:mdadm -A --bitmap=/root/aaa.file /dev/md1 /dev/sd[b-d]
- 备注:如果是internal类型的bitmap,重组时不需要指定。对于非internal类型的bitmap,如果不指定,组装成功的阵列将不在有bitmap功能。
--backup-file
- 功能:如果一个RAID使用了backup-file参数进行了扩容,那么组装时,也需要指定backup-file。
- 举例:mdadm -A /dev/md0 /dev/sd[b-d] --backup-file=/root/aaa
- 备注: 下面举例说明:
mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d]
mdadm --grow /dev/md0 -n4 --backup-file=/root/aaa
mdadm --stop /dev/md0
mdadm -A /dev/md0 /dev/sd[b-d] --backup-file=/root/aaa
如果重组时,如果不指定backup file。测试结果如下:
对于扩容完成的阵列,重组时指定backup file与否没有关系,均可以重组和启动成功。对于正在扩容中的阵列,停止阵列后,再重组,指定backup file与否也没有关系,均可以重启和启动成功,reshape进度继续,而非重新开始。
the system crashed during the critical section,这种情况下重组阵列,需要指定backup file(个人理解)。因为通过—backup-file扩充盘数时,首先会进行“mdadm: Need to backup 384K of critical section..”这步操作,然后是“mdadm: ... critical section passed.”,扩充磁盘数完成,进行reshape。
--update(-U)
- 功能:组装阵列,更新每个设备的superblock信息。
- 举例:mdadm -A /dev/md0 /dev/sd[b-d] --update=xxx
- 备注:xxx值可能为sparc2.2, summaries, uuid, name, homehost, resync, byteorder, devicesize or super-minor。
sparc2.2:
在linux内核版本为2.2下,需要指定该参数来给内核打一个patch。
super-minor:
该选项会更新每个设备的superblock信息中preferred minor字段,使该字段的值等于所属阵列的次设备号。当使用--super-minor组装阵列时,更换了md设备名称。这时,该设备的次设备号就会改变。但过mdadm –E可以查询后,发现各个成员盘中记录的阵列的次设备号没有更新。
uuid:
更新阵列的UUID。如果通过参数--uuid给定了一个合法的UUID,那么这个UUID将当作阵列的新UUID,而不是拿这个UUID来组装阵列之用。如果--uuid未指定,将随机选择UUID。正常情况下,组装阵列,其UUID是不变的。下面举例说明:
mdadm -A /dev/md2 --super-minor=2 --update=uuid --uuid=bc3c1314:8ac4d622:8bf1a0f2:72d806aa
结果为,改变阵列的uuid为bc3c1314:8ac4d622:8bf1a0f2:72d806aa。
name:
更改存储在阵列superblock中的Name字段。下面举例说明:
mdadm --create /dev/md1 -l5 -n3 /dev/sd[e-g] -e1.0 --name=pc3x --assume-clean
mdadm --stop /dev/md1
mdadm -A /dev/md1 /dev/sd[e-g] --update=name;
结果为,阵列的Name字段由pc3x更新为md阵列的新次设备号,这里也就是1。
mdadm -A /dev/md1 /dev/sd[e-g] --update=name;
结果为,阵列的Name字段将不在更新。
mdadm -A /dev/md1 /dev/sd[e-g] --update=name --name=aaa;
结果为,阵列的Name字段更新为aaa。
homehost:
更新superblock里面的homehost信息。对于0.9版本,更新UUID。对于1.0版本,更新name。
mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] -homehost=pc3x --assume-clean
mdadm -D /dev/md0;查询UUID
mdadm --stop /dev/md0
mdadm -A /dev/md0 /dev/sd[b-d] --homehost=aaa --update=homehost
mdadm -D /dev/md0;查询UUID,与上面相比已改变。
resync:
标识阵列为dirty来表示所有冗余数据都可能是不正确。强迫mdadm开启resync,来保证冗余数据的正确性。
byteorder:
该选项的存在,允许阵列在不同字节序的机器上面移动。仅针对0.9版本superblock。(没有测试)
summaries:
纠正superblock中的摘要信息。包括total,working,active,failed,和spare devices。(没有测试)
devicesize:
这个属性很少使用,仅仅支持superblock版本为1.1和1.2。当阵列的成员盘改变大小的时候,这个功能会有用。成员盘的superblock中记录了成员盘可以用于存储数据的空间大小,当增加了成员盘空间,superblock并不会改变它相应的字段。这样,当增加阵列空间时,就会报错。使用--update=devicesize,可以修复这个错误。
下面使用分区来测试说明。
mdadm --creat /dev/md0 -l5 -n3 /dev/sd[b-d]1; 假设这里分区大小均为2G
mdadm -E /dev/sdb1; 查看Avail Dev Size字段
mdadm --stop /dev/md0
改变每个分区大小,增加到4G;fdisk命令先删除原分区在建立该分区。
mdadm -E /dev/sdb1; 查看Avail Dev Size字段,没有识别出新增空间。
mdadm -A /dev/md0 /dev/sd[b-d]1
mdadm --stop /dev/md0
mdadm -A /dev/md0 /dev/sd[b-d]1 --update=devicesize
mdadm -E /dev/sdb1; 查看Avail Dev Size字段,识别出新增空间。
--auto-update-homehost
- 功能:该项仅在auto-assembly情况下起作用。该条件下,如果没有发现合适的阵列适合该homehost,mdadm将重新扫描所有阵列并组装它们,并更新它们的homehost为指定值。
- 举例:mdadm -A --scan --homehost=aaa --auto-update-homehost
- 备注:下面举例说明。
mdadm --create /dev/md0 -l5 -n3 /dev/sd[b-d] --homehost=pc3x --assume-clean
mdadm --stop /dev/md0
mdadm -A --scan --homehost=aaa --auto-update-homehost
扩容阵列(--grow)
--raid-disks(-n)
- 功能:改变成员盘数量。
- 举例:mdadm --grow /dev/md0 --raid-disks=5
- 备注:阵列只有在正常状态下,才能扩容,降级及重构时不允许扩容。对于raid5来说,只能增加成员盘,不能减少。而对于raid1来说,可以增加成员盘,也可以减少。但要减少成员盘时,首先要将盘faulty和removed掉。
--size(-z)
- 功能:改变成员盘大小。
- 举例:mdadm --grow /dev/md0 --size=4194304
- 备注:可以增加或者减小成员空间大小。当增加空间时,将执行resync操作。madam --grow /dev/md0 --size=max,分配可使用最大的空间给阵列。
--bitmap(-b)
- 功能:增加或者移除bitmap。
- 举例:
mdadm --grow /dev/md0 -b internal;增加bitmap
mdadm --grow /dev/md0 -b none;移除bitmap
--level(-l)
- 功能:尚不支持改变RAID级别。
--layout(-p)
- 功能:改变校验数据分布。等同于create模式下--layout选项。
管理磁盘(--manage)
--add(-a)
- 功能:将指定设备添加到阵列中。
- 举例:mdadm --add /dev/md0 /dev/sdb
- 备注:如果RAID是正常状态,则--add一个磁盘后,该磁盘变为RAID的热备盘。如果RAID为降级状态,当--add所掉的成员盘时,若磁盘上记录了bitmap信息,则根据bitmap 信息来重构RAID磁盘中需要同步的部分。如果RAID为降级状态,--add一个非掉的成员盘,RAID开始全局重构。
--re-add
- 功能:增加一个刚刚从阵列中移除不久的设备。
- 举例:mdadm -r /dev/md0 /dev/sdb --re-add /dev/sdb
- 备注:--red-add与--add目前测试看来效果相同。
--fail(-f)
- 功能:标记指定盘为faulty。
- 举例:mdadm -f /dev/md0 /dev/sdb
- 备注:除了可以指定设备名外,也可以指定detached。使用detached,可以导致从系统detached的盘被标记为faulty(这个没有测试)。
--set-faulty
- 功能:作用等同于--fail
--remove(-r)
- 功能:从阵列中移除指定设备。
- 举例:
mdadm -r /dev/md0 /dev/sdb /dev/sdc,移除md0中的sdb和sdc。
mdadm -r /dev/md1 faulty;移除一个faulty的设备,并不能同时将所有faulty设备移除。
mdadm -r /dev/md1 detached;没有测试。 - 备注:只可以移除spare和faulty盘。
misc模式
--query(-Q)
- 功能:检查设备是否为md设备,是否为md阵列的组成部分。
- 举例:mdadm --query /dev/md0 or mdadm --query /dev/sdi
- 备注:
查询一个md设备,输出信息如下:
[root@localhost ~]# mdadm --query /dev/md0
/dev/md0: 15.100GiB raid5 3 devices, 0 spares. Use mdadm --detail for more detail.
包括阵列名称、阵列大小、阵列级别、阵列的盘数和热备盘数。
查询一个非md设备(设备是md阵列的active盘),输出信息如下:
[root@localhost ~]# mdadm --query /dev/sdj
/dev/sdj: is not an md array
/dev/sdj: device 1 in 2 device active raid1 /dev/md3. Use mdadm --examine for more detail.
查询一个非md设备(设备是md阵列的faulty盘),输出信息如下:
/dev/sdi: is not an md array
/dev/sdi: device 0 in 2 device undetected raid1 /dev/md2. Use mdadm --examine for more detail.
查询一个非md设备(设备存在superblock信息,但已经从md阵列移除),输出信息:
/dev/sdg: is not an md array
/dev/sdg: device 2 in 3 device mismatch raid5 /dev/md0. Use mdadm --examine for more detail.
查询一个非md设备(设备不存在superblock信息),输出信息:
[root@localhost ~]# mdadm --query /dev/sdk
/dev/sdk: is not an md array
--detail(-D)
- 功能:显示一个阵列的详细信息。
- 举例:mdadm --detail /dev/md0
- 备注:
mdadm -D /dev/md0 显示信息如下:
/dev/md0:
Version : 00.90.03 //superblock版本
Creation Time : Thu Jul 28 08:31:13 2011 //创建阵列时间
Raid Level : raid5 //阵列级别
Array Size : 16777088 (16.00 GiB 17.18 GB) //阵列大小
Used Dev Size : 8388544 (8.00 GiB 8.59 GB) //每块成员盘使用在阵列中的大小
Raid Devices : 3 //成员盘个数,正在重构中重构盘也计算在内
Total Devices : 3 //磁盘总个数=active+failed+spare
Preferred Minor : 0 //阵列次设备号
Persistence : Superblock is persistent //是否使用superblock
Intent Bitmap : Internal //bitmap类型
Update Time : Sat Jul 30 08:45:47 2011 //更新时间
State : active //阵列状态
Active Devices : 3 //活跃盘个数,正在重构中的重构盘不计算在内,而计算在Spare Device中,重构完成后,才从Spaer Devices中计算到此项中。
Working Devices : 3 //同Raid Devices相同。
Failed Devices : 0 //faulty盘个数。
Spare Devices : 0 //热备盘个数,重构过程中顶入的重构盘仍计算在内。
Layout : left-symmetric //冗余分布算法
Chunk Size : 64K //条块大小
UUID : f4eea5d5:1959d933:c4cd1425:c6c88f28 //RAID uuid
Events : 0.66
Number Major Minor RaidDevice State //磁盘信息
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
mdadm -Ds显示/proc/mdstat中所有阵列的信息
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=f4eea5d5:1959d933:c4cd1425:c6c88f28
ARRAY /dev/md1 level=raid5 num-devices=3 UUID=cdaf2fef:dfe7b741:2fb91a6c:772f21a6
ARRAY /dev/md3 level=raid1 num-devices=2 UUID=5c8695d2:e606d5ee:8fa15373:20bdb34a
mdadm -D --brief /dev/md0将列出md阵列的简略信息。
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=f4eea5d5:1959d933:c4cd1425:c6c88f28
--export(-Y)
- 功能:与--detail一起使用,使阵列信息的输出格式变为key=value的格式。
- 举例:mdadm --detail --export /dev/md0
- 备注:输出的内容为:
MD_LEVEL=raid0
MD_DEVICES=4
MD_METADATA=0.90
MD_UUID=6905fc31:e0e4cdcc:0ae08b48:7f860f33
--examine(-E)
- 功能:打印设备上面的superblock信息
- 举例:mdadm --examine /dev/sdj
- 备注:
mdadm --examine /dev/sdb显示信息为:
/dev/sdb:
Magic : a92b4efc
Version : 00.90.00
UUID : f4eea5d5:1959d933:c4cd1425:c6c88f28
Creation Time : Thu Jul 28 08:31:13 2011
Raid Level : raid5
Used Dev Size : 8388544 (8.00 GiB 8.59 GB)
Array Size : 16777088 (16.00 GiB 17.18 GB)
Raid Devices : 3
Total Devices : 3
Preferred Minor : 0
Update Time : Sat Jul 30 08:45:47 2011
State : clean
Internal Bitmap : present
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Checksum : dfee75c0 - correct
Events : 0.66
Layout : left-symmetric
Chunk Size : 64K
Number Major Minor RaidDevice State
this 0 8 16 0 active sync /dev/sdb
0 0 8 16 0 active sync /dev/sdb
1 1 8 32 1 active sync /dev/sdc
2 2 8 48 2 active sync /dev/sdd
mdadm --examine --scan。如果/etc/mdadm.conf文件声明了DEVICE字段,将扫描该字段列出的设备。如果没有声明,将扫描所有设备。
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=f4eea5d5:1959d933:c4cd1425:c6c88f28
ARRAY /dev/md1 level=raid5 num-devices=3 UUID=cdaf2fef:dfe7b741:2fb91a6c:772f21a6
ARRAY /dev/md3 level=raid1 num-devices=2 UUID=5c8695d2:e606d5ee:8fa15373:20bdb34a
mdadm --examine --brief /dev/sdj列出具体设备所属于阵列的信息。
ARRAY /dev/md3 level=raid1 num-devices=2 UUID=5c8695d2:e606d5ee:8fa15373:20bdb34a
--sparc2.2
- 功能:对于linux内核版本为2.2下创建的RAID,通过该参数修正阵列的superblock信息
- 举例:mdadm -E --sparc2.2 /dev/md0
- 备注:如果阵列是通过2.2内核加上RAID patch的形式建立的,那样superblock建立的不正确,至少与2.4及以后的内核不兼容。可以通过--examine --spare2.2,在显示信息之前修正它。也可以通过--assemble --update=sparc2.2,重装它。
--examine-bitmap(-X)
- 功能:显示bitmap信息。
- 举例:mdadm -X /dev/sdx or mdadm -X /root/bitmap.file
- 备注:备注:mdadm -X /dev/sdh显示内容
Filename : /dev/sdh
Magic : 6d746962
Version : 4
UUID : 85086dde:4b2d35db:8e186060:0589add1
Events : 0
Events Cleared : 0
State : OK
Chunksize : 32 KB
Daemon : 5s flush period
Write Mode : Normal
Sync Size : 8388544 (8.00 GiB 8.59 GB)
Bitmap : 262142 bits (chunks), 262142 dirty (100.0%)
--run(-R)
- 功能:阵列中某一部分设备包含其他阵列superblock信息时,该阵列可能是inactive状态,或需要用户确认后才能启动,使用该参数可以直接将阵列设为active状态。
- 举例:
mdadm --CR /dev/md0 -l5 -n3 /dev/[b-d] -x1 /dev/sde --bitmap=internal --force
mdadm -R /dev/md0
--stop(-S)
- 功能:停止阵列。被停止的阵列需要重新组装后才能使用。
- 举例:mdadm --stop /dev/md0
--readonly(-o)
- 功能:将active阵列变成只读。
- 举例:mdadm --readonly /dev/md0
- 备注:通过cat /proc/mdstate文件可以查看到阵列的这个变化。如果正在进行重构过程中,阵列变成了只读,那阵列将不能够继续进行重构。不可以重复的对同一设备进行只读设置。
--readwrite(-w)
- 功能:将只读陈列变成可读写。
- 举例:mdadm --readwrite /dev/md0
- 备注:阵列默认是可读写。不可以重复的对同一设备进行可读写设置。
--zero-superblock
- 功能:将包含合法md信息的superblock区域置为零。
- 举例:mdadm --zero-superblock /dev/sdj
- 备注:停止阵列后,若需要清理磁盘上的阵列信息,需要执行该操作。
--test(-t)
- 功能:与--detail一起使用,获取阵列的状态。
- 举例:mdadm --detail --test /dev/md0; echo $?
- 备注:--detail参数单独使用时,只有在获取一些设备的有用信息失败情况时,才返回非0。而与--test一起使用,echo $?的结果如下:
0:阵列处于active状态。
1:阵列存于degrade和重构状态。
2:阵列处于disabled状态。
4:获取设备信息时,存在错误。
-W, --wait
- 功能:它将等待resync, recovery, or reshape完成,然后返回。
- 举例:mdadm -W /dev/md0
- 备注:如果md设备没有进行resync, recovery, or reshape,该命令将直接返回。echo $?结果为1。如果mdadm等待md设备完成resync, recovery, or reshape后,命令执行结束,echo $?为0。
监控模式(--monitor)
指定监控对象:
对于命令mdadm --monitor options... devices...,如果给出了devices,则仅仅监控指定的devices。反之,监控所有配置文件(/etc/mdadm.conf)中的devices。如果指定了--scan,则/proc/mdstate里面列出的设备也被监控。
输出监控事件:
监控的结果就是产生事件。事件被传递给指定的程序或者发送给指定的E-mail,则事件报告给stdout。具体如何指定事件的输出见下节详述。当传递事件给程序时,程序立刻运行。传递给程序2-3个参数。第一个是事件的名称,第二个是产生事件的md设备名称,如果存在,第三个参数是关联设备的名称。
被监控事件类型:
DeviceDisappeared:对mdadm配置monitor错误时,会产生该事件。例如:对于一个已经配置了监控进程的md设备,再次给它配置监控进程,后配置的监控进程将产生该事件。对于--mail参数配置错误的参数,如配置两个以上邮箱,之间以空格隔开。可以配置成功,但会报该事件。
RebuildStarted:md设备开始重建。
RebuildNN:md设备的重建进度到达某些值时产生监控事件。如进度值为20、40、60和80时,产生相应监控事件。
RebuildFinished:md设备重建完成。
Fail:md设备上面一个磁盘状态为faulty。
FailSpare:热备盘代替faulty盘失败。
SpareActive:热备盘代替faulty盘成功,并且Spare盘状态最终变为active(非spare)状态时,产生监控事件。
NewArray:/etc/mdadm.conf也/proc/mdstat两个文件对比,mdadm.conf文件中不存在的md设备,即被报告该事件。
DegradedArray:检查到存在降级的md设备。
MoveSpare:在使用全局热备时,热备盘从一个md设备移动到另一个md设备。
SparesMissing:/etc/mdadm.conf文件,某个md设备指定了spares参数(热备盘个数),而monitor发现md设备的热备盘个数少于指定个数时,产生该事件。
TestMessage:与--test参数配合,当运行monitor命令时,相应的md设备产生该事件。
所有事件都可以触发程序运行,但仅有Fail、FailSpare、DegradedArray、SparesMissing 和TestMessage事件可以通过mail发送。
可监控级别:
监控md设备状态的变化。该参数对raid1、4、5、6、10和multipath盘阵有作用。对于raid0和linear,由于它们无相关监控事件不需要监控。
监控设置全局热备:
除了能够报告事件外,对于处于相同spare-group的阵列,如果其中一个阵列的某个磁盘损害且不存在热备盘,而另外阵列存在热备盘,monitor进程可以把热备盘移动到这个阵列上面来。及多个阵列可以共有一个热备盘。配置文件格式如下:
DEVICE /dev/sd*
ARRAY /dev/md0 level=raid5 num-devices=3 spares=1 UUID=a7e27ec9:3389e70a:2a2d9651:abbe4ad6 spare-group=group1
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=8f427b1d:d86e2313:7f5d9f04:310f9e63 spare-group=group1
对于上面md0和md1,配置了spare-group都是group1,当监控开启后,md1若掉盘了,监控发现该事件后,会自动将md0中的热备顶到md1中,供其使用。
--mail(-m)
- 功能:指定邮件地址
- 举例:madam –monitor –mail=xxx@csdn.net /dev/md0
- 备注:首先要保证sendmail服务启动,同时,通过mail命令可以发送邮件成功。可以配置多个邮箱,以逗号隔开。
-program(-p), --alert
- 功能:当事件被发现时,触发指定的程序运行。
- 举例:mdadm --monitor --program=/root/pc3x.sh /dev/md0 &
- 备注:程序可以为shell脚本,通过$1,$2,$3来获取相应的参数。
-y, --syslog
- 功能:事件通过syslog报告。
- 举例:mdadm --monitor --syslog /dev/md0 &
- 备注:message被打印到/var/log/message文件里面
--delay(-d)
- 功能:查看设备的延迟时间。默认是60s
- 举例:mdadm --monitor –mail=xxx@csdn.net --program=/root/pc3x.sh --delay=300 /dev/md0 &
--daemonise(-f)
- 功能:mdadm将以后台demon形式来运行。
- 举例:mdadm --monitor --syslog /dev/md0 -f
- 备注:demon的ID号将被打印到屏幕上面。可以配合--pid-file参数使用,将ID号打印到--pid-file参数指定的文件中。
--pid-file(-i)
- 功能:当mdadm以demon模式运行时,把进程ID写入到指定的文件中。
- 举例:mdadm --monitor --syslog --pig-file=/root/pc3x.pid /dev/md0 -f
- 备注:注意,该参数必须和-f参数一起使用。如果不使用—pid-file参数,进程号将被打印到屏幕上,指定该参数后,进程号被写入到指定的文件中。
--oneshot(-1)
- 功能:立刻检查一次盘阵,会检查到NewArray、DegradedArray 、SparesMissing事件。
- 举例:mdadm --monitor --oneshot --scan --program=/root/pc3x.sh
- 备注:该参数不能与-f参数一起使用。虽然与-f参数一起使用不会报错,但是demon根本不会启动起来。与—scan参数配合使用,效果更加。在配置cron一起使用,效果更上一层。
--test(-t)
- 功能:当启动mdadm的时候,给每个md设备发送一条TestMessage事件。
- 举例:mdadm --monitor --test --syslog /dev/md0 -f
- 备注:当--test配合--scan使用时,它会给/etc/mdadm.conf文件里面的每个md设备发送TestMessage事件。如果mdadm --monitor命令指定设备,它会给每个设备发送TestMessage事件。
--config(-c)
- 功能:指定特定的配置文件,通过配置文件指定邮件地址和程序。不使用该参数,默认文件为/etc/mdadm.conf。
- 举例:mdadm --monitor --scan --config=文件 --oneshot
- 备注:如果指定其他配置文件,则/etc/mdadm.conf文件将失效。
--scan(-s)
- 功能:监控/proc/mdsate文件中列出的所有设备。
- 举例:mdadm --monitor --scan --program=/root/pc3x.sh -f
- 备注:当使用--scan参数时,--program或者—mail,两个参数必须指定一个。同时,mdadm --monitor命令行不需要特别说明某个设备。
非特定模式参数
--help(-h)
- 功能:显示帮助信息,后面跟上选项名称,将显示该选项方式下所有选项帮助信息。
- 举例:mdadm --help; mdadm --help --add; mdadm --create --help
--help-options
- 功能:显示一些帮助信息。跟--help大同小异。
- 举例:mdadm --help-options
--version(-V)
- 功能:打印mdadm版本
- 举例:mdadm --version
--verbose(-v)
- 功能:对于正在发生的,显示详细信息。
- 举例:mdadm -D -v -s
- 备注:该参数可以使用2遍,显示额外信息。目前可以应用在--detail --scan 和 --examine --scan。
--quiet(-q)
- 功能:避免打印完全的信息。
- 备注:这种模式下,mdadm除非是非常重要的信息,否则不会打印任何信息。
--brief(-b)
- 功能:显示简短信息。比--verbose少。
- 举例:mdadm -D /dev/md0 --brief
- 备注:可以与--detail或--examine一起使用。当与--verbose一起使用时,打印--verbose与--brief中间状态信息。
--force(-f)
- 功能:不同模式下面有不同意思,具体详见各个模式。仔细小心使用这个参数。
--config(-c)
- 功能:指定配置文件。
- 备注:默认配置文件为/etc/mdadm.conf,如果这个文件不存在,将是/etc/mdadm/mdadm.conf。如果值是none,mdadm会将配置文件看成空文件。如果值是partitions,mdadm将读取/proc/partitions以获取所有设备。
mdadm --examine --brief --scan --config=partitions
--scan(-s)
- 功能:扫描配置文件或者/proc/mdstate文件,去获取信息。
- 备注:从/proc/mdstate文件中获取一些/etc/mdadm.conf文件中没有的信息。如:成员盘。唯一例外就是misc和monitor模式下,使用—detail或者—stop,mdadm将从/proc/mdstate文件中获取所有阵列。如mdadm --stop --scan将停止所有的md设备。
mdadm.conf
配置文件作用:
/etc/mdadm.conf作为默认的配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。在这里我们主要说明配置文件在组装RAID时的作用。更多mdadm.conf使用可参见man mdadm.conf。
举例:
- 配置磁盘设备文件名:echo DEVICE /dev/sd[b-i] > /etc/mdadm.conf
- 配置软RAID信息:mdadm --detail --scan >> /etc/mdadm.conf
- 利用配置文件组装软RAID:mdadm -A --scan
- 当RAID无法组装时(如缺少成员盘,或读写造成superblock数据过期),强制组装软RAID:mdadm -A --scan --force
组装中的几点说明:
- --scan参数只能根据扫描配置文件中配置的RAID,没有配置在配置文件中的RAID不能组装起来。
- DEVICE中配置的是组装RAID时,所有要扫描的磁盘,如RAID中的成员盘没有配置到DEVICE项中,则该磁盘无法组装到RAID中。
需要加--force才能使RAID active的情况:
- 对于有冗余且无热备的RAID,停止后,又掉了一块盘,组装时不加--force,RAID组装起来为inactive状态,mdadm -D 查不到RAID信息,仅/proc/mdstat中可看到简要信息。对于先掉盘,后停止的RAID,不需要--force也可以组装成功。
- 对于有冗余且无热备,RAID中所有成员盘虽然在系统中,但配置文件的DEVICE的配置缺少一个成员盘,则组装时,可以理解为缺少一块成员盘。因此组装结果同1中相同。
- 重构状态的RAID,重启后,不指定--force无法组装成功。
无法将RAID组装成active的情况:
对于上节说到的缺少一块成员盘时,可以通过--force参数将RAID组装起来,但对于掉了两块或两块以上的成员盘时,无法将RAID再组装成active状态,只能组装成一个inactive状态的RAID。