linux 软raid实战


linux 软raid实战
 
 
一.简介
在Linux系统中目前以MD (Multiple Devices)虚拟块设备的方式实现软件RAID,利用多个底层的块设备虚拟出一个新的虚拟块设备,并且利用条带化(stripping)技术将数据块均匀分布到多个磁盘上来提高虚拟设备的读写性能,利用不同的数据冗余算法来保护用户数据不会因为某个块设备的故障而完全丢失,而且还能在设备被替换后将丢失的数据恢复到新的设备上。关于不同冗余级别的定义和数据块以及校验块的分布示意图可以参考存储专业委员会给出的参考资料“Common RAID Disk Data Format Specification ”。目前MD支持linear, multipath, raid0 (stripping), raid1 (mirror), raid4, raid5, raid6, raid10等不同的冗余级别和组成方式,当然也能支持多个RAID阵列的层叠组成raid1+0, raid5+1等类型的阵列。在参考资料“Software RAID HOWTO”中介绍了早期软件RAID阵列功能特点和使用方式,但是因为软件RAID程序的功能不断增加,因此很有必要写份新的使用介绍。
本文主要先讲解用户层mdadm如何管理软件RAID以及使用中经常遇到的问题和解决方法。在流行的Linux的发布版中,如FedoraCore,Gentoo, Ubuntu,Debian,SuseLinux系统中一般已经将MD驱动模块直接编译到内核中或编译为可动态加载的驱动模块。我们可以在机器启动后通过cat /proc/mdstat看内核是否已经加载MD驱动或者cat /proc/devices是否有md块设备,并且可以使用lsmod看MD是否是以模块形式加载到系统中。
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities :
unused devices: <none>
[root@fc5 mdadm-2.6.3]# cat /proc/devices | grep md
1 ramdisk
9 md
253 mdp
[root@fc5 mdadm-2.6.3]# lsmod | grep md
md_mod                 73364  0
 

如果Linux系统既没有将MD编译到内核也没有自动加载MD模块,则没有/proc/mdstat文件,那么需要执行命令modprobe md加载驱动模块。
[root@fc5 mdadm-2.6.3]#cat /proc/mdstat
cat: /proc/mdstat: No such file or directory
[root@fc5 mdadm-2.6.3]# modprobe  md
[root@fc5 mdadm-2.6.3]# lsmod | grep dm_mod
dm_mod                100369  11 
 

如果系统中没有MD驱动模块则需要自己从Linux内核源代码网站下载源代码包,并且重新编译内核,并且需要在内核的配置文件选择。
[*]Multiple devices driver support (RAID and LVM) 
<*>    RAID support                                        
    <M>     Linear (append) mode  
    <M>     RAID-0 (striping) mode  
    <M>     RAID-1 (mirroring) mode 
    <M>     RAID-10 (mirrored striping) mode (EXPERIMENTAL) 
    <M>     RAID-4/RAID-5/RAID-6 mode 
    [*]       Support adding drives to a raid-5 array 
    <M>     Multipath I/O support 
    <M>     Faulty test module for MD
 

在Linux系统中用户层以前使用raidtool工具集 来管理MD设备,目前广泛使用mdadm软件来管理MD设备,而且该软件都会集成在Linux的发布版中。如果系统中没有安装可以到RAID驱动程序和mdadm软件的维护者Neil Brown的个人网站 来下载源码包进行编译安装,或者下载RPM包直接安装。mdadm的最新版本是2.6.3。可以使用mdadm --version查看当前系统使用的版本。本文使用的是mdadm-2.6.3, Linux内核版本是Linux-2.6.22.1。下面的测试命令是在虚拟机环境中测试运行的。
[root@fc5 mdadm-2.6.3]# uname -r
2.6.22.1
[root@fc5 mdadm-2.6.3]# mdadm --version
mdadm - v2.6.3 - 20th August 2007
 

二. mdadm管理软RAID阵列
mdadm程序是一个独立的程序,能完成所有的软RAID管理功能,主要有7种使用模式:
模式名字 主要功能 
Create 使用空闲的设备创建一个新的阵列,每个设备具有元数据块 
Assemble 将原来属于一个阵列的每个块设备组装为阵列 
Build 创建或组装不需要元数据的阵列,每个设备没有元数据块 
Manage 管理已经存储阵列中的设备,比如增加热备磁盘或者设置某个磁盘失效,然后从阵列中删除这个磁盘 
Misc 报告或者修改阵列中相关设备的信息,比如查询阵列或者设备的状态信息 
Grow 改变阵列中每个设备被使用的容量或阵列中的设备的数目 
Monitor 监控一个或多个阵列,上报指定的事件
2.1 创建新的阵列
软RAID阵列实际上也可以使用任何标准的块设备作为底层设备,如SCSI设备、IDE设备、RAM disk磁盘和NBD(Network Block Device)等,甚至是其他的MD设备。
如果MD驱动是模块形式加载,需要在系统运行时由用户层脚本控制RAID阵列启动运行。如在FedoraCore系统中在/etc/rc.d/rc.sysinit文件中有启动软RAID阵列的指令,若RAID的配置文件mdadm.conf存在,则调用mdadm检查配置文件里的选项,然后启动RAID阵列。
echo "raidautorun /dev/md0" | nash --quiet
if [ -f /etc/mdadm.conf ]; then
    /sbin/mdadm -A -s
fi
mdadm使用--create(或其缩写-C)参数来创建新的阵列,并且将一些重要阵列的标识信息作为元数据可以写在每一个底层设备的指定区间。--level(或者其缩写-l)表示阵列的RAID级别,--chunk(或者其缩写-c)表示每个条带单元的大小,以KB为单位,默认为64KB,条带单元的大小配置对不同负载下的阵列读写性能有很大影响。--raid-devices(或者其缩写-n)表示阵列中活跃的设备个数,而--spare-devices(或者其缩写-x)表示阵列中热备盘的个数,一旦阵列中的某个磁盘失效,MD内核驱动程序自动用将热备磁盘加入到阵列,然后重构丢失磁盘上的数据到热备磁盘上。
创建一个RAID 0设备:
mdadm --create  /dev/md0 --level=0 --chunk=32 --raid-devices=3 /dev/sd[i-k]1
创建一个RAID 1设备:
mdadm -C /dev/md0 -l1 -c128 -n2 -x1 /dev/sd[i-k]1
创建一个RAID 5设备:
mdadm -C /dev/md0 -l5 -n5 /dev/sd[c-g] -x1 /dev/sdb 
创建一个RAID 6设备:
mdadm -C /dev/md0 -l6 -n5 /dev/sd[c-g] -x2 /dev/sdb /dev/sdh
创建一个RAID 10设备:
mdadm -C /dev/md0 -l10 -n6 /dev/sd[b-g] -x1 /dev/sdh
创建一个RAID1+0设备:
mdadm -C /dev/md0 -l1 -n2 /dev/sdb /dev/sdc
mdadm -C /dev/md1 -l1 -n2 /dev/sdd /dev/sde
mdadm -C /dev/md2 -l1 -n2 /dev/sdf /dev/sdg
mdadm -C /dev/md3 -l0 -n3 /dev/md0 /dev/md1 /dev/md2
创建可分区的RAID设备(注意:安装ssu必须使用这种设备)
如果想对支持分区的MD设备(Partitionable raid array)进行分区.创建阵列是通过--auto=mdp(或者其缩写-ap)参数指定。 
[root@fc5 mdadm-2.6.3]# mdadm -Cv --auto=mdp  /dev/md_d0  --bitmap=internal  -l5 -n24 /dev/sd[a-w] -x2 /dev/sd[x-y]
注意:redhat linux 的Soft Raid一定需要/etc/mdadm.conf配置文件才能自动启动
使用mdadm生成mdadm.conf:
#mdadm -Ds >/etc/mdadm.conf
#cat /etc/mdadm.conf
ARRAY /dev/md_d0 level=raid5 num-devices=11 spares=3 UUID=bc83fe18:b2aca48d:a8221049:a3e397e4
可见md使用了/dev/md_d0 为阵列设备,ssu可以安装在这个设备上面。

