低版本的linux中是使用RAIDtools工具来管理软件RAID,因为RAIDtools要手工编辑配置文件,所以使用起来很不方便。目前各种较新的linux版本中管理软件RAID已不再使用RAIDtools工具,而改用mdadm工具。mdadm工具功能强大,用命令行就可以完成配置软RAID的大部分工作。下面以使用mdadm工具配置RAID5为例来进行演示。
1.使用mdadm工具配置RAID5
在实验用计算机安装5块大小均为15G的SCSI磁盘,其中一块磁盘安装linux操作系统,利用剩下的4块盘做一个有一个备用盘的RAID5.因为RAID5要求加入RAID的分区大小相同,所以从这4块磁盘上各分出10GB空间的分区来加入RAID,每个磁盘剩余6GB空间可以另作用。当然实际应用中我们经常会把整个磁盘格式化为一个分区俩加入RAID,具体采用什么方式则要根据需要而定。 我们来看下例的命令操作、讲解及结果:
①由于我是在vmware workstation 9.0上演示的。linux操作系统:asianux 3.0 sp4 硬盘4个15G的SCSI接口的。
②在每个磁盘上新建分区
在设备/dev/sdb上新建一个大小为10gb的分区并将其标识为raid类型:
- [root@db8 ~]# fdisk /dev/sdb
- The number of cylinders for this disk is set to 1958.
- 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)
- Command (m for help): d
- Selected partition 1
- Command (m for help): p
- Disk /dev/sdb: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- Command (m for help): d^H^H^H
- No partition is defined yet!
- Command (m for help): n
- Command action
- e extended
- p primary partition (1-4)
- p
- Partition number (1-4): 1
- First cylinder (1-1958, default 1):
- Using default value 1
- Last cylinder or +size or +sizeM or +sizeK (1-1958, default 1958): +10240M
- Command (m for help): p
- Disk /dev/sdb: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sdb1 1 1246 10008463+ 83 Linux
- 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): p
- Disk /dev/sdb: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sdb1 1 1246 10008463+ 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@db8 ~]# partprobe
对设备/dev/sdc、/dev/sdd和/dev/sde做同样的分区操作(具体步骤已经省略)
- [root@db8 ~]# fdisk /dev/sdc
- [root@db8 ~]# fdisk /dev/sdd
- [root@db8 ~]# fdisk /dev/sde
- [root@db8 ~]# partprobe
- [root@db8 ~]# fdisk -l
- Disk /dev/sda: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 * 1 25 200781 83 Linux
- /dev/sda2 26 280 2048287+ 82 Linux swap / Solaris
- /dev/sda3 281 1958 13478535 83 Linux
- Disk /dev/sdb: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sdb1 1 1246 10008463+ fd Linux raid autodetect
- Disk /dev/sdc: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sdc1 1 1246 10008463+ fd Linux raid autodetect
- Disk /dev/sdd: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sdd1 1 1246 10008463+ fd Linux raid autodetect
- Disk /dev/sde: 16.1 GB, 16106127360 bytes
- 255 heads, 63 sectors/track, 1958 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sde1 1 1246 10008463+ fd Linux raid autodetect
③使用mdadm工具将多个新建分区组成RAID5
使用mdadm创建RAID5,其中,选项-C表示创建RAID,选项-l5表示建立RAID为级别5,选项-n3表示参与构建RAID5的工作分区有3个,选项为-x1则表示另有一个磁盘分区做为备份分区,当三个工作分区的其中一个出错时,备用分区可以代替损坏的分区以保证数据及时恢复和系统继续可用。
- [root@db8 ~]# mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd[b-e]1
- mdadm: another array by this name is already running.
RAID建立后,使用以下命令查看RAID的基本信息:
- [root@db8 ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 0.90
- Creation Time : Fri Oct 5 10:22:16 2012
- Raid Level : raid5
- Array Size : 20016768 (19.09 GiB 20.50 GB)
- Used Dev Size : 10008384 (9.54 GiB 10.25 GB)
- Raid Devices : 3
- Total Devices : 4
- Preferred Minor : 0
- Persistence : Superblock is persistent
- Update Time : Fri Oct 5 11:05:36 2012
- State : clean
- Active Devices : 3
- Working Devices : 4
- Failed Devices : 0
- Spare Devices : 1
- Layout : left-symmetric
- Chunk Size : 64K
- UUID : c35752f4:2dcfbbd3:5c82bbfc:ac099425
- Events : 0.12
- Number Major Minor RaidDevice State
- 0 8 65 0 active sync /dev/sde1
- 1 8 17 1 active sync /dev/sdb1
- 2 8 49 2 active sync /dev/sdd1
- 3 8 33 - spare /dev/sdc1
使用下面的命令查看当前系统正在使用的RAID设备的相关信息:
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde1[0] sdd1[2] sdc1[3](S) sdb1[1]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
- unused devices:
④格式化RAID5并挂载使用
在使用RAID之前,还需要先将其格式化:
- [root@db8 ~]# mkfs.ext3 /dev/md0
- mke2fs 1.39 (29-May-2006)
- Filesystem label=
- OS type: Linux
- Block size=4096 (log=2)
- Fragment size=4096 (log=2)
- 2506752 inodes, 5004192 blocks
- 250209 blocks (5.00%) reserved for the super user
- First data block=0
- Maximum filesystem blocks=0
- 153 block groups
- 32768 blocks per group, 32768 fragments per group
- 16384 inodes per group
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
- 4096000
- Writing inode tables: done
- Creating journal (32768 blocks): done
- Writing superblocks and filesystem accounting information: done
- This filesystem will be automatically checked every 33 mounts or
- 180 days, whichever comes first. Use tune2fs -c or -i to override.
和使用分区一样,需要将RAID挂载到挂载点后才能正常使用。
- [root@db8 ~]# mkdir /RAIDmnt
- [root@db8 ~]# mount /dev/md0 /RAIDmnt/
- [root@db8 ~]# df -h
- 鏂囦欢绯荤粺 瀹归噺 宸茬敤 鍙敤 宸茬敤% 鎸傝浇鐐
- /dev/sda3 13G 5.7G 6.2G 48% /
- /dev/sda1 190M 15M 166M 9% /boot
- tmpfs 252M 0 252M 0% /dev/shm
- /dev/md0 19G 173M 18G 1% /RAIDmnt
本例的RAID5由4个分区组成,每个分区为10GB,其中有效的工作分区为3个,另一个味备用分区(未启用)。而在这个3个有效的10GB工作分区中,有三分之一的空间是用来村中校验信息的,所以实际能使用的空间只有20GB,上面的df -h 命令的结果证实了这一点。
对RAID设备的操作和对分区的操作一样,如下面的复制文件操作:
- [root@db8 ~]# cp Asianux-30-SP4-i386-tools-rc-20120614.iso /RAIDmnt/
- [root@db8 ~]# df -h
- 鏂囦欢绯荤粺 瀹归噺 宸茬敤 鍙敤 宸茬敤% 鎸傝浇鐐
- /dev/sda3 13G 5.7G 6.2G 48% /
- /dev/sda1 190M 15M 166M 9% /boot
- tmpfs 252M 0 252M 0% /dev/shm
- /dev/md0 19G 1.3G 17G 7% /RAIDmnt
2、RAID5数据恢复实例
假设在系统工作正常的时候将设备/dev/sdb从系统中热拔出,再使用下面的命令查看,可以发现在设备拔出后,备用的磁盘会立即替代被拔掉的磁盘并开始进行恢复工作。也可以使用mdadm命令模拟磁盘突然损坏或突然被热拔出时的情形。
①一块磁盘损坏的情况
- [root@db8 ~]# mdadm /dev/md0 -f /dev/sdb1
- #模拟磁盘损坏
- mdadm: set /dev/sdb1 faulty in /dev/md0
- [root@db8 ~]# mdadm /dev/md0 -r /dev/sdb1
- #移除(热拔出)磁盘
- mdadm: hot removed /dev/sdb1
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde1[0] sdd1[2] sdc1[3]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
- [>....................] recovery = 4.4% (441344/10008384) finish=10.4min speed=15218K/sec
- unused devices:
过了一段时间,磁盘数据恢复结束,系统恢复正常。
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde1[0] sdd1[2] sdc1[1]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
- unused devices:
②第二块磁盘损坏的情况
假设再拔掉设备/dev/sdc.这时查看RAID信息会发现RAID已经不能正常工作,因为现在RAID中只有两块磁盘时正常的,而RAID5中有两块磁盘是不能工作,这个过程也可以用mdadm命令来进行模拟的。
- [root@db8 ~]# mdadm /dev/md0 -r /dev/sdc1
- mdadm: hot removed /dev/sdc1
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sde1[0] sdd1[2]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
- unused devices:
③插回一块正常磁盘的情况
这个时候,如果把第一次拔掉的设备/dev/sdb 重新插回到系统,则再查看RAID状态时,将会发现RAID立刻开始进行恢复工作直至恢复正常。这个过程同样也可以用 mdadm命令来模拟。
- [root@db8 ~]# mdadm /dev/md0 -a /dev/sdb1
- mdadm: re-added /dev/sdb1
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdb1[1] sde1[0] sdd1[2]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
- [>....................] recovery = 2.8% (281856/10008384) finish=6.3min speed=25623K/sec
- unused devices:
过了一段时间,磁盘数据恢复结束,系统恢复正常。
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdb1[1] sde1[0] sdd1[2]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
- unused devices:
④插回第二块正常磁盘的情况
如果再把第二次拔掉的设备/dev/sdc重新插回到系统,则会发现它成了备用磁盘。可以使用mdadm 命令来模拟此操作。
- [root@db8 ~]# mdadm /dev/md0 -a /dev/sdc1
- mdadm: added /dev/sdc1
- [root@db8 ~]# cat /proc/mdstat
- Personalities : [raid6] [raid5] [raid4]
- md0 : active raid5 sdc1[3](S) sdb1[1] sde1[0] sdd1[2]
- 20016768 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
- unused devices:
3.设置开机自动启动raid
如果是手工创建raid,但没有生成相关的配置文件,那么系统重启后raid是不会自动启动的,需要使用类似于下面的命令手工启动它:
- [root@db8 ~]# mdadm -A /dev/md0 /dev/sd[b-e]1
- mdadm: device /dev/md0 already active - cannot assemble it
也可以把上面的命令写入到rc.local文件中以使系统每次启动时都会执行这个命令。
如果希望系统启动时自动启动原来设置好的RAID,那么在重新启动计算机之前应该做好以下工作。首先需要生产RAID相关的配置文件:
- [root@db8 ~]# cat /etc/mdadm.conf
- ARRAY /dev/md0 level=raid5 num-devices=3 metadata=0.90 spares=1 UUID=c35752f4:2dcfbbd3:5c82bbfc:ac099425
- device /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
然后在/etc/fstab文件中加以下行,使系统启动时能自动将raid挂载到/RAIDmnt:
- [root@db8 ~]# cat /etc/fstab
- LABEL=/ / ext3 defaults 1 1
- LABEL=/boot /boot ext3 defaults 1 2
- tmpfs /dev/shm tmpfs defaults 0 0
- devpts /dev/pts devpts gid=5,mode=620 0 0
- sysfs /sys sysfs defaults 0 0
- proc /proc proc defaults 0 0
- LABEL=SWAP-sda2 swap swap defaults 0 0
- /dev/md0 /RAIDmnt auto defaults 0 0