Linux下使用mdadm创建和管理软raid 注:本次操作以RHEL4为例,但应该可以应用到其它大部分的distro上(guess)。
Y9qLinux联盟mdadm的几个常用参数
- -C 创建Raid,后面跟参数,代表raid设备的名称。比如:/dev/md0,/dev/md1。
- -n 用于创建磁盘阵列的磁盘个数。
- -l Raid的级别。
- -x 指定用于hotspare(热备盘)的磁盘个数。如果阵列中有一块硬盘坏了,它会立刻顶上,并rebuild;
- -D 显示软raid的详细信息;
- -s 扫描配置文件(/etc/mdadm.conf)或'/proc/mdstat'来查看遗漏的信息f;
创建软raid的大体流程
- 使用fdisk工具为新磁盘创建分区;
- 使用mkfs.XXXX工具将刚才划分好的分区格式化成某种格式的文件系统。比如:ext3,reiserfs等;
- 使用mdadm来创建软raid;
- 创建/etc/mdadm.conf文件(注意文件的格式,包括是否有逗号等等。该文件是为了系统在重启后能够自动启用软raid。可以查看/etc/rc.sysinit脚本,搜索'mdadm'字符串就明白了);
示例:创建软raid5(+hotspare)以下是我的一次实际操作的完整过程:
Y9qLinux联盟- 这是用'fdisk -l'命令查看到的我当前的磁盘和分区情况(只有/dev/sda在使用,其它四个都是新磁盘,没有分区,没有格式化):
# fdisk -l
Y9qLinux联盟Y9qLinux联盟Disk /dev/sda: 6442 MB, 6442450944 bytes
Y9qLinux联盟255 heads, 63 sectors/track, 783 cylinders
Y9qLinux联盟Units = cylinders of 16065 * 512 = 8225280 bytes
Y9qLinux联盟Y9qLinux联盟 Device Boot Start End Blocks Id System
Y9qLinux联盟/dev/sda1 * 1 720 5783368+ 83 Linux
Y9qLinux联盟/dev/sda2 721 783 506047+ 82 Linux swap
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdb: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdb doesn't contain a valid partition table
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdc: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdc doesn't contain a valid partition table
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdd: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdd doesn't contain a valid partition table
Y9qLinux联盟Y9qLinux联盟Disk /dev/sde: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟Disk /dev/sde doesn't contain a valid partition table
Y9qLinux联盟- 使用fdisk创建分区(本例中将整块磁盘划分为一个主分区。其余几块磁盘也做相同的操作。):
#
fdisk /dev/sdbY9qLinux联盟Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Y9qLinux联盟Building a new DOS disklabel. Changes will remain in memory only,
Y9qLinux联盟until you decide to write them. After that, of course, the previous
Y9qLinux联盟content won't be recoverable.
Y9qLinux联盟Y9qLinux联盟Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Y9qLinux联盟Y9qLinux联盟Command (m for help):
nY9qLinux联盟Command action
Y9qLinux联盟 e extended
Y9qLinux联盟 p primary partition (1-4)
Y9qLinux联盟pY9qLinux联盟Partition number (1-4):
1Y9qLinux联盟First cylinder (1-204, default 1):
Y9qLinux联盟Using default value 1
Y9qLinux联盟Last cylinder or +size or +sizeM or +sizeK (1-204, default 204):
Y9qLinux联盟Using default value 204
Y9qLinux联盟Y9qLinux联盟Command (m for help):
wY9qLinux联盟The partition table has been altered!
Y9qLinux联盟Y9qLinux联盟Calling ioctl() to re-read partition table.
Y9qLinux联盟Syncing disks.
Y9qLinux联盟- 为刚才新建的分区建立文件系统(其余几个分区依次做相同的操作):
# mkfs.ext3 /dev/sdb1
Y9qLinux联盟mke2fs 1.35 (28-Feb-2004)
Y9qLinux联盟Filesystem label=
Y9qLinux联盟OS type: Linux
Y9qLinux联盟Block size=1024 (log=0)
Y9qLinux联盟Fragment size=1024 (log=0)
Y9qLinux联盟52416 inodes, 208880 blocks
Y9qLinux联盟10444 blocks (5.00%) reserved for the super user
Y9qLinux联盟First data block=1
Y9qLinux联盟Maximum filesystem blocks=67371008
Y9qLinux联盟26 block groups
Y9qLinux联盟8192 blocks per group, 8192 fragments per group
Y9qLinux联盟2016 inodes per group
Y9qLinux联盟Superblock backups stored on blocks:
Y9qLinux联盟 8193, 24577, 40961, 57345, 73729, 204801
Y9qLinux联盟Y9qLinux联盟Writing inode tables: done
Y9qLinux联盟Creating journal (4096 blocks): done
Y9qLinux联盟Writing superblocks and filesystem accounting information: done
Y9qLinux联盟Y9qLinux联盟This filesystem will be automatically checked every 37 mounts or
Y9qLinux联盟180 days, whichever comes first. Use tune2fs -c or -i to override.
Y9qLinux联盟所有磁盘都操作完后,再次用'fdisk -l'查看磁盘及分区状态:
Y9qLinux联盟# fdisk -l
Y9qLinux联盟Y9qLinux联盟Disk /dev/sda: 6442 MB, 6442450944 bytes
Y9qLinux联盟255 heads, 63 sectors/track, 783 cylinders
Y9qLinux联盟Units = cylinders of 16065 * 512 = 8225280 bytes
Y9qLinux联盟Y9qLinux联盟 Device Boot Start End Blocks Id System
Y9qLinux联盟/dev/sda1 * 1 720 5783368+ 83 Linux
Y9qLinux联盟/dev/sda2 721 783 506047+ 82 Linux swap
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdb: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟 Device Boot Start End Blocks Id System
Y9qLinux联盟/dev/sdb1 1 204 208880 83 Linux
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdc: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟 Device Boot Start End Blocks Id System
Y9qLinux联盟/dev/sdc1 1 204 208880 83 Linux
Y9qLinux联盟Y9qLinux联盟Disk /dev/sdd: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟 Device Boot Start End Blocks Id System
Y9qLinux联盟/dev/sdd1 1 204 208880 83 Linux
Y9qLinux联盟Y9qLinux联盟Disk /dev/sde: 214 MB, 214748160 bytes
Y9qLinux联盟64 heads, 32 sectors/track, 204 cylinders
Y9qLinux联盟Units = cylinders of 2048 * 512 = 1048576 bytes
Y9qLinux联盟Y9qLinux联盟 Device Boot Start End Blocks Id System
Y9qLinux联盟/dev/sde1 1 204 208880 83 Linux
Y9qLinux联盟- 使用mdadm创建一个软raid,raid级别:5;并有一个hotspare盘:
# mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd[b-e]1
Y9qLinux联盟mdadm: array /dev/md0 started.
Y9qLinux联盟输出信息显示软raid(/dev/md0)已经启用了。使用mdadm的-D参数(--detail)可以查看软raid状态:
Y9qLinux联盟# mdadm -D /dev/md0
Y9qLinux联盟/dev/md0:
Y9qLinux联盟 Version : 00.90.01
Y9qLinux联盟 Creation Time : Wed Aug 23 15:10:19 2006
Y9qLinux联盟 Raid Level : raid5
Y9qLinux联盟 Array Size : 417536 (407.75 MiB 427.56 MB)
Y9qLinux联盟 Device Size : 208768 (203.88 MiB 213.78 MB)
Y9qLinux联盟 Raid Devices : 3
Y9qLinux联盟 Total Devices : 4
Y9qLinux联盟Preferred Minor : 0
Y9qLinux联盟 Persistence : Superblock is persistent
Y9qLinux联盟Y9qLinux联盟 Update Time : Wed Aug 23 15:10:21 2006
Y9qLinux联盟 State : clean
Y9qLinux联盟Active Devices : 3
Y9qLinux联盟Working Devices : 4
Y9qLinux联盟Failed Devices : 0
Y9qLinux联盟 Spare Devices : 1
Y9qLinux联盟Y9qLinux联盟 Layout : left-symmetric
Y9qLinux联盟 Chunk Size : 64K
Y9qLinux联盟Y9qLinux联盟 Number Major Minor RaidDevice State
Y9qLinux联盟 0 8 17 0 active sync /dev/sdb1
Y9qLinux联盟 1 8 33 1 active sync /dev/sdc1
Y9qLinux联盟 2 8 49 2 active sync /dev/sdd1
Y9qLinux联盟 3 8 65 -1 spare /dev/sde1
Y9qLinux联盟 UUID : f8283de5:39c73d89:b9fbc266:fdceb416
Y9qLinux联盟 Events : 0.2
Y9qLinux联盟
# mdadm -D -s >/etc/mdadm.conf
Y9qLinux联盟查看一下:
Y9qLinux联盟# cat /etc/mdadm.conf
Y9qLinux联盟ARRAY /dev/md0 level=raid5 num-devices=3 UUID=f8283de5:39c73d89:b9fbc266:fdceb416
Y9qLinux联盟 devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1
Y9qLinux联盟修改(把上面devices=后面的磁盘,都放到DEVICE后面,并且不要逗号。而/dev/md0之后的内容,都要用逗号来分隔):
Y9qLinux联盟DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
Y9qLinux联盟ARRAY /dev/md0 level=raid5,num-devices=3,UUID=f8283de5:39c73d89:b9fbc266:fdceb416
Y9qLinux联盟重启一下,检测配置好的软raid是否能够在系统重启后自动启用。
Y9qLinux联盟重启后,查看'/proc/mdstat'文件就可以看到软raid的状态:
Y9qLinux联盟# cat /proc/mdstat
Y9qLinux联盟Personalities : [raid5]
Y9qLinux联盟md0 : active raid5 sdb1[0] sde1[3] sdd1[2] sdc1[1]
Y9qLinux联盟 417536 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
Y9qLinux联盟Y9qLinux联盟unused devices: <none>
Y9qLinux联盟That's all.
Y9qLinux联盟出现故障后的恢复这里指的出现故障,是指raid中的一块磁盘出现了故障,无法使用。这时候需要使用额外的磁盘来代替它。这里以强制将某块磁盘标记为已损坏,来模拟实际出现故障(注:新的磁盘的容量最好和已损坏的磁盘一致):
Y9qLinux联盟将/dev/sdb1标记为已损坏:
Y9qLinux联盟# mdadm /dev/md0 -f /dev/sdb1
Y9qLinux联盟mdadm: set /dev/sdb1 faulty in /dev/md0
Y9qLinux联盟这时候使用mdadm的-D参数来查看状态,可以看到/dev/sdb1已经被认为是faulty,而hotspare(热备)盘'/dev/sde1'已经顶替了它的位置(这就是hotspare的作用):
Y9qLinux联盟# mdadm -D /dev/md0
Y9qLinux联盟/dev/md0:
Y9qLinux联盟 Version : 00.90.01
Y9qLinux联盟 Creation Time : Wed Aug 23 15:10:19 2006
Y9qLinux联盟 Raid Level : raid5
Y9qLinux联盟 Array Size : 417536 (407.75 MiB 427.56 MB)
Y9qLinux联盟 Device Size : 208768 (203.88 MiB 213.78 MB)
Y9qLinux联盟 Raid Devices : 3
Y9qLinux联盟 Total Devices : 4
Y9qLinux联盟Preferred Minor : 0
Y9qLinux联盟 Persistence : Superblock is persistent
Y9qLinux联盟Y9qLinux联盟 Update Time : Wed Aug 23 15:42:24 2006
Y9qLinux联盟 State : clean
Y9qLinux联盟Active Devices : 3
Y9qLinux联盟Working Devices : 3
Y9qLinux联盟Failed Devices : 1
Y9qLinux联盟 Spare Devices : 0
Y9qLinux联盟Y9qLinux联盟 Layout : left-symmetric
Y9qLinux联盟 Chunk Size : 64K
Y9qLinux联盟Y9qLinux联盟 Number Major Minor RaidDevice State
Y9qLinux联盟 0 8 65 0 active sync /dev/sde1
Y9qLinux联盟 1 8 33 1 active sync /dev/sdc1
Y9qLinux联盟 2 8 49 2 active sync /dev/sdd1
Y9qLinux联盟 3 8 17 -1 faulty /dev/sdb1
Y9qLinux联盟 UUID : f8283de5:39c73d89:b9fbc266:fdceb416
Y9qLinux联盟 Events : 0.4
Y9qLinux联盟既然'/dev/sdb1'出现了故障,当然就要将它移除:
Y9qLinux联盟# mdadm /dev/md0 -r /dev/sdb1
Y9qLinux联盟mdadm: hot removed /dev/sdb1
Y9qLinux联盟现在可以关机了。关机之后拔下这块已损坏的磁盘了,换上你的新磁盘。换好之后,分区,mkfs.XXXX。然后将它加入到软raid中:
Y9qLinux联盟# mdadm /dev/md0 -a /dev/sdb1
Y9qLinux联盟mdadm: hot added /dev/sdb1
Y9qLinux联盟这时候再使用mdadm的'-D'参数,可以看到sdb1已经作为hotspare盘了:
Y9qLinux联盟# mdadm -D /dev/md0
Y9qLinux联盟/dev/md0:
Y9qLinux联盟 Version : 00.90.01
Y9qLinux联盟 Creation Time : Wed Aug 23 15:10:19 2006
Y9qLinux联盟 Raid Level : raid5
Y9qLinux联盟 Array Size : 417536 (407.75 MiB 427.56 MB)
Y9qLinux联盟 Device Size : 208768 (203.88 MiB 213.78 MB)
Y9qLinux联盟 Raid Devices : 3
Y9qLinux联盟 Total Devices : 4
Y9qLinux联盟Preferred Minor : 0
Y9qLinux联盟 Persistence : Superblock is persistent
Y9qLinux联盟Y9qLinux联盟 Update Time : Wed Aug 23 16:19:36 2006
Y9qLinux联盟 State : clean
Y9qLinux联盟Active Devices : 3
Y9qLinux联盟Working Devices : 4
Y9qLinux联盟Failed Devices : 0
Y9qLinux联盟 Spare Devices : 1
Y9qLinux联盟Y9qLinux联盟 Layout : left-symmetric
Y9qLinux联盟 Chunk Size : 64K
Y9qLinux联盟Y9qLinux联盟 Number Major Minor RaidDevice State
Y9qLinux联盟 0 8 65 0 active sync /dev/sde1
Y9qLinux联盟 1 8 33 1 active sync /dev/sdc1
Y9qLinux联盟 2 8 49 2 active sync /dev/sdd1
Y9qLinux联盟 3 8 17 -1 spare /dev/sdb1
Y9qLinux联盟 UUID : f8283de5:39c73d89:b9fbc266:fdceb416
Y9qLinux联盟 Events : 0.6
Y9qLinux联盟misc
- 假如创建了RAID,但是没有生成 /etc/mdadm.conf 文件,那么系统重启后是不会启用RAID的,这时候需要这样做:
# mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1