2.2 为磁盘划分FD(Linux raid autodetect)分区
如果MD驱动被编译到内核中,当内核调用执行MD驱动时会自动查找分区为FD(Linux raid autodetect)格式的磁盘将软RAID加载起来。所以可以使用fdisk等分区工具将HD[X]磁盘或者SD[X]磁盘分区,再设置为FD的磁盘。
[root@fc5 mdadm-2.6.3]# fdisk /dev/sdk
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-512, default 1):1
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):512
Using default value 512
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): FD
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@fc5 mdadm-2.6.3]# fdisk -l /dev/sdk
Disk /dev/sdk: 1073 MB, 1073741824 bytes
128 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 4096 * 512 = 2097152 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdk1               1         512     1048560   fd  Linux raid autodetect

当RAID1/4/5/6/10等创建成功后,需要计算每个条带的校验和信息并写入到相应磁盘上,所以RAID阵列有一个冗余组数据同步的初始化过程(resync)。但是MD设备只要创建成功后即可对外被上层应用读写使用,当然由于上层数据读写降低数据同步的性能。初始化的时间长短和磁盘阵列自身性能以及读写的应用负载相关,使用cat /proc/mdstat信息查询RAID阵列当前重构的速度和预期的完成时间。
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
      [===>...........]  resync = 15.3% (483072/3145536) finish=0.3min speed=120768K/sec
unused devices: <none>
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
unused devices: <none>

如果一个块设备已经正在被其他的MD设备或者文件系统使用,则不能用来创建新的MD设备。
[root@fc5 mdadm-2.6.3]# ./mdadm -C /dev/md1 -l0 -n2 /dev/sdh /dev/sdi
mdadm: Cannot open /dev/sdh: Device or resource busy
mdadm: create aborted

Build模式可以用来创建没有元数据的RAID0/1设备,不能创建RAID4/5/6/10等带有冗余级别的MD设备。
[root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 -l0 -n6 /dev/sd[b-g]
mdadm: array /dev/md0 built and started. 
[root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 -l1 -n2 /dev/sd[b-c]
mdadm: array /dev/md0 built and started.
[root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 -l5 -n6 /dev/sd[b-g]
mdadm: Raid level 5 not permitted with --build.
[root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 –l6 -n6 /dev/sd[b-g]
mdadm: Raid level 5 not permitted with --build.
[root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 –l10 -n6 /dev/sd[b-g]
mdadm: Raid level 10 not permitted with --build.
使用阵列:
MD设备可以像普通块设备那样直接读写,也可以做硬盘分区和文件系统格式化。 
#parted /dev/md_d0
#mkfs.ext3 /dev/md_d0p1

停止正在运行的阵列:
当阵列没有文件系统或者其他存储应用以及高级设备使用的话,可以使用--stop(或者其缩写-S)停止阵列;如果命令返回设备或者资源忙类型的错误,说明/dev/md0正在被上层应用使用,暂时不能停止,必须要首先停止上层的应用,这样也能保证阵列上数据的一致性。
[root@fc5 mdadm-2.6.3]# mdadm --stop /dev/md0
mdadm: fail to stop array /dev/md0: Device or resource busy
[root@fc5 mdadm-2.6.3]# umount /dev/md0
[root@fc5 mdadm-2.6.3]#mdadm --stop /dev/md0 
mdadm: stopped /dev/md0
 

2.3 组装曾创建过的阵列
模式--assemble或者其缩写(-A)主要是检查底层设备的元数据信息,然后再组装为活跃的阵列。如果我们已经知道阵列由那些设备组成,可以指定使用那些设备来启动阵列。
[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信息一致,如果信息一致则启动阵列。如果没有配置/etc/mdadm.conf文件,而且又不知道阵列由那些磁盘组成,则可以使用命令--examine(或者其缩写-E)来检测当前的块设备上是否有阵列的元数据信息。
[root@fc5 mdadm-2.6.3]# ./mdadm -E /dev/sdi
mdadm: No md superblock detected on /dev/sdi.
[root@fc5 mdadm-2.6.3]# ./mdadm -E /dev/sdb
/dev/sdb:
          Magic : a92b4efc
        Version : 00.90.00
           UUID : 0cabc5e5:842d4baa:e3f6261b:a17a477a
  Creation Time : Sun Aug 22 17:49:53 1999
     Raid Level : raid10
  Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
     Array Size : 3145536 (3.00 GiB 3.22 GB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Update Time : Sun Aug 22 18:05:56 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
       Checksum : 2f056516 - correct
         Events : 0.4
         Layout : near=2, far=1
     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
   3     3       8       64        3      active sync   /dev/sde
   4     4       8       80        4      active sync   /dev/sdf
   5     5       8       96        5      active sync   /dev/sdg
   6     6       8      112        6      spare   /dev/sdh
 

从上面命令结果可以找到阵列的唯一标识UUID和阵列包含的设备名字,然后再使用上面的命令来组装阵列,也可以使用UUID标识来组装阵列。没有一致的元数据的信息设备(例如/dev/sda和/dev/sda1等)mdadm程序会自动跳过。
[root@fc5 mdadm-2.6.3]# ./mdadm -Av --uuid=0cabc5e5:842d4baa:e3f6261b:a17a477a 
                             /dev/md0 /dev/sd*
mdadm: looking for devices for /dev/md0
mdadm: no recogniseable superblock on /dev/sda
mdadm: /dev/sda has wrong uuid.
mdadm: no recogniseable superblock on /dev/sda1
mdadm: /dev/sda1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdi
mdadm: /dev/sdi has wrong uuid.
mdadm: /dev/sdi1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdj
mdadm: /dev/sdj has wrong uuid.
mdadm: /dev/sdj1 has wrong uuid.
mdadm: no RAID superblock on /dev/sdk
mdadm: /dev/sdk has wrong uuid.
mdadm: /dev/sdk1 has wrong uuid.
mdadm: /dev/sdb is identified as a member of /dev/md0, slot 0.
mdadm: /dev/sdc is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sdd is identified as a member of /dev/md0, slot 2.
mdadm: /dev/sde is identified as a member of /dev/md0, slot 3.
mdadm: /dev/sdf is identified as a member of /dev/md0, slot 4.
mdadm: /dev/sdg is identified as a member of /dev/md0, slot 5.
mdadm: /dev/sdh is identified as a member of /dev/md0, slot 6.
mdadm: added /dev/sdc to /dev/md0 as 1
mdadm: added /dev/sdd to /dev/md0 as 2
mdadm: added /dev/sde to /dev/md0 as 3
mdadm: added /dev/sdf to /dev/md0 as 4
mdadm: added /dev/sdg to /dev/md0 as 5
mdadm: added /dev/sdh to /dev/md0 as 6
mdadm: added /dev/sdb to /dev/md0 as 0
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
 

配置文件:
/etc/mdadm.conf作为默认的配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。Assemble命令也可以使用--config(或者其缩写-c)来指定配置文件。我们通常可以如下命令来建立配置文件。
[root@fc5 mdadm-2.6.3]#echo DEVICE /dev/sd[b-h] /dev/sd[i-k]1 > /etc/mdadm.conf
[root@fc5 mdadm-2.6.3]# mdadm -Ds >>/etc/mdadm.conf
[root@fc5 mdadm-2.6.3]# cat /etc/mdadm.conf
DEVICE /dev/sd[b-h] /dev/sd[i-k]1
ARRAY /dev/sda level=raid5 num-devices=11 spares=3 UUID=bc83fe18:b2aca48d:a8221049:a3e397e4
 

使用配置文件启动阵列时,mdadm会查询配置文件中的设备和阵列内容,然后启动运行所有能运行RAID阵列。如果指定阵列的设备名字,则只启动对应的阵列。
[root@fc5 mdadm-2.6.3]# ./mdadm -As
mdadm: /dev/md1 has been started with 3 drives.
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid0] [raid10]
md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
md1 : active raid0 sdi1[0] sdk1[2] sdj1[1]
      7337664 blocks 32k chunks
unused devices: <none>
[root@fc5 mdadm-2.6.3]# mdadm -S /dev/md0 /dev/md1
mdadm: stopped /dev/md0
mdadm: stopped /dev/md1
[root@fc5 mdadm-2.6.3]# mdadm -As /dev/md0
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid0] [raid10]
md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU]
unused devices: <none>
 

2.4 查询阵列的状态
我们可以通过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: <none>
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 -f /dev/sdh /dev/sdb
mdadm: set /dev/sdh faulty in /dev/md0
mdadm: set /dev/sdb faulty in /dev/md0
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid5 sdh[6](F) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[7](F)
      5242560 blocks level 5, 64k chunk, algorithm 2 [6/5] [_UUUUU]
unused devices: <none>
 

如果Linux系统目前支持sysfs也可以访问/sys/block/md0目录查询阵列信息。
[root@fc5 mdadm-2.6.3]# ls -l /sys/block/md0/
capability  holders  range      size    stat       uevent
dev         md       removable  slaves  subsystem
[root@fc5 mdadm-2.6.3]# ls /sys/block/md0/md/
array_state      dev-sdg           rd1               suspend_lo
bitmap_set_bits  dev-sdh           rd2               sync_action
chunk_size       layout            rd3               sync_completed
component_size   level             rd4               sync_speed
dev-sdb          metadata_version  rd5               sync_speed_max
dev-sdc          mismatch_cnt      reshape_position  sync_speed_min
dev-sdd          new_dev           resync_start
dev-sde          raid_disks        safe_mode_delay
dev-sdf          rd0               suspend_hi
[root@fc5 mdadm-2.6.3]# ls /sys/block/md0/slaves/
sdb  sdc  sdd  sde  sdf  sdg  sdh
 

我们也可以通过mdadm命令查看指定阵列的简要信息(使用--query或者其缩写-Q)和详细信息(使用--detail或者其缩写-D) 详细信息包括RAID的版本、创建的时间、RAID级别、阵列容量、可用空间、设备数量、超级块状态、更新时间、UUID信息、各个设备的状态、RAID算法级别类型和布局方式以及块大小等信息。设备状态信息分为active, sync, spare, faulty, rebuilding, removing等等。
[root@fc5 mdadm-2.6.3]# mdadm --query /dev/md0
/dev/md0: 2.100GiB raid10 6 devices, 1 spare. Use mdadm --detail for more detail.
[root@fc5 mdadm-2.6.3]# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 17:49:53 1999
     Raid Level : raid10
     Array Size : 3145536 (3.00 GiB 3.22 GB)
  Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Aug 22 21:55:02 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
         Layout : near=2, far=1
     Chunk Size : 64K
           UUID : 0cabc5e5:842d4baa:e3f6261b:a17a477a
         Events : 0.122
    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
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
       6       8      112        -      spare   /dev/sdh
 

2.5 管理阵列
mdadm可以在Manage模式下,对运行中的阵列进行添加及删除磁盘。常用于标识failed磁盘,增加spare(热备)磁盘,以及从阵列中移走已经失效的磁盘等等。使用--fail(或者其缩写-f)指定磁盘损坏。
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
 

当磁盘已经损坏时,使用--remove(或者其缩写--f)参数将这个磁盘从磁盘阵列中移走;但如果设备还正在被阵列使用,则不能从阵列中移走。
[root@fc5 mdadm-2.6.3]# mdadm  /dev/md0 --remove /dev/sdb
mdadm: hot removed /dev/sdb
[root@fc5 mdadm-2.6.3]# ./mdadm  /dev/md0 --remove /dev/sde
mdadm: hot remove failed for /dev/sde: Device or resource busy
 

如果阵列带有spare磁盘,那么自动将损坏磁盘上的数据重构到新的spare磁盘上;
[root@fc5 mdadm-2.6.3]# mdadm -f /dev/md0 /dev/sdb ; cat /proc/mdstat
mdadm: set /dev/sdb faulty in /dev/md0
Personalities : [raid0] [raid10]
md0 : active raid10 sdh[6] sdb[7](F) sdc[0] sdg[5] sdf[4] sde[3] sdd[2]
      3145536 blocks 64K chunks 2 near-copies [6/5] [U_UUUU]
      [=======>........]  recovery = 35.6% (373888/1048512) finish=0.1min speed=93472K/sec
unused devices: <none>
 

如果阵列没有热备磁盘,可以使用--add(或者其缩写-a)参数增加热备磁盘
[root@fc5 mdadm-2.6.3]# mdadm  /dev/md0 --add /dev/sdh
mdadm: added /dev/sdh
 

2.6 监控阵列
可以使用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
 

查看系统日志信息,可以看到哪个阵列或者阵列中的哪个设备发生过的哪些事件。
[root@fc5 mdadm-2.6.3]# mdadm -f /dev/md0 /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@fc5 mdadm-2.6.3]#tail –f /var/log/messages
Aug 22 22:04:12 fc5 mdadm: RebuildStarted event detected on md device /dev/md0
Aug 22 22:04:12 fc5 kernel: md: using maximum available idle IO bandwidth 
  (but not more than 200000 KB/sec) for recovery.
Aug 22 22:04:12 fc5 kernel: md: using 128k window, over a total of 1048512 blocks.
Aug 22 22:04:14 fc5 mdadm: Fail event detected on md device /dev/md0, 
  component device /dev/sdb
Aug 22 22:04:14 fc5 mdadm: Rebuild80 event detected on md device /dev/md0
Aug 22 22:04:16 fc5 mdadm: RebuildFinished event detected on md device /dev/md0
Aug 22 22:04:16 fc5 mdadm: SpareActive event detected on md device /dev/md0, 
  component device /dev/sdh
Aug 22 22:04:16 fc5 kernel: md: md0: recovery done.
 

回调程序从mdadm程序接受两个或者三个参数:事件名字,监控阵列的名字和特殊事件可能使用到的底层块设备名字。上面的事件返回的信息如下:
Eventname: RebuildStarted  Device: /dev/md0  next:
Eventname: Fail  Device: /dev/md0  next: /dev/sdb
Eventname: Rebuild80  Device: /dev/md0  next:
Eventname: RebuildFinished  Device: /dev/md0  next:
Eventname:SpareActive  Device: /dev/md0  next: /dev/sdh
 

2.7 扩展阵列
如果在创建阵列时不想使用整个块设备,可以指定用于创建RAID阵列每个块设备使用的设备大小。
mdadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --size=102400
 

然后在阵列需要扩展大小时,使用模式--grow(或者其缩写-Q)以及--size参数(或者其缩写-z) 在加上合适的大小数值就能分别扩展阵列所使用每个块设备的大小。
[root@fc5 mdadm-2.6.3]# ./mdadm -Q /dev/md0
/dev/md0: 500.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. 
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 --size=204800
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1024000 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
      [============>......]  resync = 69.6% (144188/204800) finish=0.0min speed=10447K/sec
unused devices: <none>
[root@fc5 mdadm-2.6.3]# ./mdadm -Q /dev/md0
/dev/md0: 1000.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail.
 

如果上面是文件系统(ext2,ext3, reiserfs),在设备大小扩展后,文件系统也要同时扩展。
[root@fc5 mdadm-2.6.3]# df -h | grep md
/dev/md0              485M   11M  449M   3% /mnt/md-test
[root@fc5 mdadm-2.6.3]# ext2online /dev/md0
[root@fc5 mdadm-2.6.3]# df -h | grep md
/dev/md0              969M   11M  909M   2% /mnt/md-test
 

mdadm还提供增加或减少阵列中设备个数的功能(reshape),使用模式—grow和 --raid-disks(或者其缩写-n)参数再加上合适的设备个数。扩展后阵列中原来的热备盘变为活跃磁盘,所以阵列的设备个数增加,阵列的大小也相应增加。
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 22:16:19 1999
     Raid Level : raid5
     Array Size : 1024000 (1000.17 MiB 1048.58 MB)
  Used Dev Size : 204800 (200.03 MiB 209.72 MB)
   Raid Devices : 6
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Aug 22 22:23:46 1999
          State : clean
 Active Devices : 6
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 1
         Layout : left-symmetric
     Chunk Size : 64K
           UUID : 53e6395c:1af16258:087cb2a0:b66b087f
         Events : 0.12
    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
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
       6       8      112        -      spare   /dev/sdh
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 --raid-disks=7
mdadm: Need to backup 1920K of critical section..
mdadm: ... critical section passed.
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1024000 blocks super 0.91 level 5, 64k chunk, algorithm 2 [7/7] [UUUUUUU]
      [===>.............]  reshape = 19.4% (40256/204800) finish=0.7min speed=3659K/sec
unused devices: <none>
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.91.03
  Creation Time : Sun Aug 22 22:16:19 1999
     Raid Level : raid5
     Array Size : 1024000 (1000.17 MiB 1048.58 MB)
  Used Dev Size : 204800 (200.03 MiB 209.72 MB)
   Raid Devices : 7
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Aug 22 22:26:46 1999
          State : clean, recovering
 Active Devices : 7
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 64K
 Reshape Status : 25% complete
  Delta Devices : 1, (6->7)
           UUID : 53e6395c:1af16258:087cb2a0:b66b087f
         Events : 0.76
    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
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
       6       8      112        6      active sync   /dev/sdh
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      1228800 blocks level 5, 64k chunk, algorithm 2 [7/7] [UUUUUUU]
unused devices: <none>
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 22:16:19 1999
     Raid Level : raid5
     Array Size : 1228800 (1200.20 MiB 1258.29 MB)
  Used Dev Size : 204800 (200.03 MiB 209.72 MB)
   Raid Devices : 7
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Aug 22 22:37:11 1999
          State : clean
 Active Devices : 7
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 64K
           UUID : 53e6395c:1af16258:087cb2a0:b66b087f
         Events : 0.204
    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
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
       6       8      112        6      active sync   /dev/sdh
 

2.8 Bitmap记录
使用bitmap模式记录RAID阵列有多少个块已经同步(resync)。参数--bitmap(或者其缩写-b)指定记录bitmap信息的文件名,如果是interval参数表示bitmap记录在每个设备的元数据区。--bitmap-chunk表示每个bit位代表RAID设备多大的数据块,单位是KB;而--delay(或者其缩写-d)指定多长事件同步bitmap信息到文件或者设备上,单位是秒,默认是5秒。--force 表示覆盖掉已经存在bitmap文件。而且使用--examine-bitmap(或者其缩写-X)能够查看存储在文件或者设备元数据中的bitmap记录的信息。
当阵列创建时指定bitmap模式,如果阵列初始化中停止阵列,当再次启动阵列中,RAID阵列能够利用bitmap记录从上次中断的位置接着执行。
[root@fc5 mdadm-2.6.3]# mdadm -CR /dev/md1 -l1 -n2 /dev/sdi1 /dev/sdj1 --bitmap=internal
mdadm: array /dev/md1 started.
[root@fc5 tests]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md1 : active raid1 sdj1[1] sdi1[0]
      2096384 blocks [2/2] [UU]
      [========>......]  resync = 51.2% (1075072/2096384) finish=0.1min speed=153581K/sec
      bitmap: 128/128 pages [512KB], 8KB chunk
unused devices: <none>
[root@fc5 tests]# ./mdadm -X /dev/sdi1
        Filename : /dev/sdi1
           Magic : 6d746962
         Version : 4
            UUID : bcccddb7:0f529abd:672e1f66:7e68bbc8
          Events : 1
  Events Cleared : 1
           State : OK
       Chunksize : 8 KB
          Daemon : 5s flush period
      Write Mode : Normal
       Sync Size : 2096384 (2047.59 MiB 2146.70 MB)
          Bitmap : 262048 bits (chunks), 262048 dirty (100.0%)
[root@fc5 tests]# ./mdadm --stop /dev/md1
mdadm: stopped /dev/md1
[root@fc5 tests]# ./mdadm -A /dev/md1 /dev/sd[i-k]1 --bitmap=internal ; cat /proc/mdstat
mdadm: there is no need to specify --bitmap when assembling arrays with internal bitmaps
mdadm: /dev/md1 has been started with 2 drives and 1 spare.
Personalities : [raid6] [raid5] [raid4] [raid1]
md1 : active raid1 sdi1[0] sdk1[2](S) sdj1[1]
      1048448 blocks [2/2] [UU]
      [==============>...]  resync = 87.6% (919616/1048448) finish=0.0min speed=89408K/sec
      bitmap: 27/128 pages [108KB], 4KB chunk
unused devices: <none>
[root@fc5 tests]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md1 : active raid1 sdj1[1] sdi1[0]
      2096384 blocks [2/2] [UU]
      bitmap: 0/128 pages [0KB], 8KB chunk
[root@fc5 tests]# mdadm -X /dev/sdi1
unused devices: <none>
        Filename : /dev/sdi1
           Magic : 6d746962
         Version : 4
            UUID : bcccddb7:0f529abd:672e1f66:7e68bbc8
          Events : 4
  Events Cleared : 4
           State : OK
       Chunksize : 8 KB
          Daemon : 5s flush period
      Write Mode : Normal
       Sync Size : 2096384 (2047.59 MiB 2146.70 MB)
          Bitmap : 262048 bits (chunks), 0 dirty (0.0%)
 

使用bitmap文件记录要求这个文件不能在RAID阵列上或者其相关的设备上,而且使用assemble命令时要指定bitmap文件名字。
[root@fc5 mdadm-2.6.3]#./mdadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh 
                   --bitmap=/tmp/md0-bm --bitmap-chunk=4 --delay=1 --force
mdadm: array /dev/md0 started.
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm
Personalities : [raid6] [raid5] [raid4]
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]
      [===========>.......]  resync = 64.3% (675748/1048512) finish=0.7min speed=7848K/sec
      bitmap: 128/128 pages [512KB], 4KB chunk, file: /tmp/md0-bm
unused devices: <none>
        Filename : /tmp/md0-bm
           Magic : 6d746962
         Version : 4
            UUID : d2f46320:40f1e154:08d7a21a:4cc9a9c1
          Events : 1
  Events Cleared : 1
           State : OK
       Chunksize : 4 KB
          Daemon : 1s flush period
      Write Mode : Normal
       Sync Size : 1048512 (1024.11 MiB 1073.68 MB)
          Bitmap : 262128 bits (chunks), 262128 dirty (100.0%)
[root@fc5 mdadm-2.6.3]# ./mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@fc5 mdadm-2.6.3]# ./mdadm -A /dev/md0 /dev/sd[b-h] --bitmap=/tmp/md0-bm ; 
                  cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm
mdadm: /dev/md0 has been started with 6 drives and 1 spare.
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
      [=============>.....]  resync = 70.5% (739884/1048512) finish=0.7min speed=6539K/sec
      bitmap: 41/128 pages [164KB], 4KB chunk, file: /tmp/md0-bm
unused devices: <none>
        Filename : /tmp/md0-bm
           Magic : 6d746962
         Version : 4
            UUID : d2f46320:40f1e154:08d7a21a:4cc9a9c1
          Events : 3
  Events Cleared : 3
           State : OK
       Chunksize : 4 KB
          Daemon : 1s flush period
      Write Mode : Normal
       Sync Size : 1048512 (1024.11 MiB 1073.68 MB)
          Bitmap : 262128 bits (chunks), 83696 dirty (31.9%)
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1]
      5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU]
      bitmap: 0/128 pages [0KB], 4KB chunk, file: /tmp/md0-bm
unused devices: <none>
        Filename : /tmp/md0-bm
           Magic : 6d746962
         Version : 4
            UUID : d2f46320:40f1e154:08d7a21a:4cc9a9c1
          Events : 6
  Events Cleared : 6
           State : OK
       Chunksize : 4 KB
          Daemon : 1s flush period
      Write Mode : Normal
       Sync Size : 1048512 (1024.11 MiB 1073.68 MB)
          Bitmap : 262128 bits (chunks), 0 dirty (0.0%)

bitmap模式在阵列处于降级(degrade)状态能够记录有哪些块被写过,当那个暂时失效的磁盘使用--re-add参数被重新添加后,阵列只重构这期间修改的数据块,减少阵列重构的时间。bitmap信息中dirty的数量表示降级期间被修改过的块。
软件 RAID 使用常见问题解决
1. RAID 的子设备物理上要独立不相关
对一个磁盘上的多个磁盘分区做RAID是没有价值的,因为不但违背了RAID阵列中设备独立性的原则,不能增加阵列的可靠性,当这个磁盘失效后必然不可避免的导致数据丢失,而且还导致阵列的性能显著降低,当数据读写时磁头在磁盘的多个分区上来回抖动带来长时间的搜索耗时。
2. RAID 0 没有数据冗余功能
RAID 0 只能使用数据块条带化(stripping)功能来提高性能,如果有磁盘失效则会导致MD设备上的数据丢失,在读写MD设备时出错。
3. 快速测试命令
当创建磁盘时,如果已知设备上的数据已经是同步(sync)成功过,或者仅仅是用来测试阵列,可以使用--assume-clean参数来通知MD驱动不必初始化阵列。
 mdadm -C /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --assume-clean
            
 如果想避免mdadm每次创建命令时,因为设备上还有以前的元数据的提示,避免手工输入,可以使用--run(或者其缩写-R)通知阵列直接运行。
                mdadm --create --run /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --assume-clean
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
            
 4. 异构磁盘组成的RAID
RAID0可以支持不同大小的磁盘构造多个区域(zone)的RAID,每个区域有不同的磁盘个数。使用fdisk命令查询/dev/sdi1为2GB, /dev/sdj1为4GB,/dev/sdk1为1GB,所以做成RAID0设备为7GB。
 mdadm -C /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --assume-clean
而RAID1,RAID456, RAID10等对不同大小的磁盘只能使用最小的磁盘的容量作为公共的大小,多余的部分被浪费掉。/dev/sdi1,/dev/sdj1,/dev/sdk1做成的RAID5设备为2GB,是最小的设备/dev/sdk1的2倍,设备/dev/sdi1和sdj1分别浪费了1GB和3GB。
[root@fc5 mdadm-2.6.3]# ./mdadm –CR /dev/md1 -l0 -n3 /dev/sd[i-k]1
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md1 | grep "Array Size"
     Array Size : 7337664 (7.00 GiB 7.51 GB)
 
在阵列的状态信息查询中的大小(ArraySize)前面使用的是KB,也表示MD块设备的实际大小;而后面的两个值只是为了显示处理后的结果。
[root@fc5 mdadm-2.6.3]# ./mdadm –CR /dev/md1 -l0 -n3 /dev/sd[i-k]1
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md1 | grep "Array Size"
     Array Size : 7337664 (7.00 GiB 7.51 GB)
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md1 -l5 -n3 /dev/sd[i-k]1 
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md1 | grep "Array Size"
     Array Size : 2096896 (2048.09 MiB 2147.22 MB) 
 
 
5. 配置共享的热备盘
mdadm程序是允许多个RAID组共享冗余磁盘的。 例如有/dev/md0和/dev/md1两个阵列,在创建时/dev/md0里面有一个热备磁盘,而/dev/md1没有热备磁盘。我们只要在/etc/mdadm.conf中配置两个阵列使用相同的spare-group组。
[root@fc5 mdadm-2.6.3]# cat /etc/mdadm.conf
DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh 
       /dev/sdi1 /dev/sdj1 /dev/sdk1 
ARRAY /dev/md1 level=raid0 num-devices=3 spare-group=sparedisks
      UUID=dcff6ec9:53c4c668:58b81af9:ef71989d 
ARRAY /dev/md0 level=raid10 num-devices=6 spare-group=sparedisks 
      UUID=0cabc5e5:842d4baa:e3f6261b:a17a477a     
 
 
并运行mdadm 的监控(monitor)模式命令。当/dev/md1阵列中的一个磁盘/dev/sdi1失效时,mdadm会自动从/dev/md0组中上移走spare磁盘,并加入/dev/md1中。
[root@fc5 mdadm-2.6.3]#./mdadm --monitor  --mail=root@localhost --syslog --program=/root/md.sh
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
                     --delay=300 /dev/md* --daemonise 
8105
[root@fc5 mdadm-2.6.3]#mdadm /dev/md1 -f /dev/sdi1
mdadm: set /dev/sdi1 faulty in /dev/md1
[root@fc5 mdadm-2.6.3]#./mdadm -D /dev/md1
/dev/md1:
        Version : 00.90.03
  Creation Time : Mon Aug 23 00:10:00 1999
     Raid Level : raid5
     Array Size : 2096896 (2048.09 MiB 2147.22 MB)
  Used Dev Size : 1048448 (1024.05 MiB 1073.61 MB)
   Raid Devices : 3
  Total Devices : 4
Preferred Minor : 1
    Persistence : Superblock is persistent
    Update Time : Mon Aug 23 00:13:15 1999
          State : clean, degraded, recovering
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
         Layout : left-symmetric
     Chunk Size : 64K
 Rebuild Status : 78% complete
           UUID : 34d3de75:6912dc24:e1316607:4e72cd01
         Events : 0.4
    Number   Major   Minor   RaidDevice State
       3       8      112        0      spare rebuilding   /dev/sdh
       1       8      145        1      active sync   /dev/sdj1
       2       8      161        2      active sync   /dev/sdk1
       4       8      129        -      faulty spare   /dev/sdi1
 
 
6. 多种元数据格式
目前MD设备有两种主要的元数据格式(0.9版本和1.x版本),主要是元数据占用的空间不同和支持的底层设备个数不同,而且1.x版本还可以指定元数据写入设备的具体位置(1.0为在设备尾部,1.1为在设备开始,1.2为在设备开始的4KB位置)。创建阵列通过--metadata(或者其缩写-e)参数来指定元数据格式版本。
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1  /dev/sd[b-h] 
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
        Version : 00.90.03
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 -e1.0 /dev/sd[b-h] 
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
        Version : 01.00.03
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 -e1.1 /dev/sd[b-h] 
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
        Version : 01.01.03
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 -e1.2 /dev/sd[b-h] 
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
        Version : 01.02.03 
 
 
当阵列将磁盘移走后,也使用--zero-superblock清空设备上面的元数据信息。
[root@fc5 mdadm-2.6.3]# mdadm -Es /dev/sdh
ARRAY /dev/md0 level=raid5 num-devices=6
UUID=acd2b182:4695ee20:37689502:eb0423e1
   spares=1
[root@fc5 mdadm-2.6.3]# mdadm /dev/md0 -f  /dev/sdh -r /dev/sdh
mdadm: set /dev/sdh faulty in /dev/md0
mdadm: hot removed /dev/sdh
[root@fc5 mdadm-2.6.3]# mdadm --zero-superblock /dev/sdh
[root@fc5 mdadm-2.6.3]# mdadm -Es /dev/sdh
[root@fc5 mdadm-2.6.3]# 
 
 
7. 可分区的RAID设备
如果想对支持分区的MD设备(Partitionable raid array)进行分区,需要在创建时使用/dev/md_d0来替代前面的/dev/md0。创建阵列是通过--auto=mdp(或者其缩写-ap)参数指定。
[root@fc5 mdadm-2.6.3]# mdadm -Cv --auto=mdp /dev/md_d0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh 
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 64K
mdadm: size set to 1048512K
mdadm: array /dev/md_d0 started.
[root@fc5 mdadm-2.6.3]# fdisk /dev/md_d0
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 1310640.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1310640, default 1):1
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1310640, default 1310640): +1024M
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (250002-1310640, default 250002):250002
Using default value 250002
Last cylinder or +size or +sizeM or +sizeK (250002-1310640, default 1310640):1310640
Using default value 1310640
Command (m for help): w 
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@fc5 mdadm-2.6.3]# fdisk -l /dev/md_d0
Disk /dev/md_d0: 5368 MB, 5368381440 bytes
2 heads, 4 sectors/track, 1310640 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
      Device Boot      Start         End      Blocks   Id  System
/dev/md_d0p1               1      250001     1000002   83  Linux
/dev/md_d0p2          250002     1310640     4242556   83  Linux
 
 
MD设备支持两种块设备,一种是不可分区类型的名字是md设备,主设备号是9,另一种是可分区的名字是mdp设备,mdp的主设备号是动态分配的,一个mdp设备最多能支持63个分区。查看/proc/device信息能看到mdp的主设备号,查询/proc/partitions信息能看到md和mdp设备的主设备号和从设备号。
[root@fc5 mdadm-2.6.3]# cat /proc/devices | grep md
1 ramdisk
9 md
253 mdp 
[root@fc5 mdadm-2.6.3]# cat /proc/partitions | grep md
   9     1    2096896 md1
 253     0    5242560 md_d0
 253     1    1000002 md_d0p1
 253     2    1000002 md_d0p2
 
 
8. 怎样扩展RAID设备
Grow模式中的容量扩展(resize)功能不但支持设备大小增加,也可以支持设备大小减少,但要求使用者自己来保证MD设备有效数据上不被截断导致丢失。
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --grow --size=102400
[root@fc5 mdadm-2.6.3]# ./mdadm -Q /dev/md0
/dev/md0: 600.00MiB raid5 7 devices, 0 spares. Use mdadm --detail for more detail.
而磁盘个数扩展(reshape)功能不支持设备个数减少,如果在阵列中空闲的热备盘而且也没有指定backup文件,则不能扩展。如果对于RAID5阵列有备份(backup)文件可以支持扩展一个磁盘,扩展后的磁盘阵列是降级模式的,不支持扩展多个磁盘或者对降级的RAID5阵列再扩展。这些扩展模式不够安全,仅仅是暂时没有热备盘的权宜之计,一般合理的操作还是先增加空闲的热备磁盘再执行扩展命令。
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 -n6
mdadm: /dev/md0: Cannot reduce number of data disks (yet).
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 -n8
mdadm: Need to backup 2688K of critical section.
mdadm: /dev/md0: Cannot grow - need a spare or backup-file to backup critical section
[root@fc5 mdadm-2.6.3]# ./mdadm -G /dev/md0 -n9 --backup-file=/root/bak-reshape
mdadm: Need to backup 1024K of critical section..
mdadm: /dev/md0: failed to initiate reshape
 
[root@fc5 mdadm-2.6.3]# ./mdadm -G /dev/md0 -n8 --backup-file=/root/bak-reshape
mdadm: Need to backup 2688K of critical section..
mdadm: ... critical section passed.
[root@fc5 mdadm-2.6.3]#  cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      6291072 blocks super 0.91 level 5, 64k chunk, algorithm 2 [8/7] [UUUUUUU_]
      [>..................]  reshape =  2.6% (28608/1048512) finish=4.1min speed=4086K/sec
md1 : active raid0 sdk1[2] sdj1[1] sdi1[0]
      7337664 blocks 64k chunks
unused devices: < none >
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.91.03
  Creation Time : Sun Aug 22 23:46:29 1999
     Raid Level : raid5
     Array Size : 6291072 (6.00 GiB 6.44 GB)
  Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
   Raid Devices : 8
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Aug 22 23:46:56 1999
          State : clean, degraded, recovering
 Active Devices : 7
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 64K
 Reshape Status : 4% complete
  Delta Devices : 1, (7->8)
           UUID : 50e886b9:9e28d243:a7f6457d:5eb47f2e
         Events : 0.94
    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
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
       6       8      112        6      active sync   /dev/sdh
       7       0        0        7      removed
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat
Personalities : [raid0] [raid10] [raid6] [raid5] [raid4]
md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0]
      7339584 blocks level 5, 64k chunk, algorithm 2 [8/7] [UUUUUUU_]
md1 : active raid0 sdk1[2] sdj1[1] sdi1[0]
      7337664 blocks 64k chunks
unused devices: < none >
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Sun Aug 22 23:46:29 1999
     Raid Level : raid5
     Array Size : 7339584 (7.00 GiB 7.52 GB)
  Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
   Raid Devices : 8
  Total Devices : 7
Preferred Minor : 0
    Persistence : Superblock is persistent
    Update Time : Sun Aug 22 23:50:18 1999
          State : clean, degraded
 Active Devices : 7
Working Devices : 7
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 64K
           UUID : 50e886b9:9e28d243:a7f6457d:5eb47f2e
         Events : 0.766
    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
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       5       8       96        5      active sync   /dev/sdg
       6       8      112        6      active sync   /dev/sdh
       7       0        0        7      removed
[root@fc5 mdadm-2.6.3]# ./mdadm -G /dev/md0 -n9 --backup-file=/root/bak-reshape
mdadm: Need to backup 3584K of critical section..
mdadm: /dev/md0: failed to find device 7. Array might be degraded.
 --grow aborted 
 
9. 为什么不能扩展RAID设备
当使用grow模式时,如果内核不支持sysfs或者MD驱动版本较低不支持时则会返回错误。另外使用strace命令跟踪能导致在哪个函数调用上出错返回。
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 -n6
mdadm: Need to backup 1280K of critical section..
mdadm: /dev/md0: Cannot get array details from sysfs
 如果系统没有加载sysfs,需要使用mount命令加载。
 mount –t sysfs sysfs /sys/
           
10. 为什么不能停止MD设备
当停止MD阵列时,有时被返回MD设备正在被使用错误,需要检查MD设备被哪个上层设备使用。一个情况是被文件系统使用,如已经被mount起来:
[root@fc5 mdadm-2.6.3]# df -h | grep md
/dev/md0              485M   11M  449M   3% /mnt/md-test

另一种情况是MD设备被用户层其他程序打开使用,如nbd-server导出MD设备:
[root@fc5 md0]#fuser -u /dev/md0
/dev/md0:             3507(root)
[root@fc5 md0]#ps ax| grep 3507 
 3507 ?

还有可能是内核驱动程序打开使用,如被LVM程序当作物理卷(PV)使用:
[root@fc5 mdadm-2.6.3]# ls -l /sys/block/md0/holders/
total 0
lrwxrwxrwx 1 root root 0 08-22 23:31 dm-0 -> ../../../block/dm-0
 

1.Soft Raid是否一定需要mdadm.conf的配置文件才能启动(也就是重启后怎么自动启动Raid)
答案是,不一定.
如下rc.sysinit,是redhat和Centos的系统,如果有mdadm.conf才能启动raid.
if [ -f /etc/mdadm.conf ]; then
    /sbin/mdadm -A -s
fi
但是,你可以没有配置文件,在启动后,用下面的方法启动
#mdadm -A /dev/md0 /dev/sd[bcde]
另外,如果你的Soft Raid是在系统安装时建的,那么没有mdadm.conf也能启动raid.为什么啦,看日志
kernel: md: Autodetecting RAID arrays.
在内核的编译中有这么一句"Autodetect RAID arrays during kernel boot",所以会自动的加载.所以重起系统后raid都需要有配置文件.或者磁盘的分区类型为fd.也就是Linux raid auto.

2.Soft Raid的本身的信息是记录在什么地方?
这个是建立在Raid的成员中,每个硬盘有一个叫超级块(zero-superblock )的东西.记录在这个上面.所以如果给raid成员恢复成普通硬盘时,记的删除zero-superblock.
所以删除RAID中的硬盘的方法如下
#mdadm –stop /dev/md0
#mdadm –remove /dev/md0
# mdadm --zero-superblock /dev/sda
3.重装系统后,raid是否还能使用?
答案一样是不一定
当你给系统也做进来,当然那个有系统的不行,但你只做数据分区,基本都是没有问题的.只要你重装系统后,使用原来的启动命令(配置文件也行),来启动就可以了.
#mdadm -A /dev/md0 /dev/sd[bcde]
#mdadm -As /dev/md0     (有配置文件时)
4.软Raid中,分区表中的分区类型是否一定要修改成Linux raid auto?
答案一样是不一定
在安装系统时选择raid时,一定要转成raid的分区类型,但如果安装完系统后自己使用命令来建,就不用.但最好是.
5.是否一定要分区,才能建Soft Raid?
答案一样是不一定
和上面一样,分为安装系统时建soft raid,和安装后在建raid.在安装系统时,一定是在分区上建的,但安装完系统后手工建的raid,没有分区也行.但最好分一下修改成linux raid auto,这样可以不需要配置文件也能启动
6.在没有同步完(rebuilding)成前是否能重起
在同步rebuilding的过程中,重起是没有问题的,有bitmap记录的,重起完,会从上次同步的地方起开始同步。否则重新开始rebuilding。
 
mdadm各个选项

命令概要: mdadm [模式选项] [RAID设备名] [子选项…] [组件设备名…]

模式选项

子选项

备注

无特定模式

–verbose

显示更详细的信息

用于 –detail –scan 或者 –examine –scan

–force

某些选项强制执行

–config=

指定配置文件,默认是”/etc/mdadm.conf”或者是”/etc/mdadm/mdadm.conf”,假如配置文件名是 “partitions”,则mdadm会读取/proc/partitions的设备用于scan。

假如配置文件名是”none”,则mdadm会认为配置文件是空的。

–scan

从配置文件或者/proc/mdstat中扫描信息。

–metadata=

定义组件设备上超级块的类型。对于–create,默认是0.90。

0,0.90 : 限制一个RAID中的设备数为28个,限制组件设备大小为2TB

1,1.0,1.1,1.2 :不同的子版本号标识在不同的地方存储超级块。1.0在设备的结尾,1.1在设备的开头,1.2在设备的4K处。

–homehost=

在创建一个RAID时,homehost名会记录在超级块中。在1.X超级块中,它是RAID名字的前缀。0.90超级块中,homehost名的的SHA1值会保存在UUID的后半部分。

当使用Auto-Assemble时,只有相同homehost名的RAID才会被组建。

–create

–build

–grow

–raid-devices=

指定一个RAID中active devices的数目。

–spare-devices=

指定创建一个RAID时spare devices中的数目。

–size=

在RAID1/4/5/6中每个设备所能利用的数据容量。这个值必须是 chunk size的整数倍。而且必须留128K的设备空间用于RAID超级块。假如没有指定,则默认使用最小设备空间。

该选项能用–grow 进行扩容。

–chunk=

条带大小

–rounding=

在linear array中的rounding factor,等于条带大小

–level

设置RAID级别,RAID级别有(有些是同义词,比如raid5和5):

Linear,raid0,0,stripe,raid1,1,mirror,raid4,4,raid5,5,raid6,6,raid10,10,multipath,mp,faulty。

–build只支持linear,stripe,raid0,0,raid1,multipath,mp,faulty。

–grow不支持改变RAID级别。

–layout=

(–parity=)

设置RAID5、RAID10数据布局类型,控制faulty级别的failure的模式。

--bitmap=

这个选项对性能可能有影响,具体查看《mdadm手册翻译》

设置一个文件用于保存write-intent位图。

当文件名是”internal”时,位图复制保存在RAID组件设备(一个RAID的所有组件设备)的超级块中。当–grow,文件名是”none”时,位图会被移除。

–bitmap-chunk=

这个选项对性能可能有影响,具体查看《mdadm手册翻译》

设置位图中每位所映射块的大小。

当使用”internal”位图时,映射块的大小是自动设置的(根据超级块中可用空间)。

–write-mostly

–build、–create、–add后的设备都被标记上”wirte-mostly”。这个选项只对RAID1有效,即”md”driver会避免从RAID1的所有设备读取数据。假如镜像的速度很慢,这是非常有用的。

–write-behind=

该选项只对RAID1有效。这个选项会设置最大的写队列深度,默认值是256。使用write-behind的前提是先设置write-intent bitmap,先设置设备为write-mostly。

–assume-clean

告诉mdadm这个array已经clean。当array从一个严重的故障中恢复时,这个选项会保证没有数据会被覆盖。当创建RAID1和RAID10时,这个选项也能避免初始化同步。但是使用该选项必须要很谨慎。

–backup-file=

当使–grow为RAID5增加组件设备数时,该文件保存关键数据。(该文件不能在该RAID5上,以免发生死锁。)

–name

给一个RAID设置名字,只在1.X超级块中有用,它是简单的字符串,用于assembling时识别RAID组件设备。

–run

强制激活RAID。(当一个RAID中的某些组件设备被其他RAID或者文件系统占用时)。使用这个选项,设备上有旧的元数据信息的提示会被忽略。

–force

mdadm无条件接受指定的参数。

使用该选项可以只使用一个设备创建RAID;

创建RAID5时使用该选项,使得RAID5初始化不使用recovery模式,而是校验同步所有组件设备上的数据(比recovery模式要慢)。详情请见命令举例中的创建RAID

–auto=

创建md设备文件。选项是{no,yes,md,mdp,part,p}{NN}。默认是yes。

“yes”要求RAID设备名是标准格式的,然后设备文件类型和minor号会自动确定。

比如RAID设备名是”/dev/mdx” 查看/proc/partitions可以看到mdx的major号是9,minor号是x。

当使用”md”时,RAID设备名可以是非标准格式,比如”/dev/md/zhu”,然后创建两个设备文件/dev/md/zhu 还有 /dev/mdx,并给这两个设备文件分配相同的major号和minor号(也就是这两个设备文件指向同一个设备)。分配minor号的方法是:分配一个没有使用过的minor号,这个minor号就是/dev/mdx中的数字x。查看/proc/partitions和/proc/mdstat,RAID设备名还是/dev/mdx。

当使用”mdp,p,part”时,RAID设备名可以是非标准格式,比如”/dev/md/zhu”,除了创建设备文件/dev/md/zhu 还有 /dev/mdx外,还会创建 /dev/md/zhup1, /dev/md/zhup2, /dev/md/zhup3, /dev/md/zhup4,这些是分区设备文件。

–symlink=no

默认下–auto会创建/dev/md/zhu的软连接 /dev/md_zhu。假如使用该选项,则不会创建软连接。

–assemble

–uuid=

重组RAID,要求组件设备的uuid相同

–super-minor=

minor号会保存在每个组件设备中的超级块中,可以根据这个重组RAID。

–name=

根据RAID名重组RAID。

–force

即使一些超级块上的信息过时了,也可以强制重组。

–run

即使RAID中的组件设备不完整(例如原来创建4块盘的RAID5,现在只发现3块成员盘),RAID也被重组,并启动。

(假如不用–run,RAID只被重组,但是不启动)

–no-degraded

和–scan选项一起使用。

禁止RAID中的组件设备不完整时启动RAID,知道RAID中的组件完整。

–auto

如–create中的 –auto

–bitmap

指定bitmap文件(当RAID创建时所指定的bitmap文件),假如RAID使用internal类型的bitmap,则不需指定。

–backup-file=

当增加RAID5的组件设备数,指定backup-file文件。在RAID5重构过程中,假如系统当机,backup-file文件会保存关键数据,使得重启系统之后,重构可以继续进行。假如没有指定backup-file,mdadm会使用热备盘上的空间作为备份空间。

–update=

更新RAID中每个组件设备的超级块信息。选项有sparc2.2、summaries、uuid、name、homehost、resync、byteorder、super-minor

–auto-update-homehost

只对auto assembly情况下有用。

Manage模式

–add

给RAID在线添加设备(可用于添加热备盘)

–re-add

给RAID重新添加一个以前被移除的设备。

假如一个RAID使用write-intent bitmap时,它的一个设备被移除后又被重新添加,bitmap可以避免完全重建,而是只更新那些设备被移除后已经被更新过的块数据。

–reomve

移除设备,只能移除failed(失效)和spare(热备)设备。(因此假如要移除RAID5中的一个活动设备,需要先使用–fail选项使该设备的状态变成failed,然后才能移除。)

该选项后面跟的是设备名(比如是 /dev/sdc),也可以是faileddetached关键字。Failed使得所以失效的部件被移除,detached使得所以被拔出的硬盘被移除。

–fail

使RAID中某个设备变成failed状态。

该选项后面跟的是设备名(比如是 /dev/sdc),也可以是detached关键字。

Misc模式

–query

查询一个RAID或者一个RAID组件设备的信息

–detail

查询一个RAID的详细信息

–examine

查询组件设备上的超级块信息

–sparc2.2

用于修正超级块信息,详情请见用户手册。

–examnie-bitmap

查看bitmap文件中的信息

–run

启动不完整的RAID(比如本来是有4块盘的RAID5,现在3块盘也可以启动)。

–stop

禁止RAID活动,释放所有资源。但是RAID中组件设备上的超级块信息还在。还可以重新组建和激活RAID。

–readonly

使RAID只能只读

–readwrite

使RAID能读写

–zero-superblock

假如一个组件设备包含有效的超级块信息,那么这个超级块会被写0覆盖。假如使–force选项,则不管超级块中是否有信息,都会被写0覆盖。

–test

假如–detail一起使用,则mdadm的返回值是RAID的状态值。

0 代表正常

1 代表降级,即至少有一块成员盘失效

2 代表有多快成员盘失效,整个RAID也失效了(对于RAID1/5/6/10都适用)。

4 读取raid信息失败

–monitor

(–follow)

–mail

设置警报邮件

–program

当监测到一个事件发生时,关于该事件的信息会作为参数被发给该程序

–syslog

所有事件都会通过syslog报告

–delay

Mdadm会隔多少秒轮询各个RAID,默认是60秒

–daemonise

Mdadm会创建一个子进行作为后台监控程序。该子进程的PID号会输入到stdout上。

–pid-file

当–daemonise一起使用时,子进程的PID号会写入该文件中

–oneshot

只会检测RAID一次。它会检测NewArray、DegradedArray、SparesMissing事件。

在cron脚本中运行”mdadm –monitor –scan –oneshot”会定期报告。

–test

对每个RAID产生TestMessage,用于测试mail、program是否正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值