分类: LINUX
2011-01-24 20:36:19
关于在linux下面创建软件RAID的讨论,
RAID介绍,
RAID就是廉价冗余磁盘阵列
常用的级别是RAID0 RAID1 RAID5
RAID分为软RAID和硬件RAID
软件RAID是基于系统的软件工作
优点:廉价
缺点:不稳定,如果系统坏了,RAID整列也就损坏,容易造成数据丢失
硬件RAID,这就是各大厂商提供的,存储解决方案。有专门的设备负责处理磁盘间的数据流。相对于软件RAID
优点:可靠性高,易管理。稳定
缺点:成本过高
RAID0: 最少由两块硬盘组成,优点是大大的提高了硬盘的读写性能,缺点是没有冗余机制,一旦一块硬盘坏了,将无法恢复。
可用空间 n
RAID1: 必须是2的倍数组成,优点是可以完全的备份数据,有冗余机制,缺点是降低了写入的性能,而且成本最高。
可用空间 n/2
RAID5: 最少由三块硬盘组成,raid5整合了raid1和raid0的优点,既有冗余机制,而且提升了读写的性能,一旦一块硬盘坏了,可以恢复数据。
可用空间 n-1
(ps: n为硬盘总大小)
热备盘
热备盘只在有冗余机制的raid的里面,当raid里面的成员down掉了,热备盘会立即的提升成raid成员,保证raid正常工作。
现在开始实战
题目:建立一个RAID5 级别的分区使用一个分区给这个RAID做热备份,并挂在到本地的/mnt/raid 目录。
1. 创建物理分区
首先创建四个分区,三块做raid5,一块做热备盘。
[root@localhost ~]# fdisk /dev/sda
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): n
First cylinder (1316-1958, default 1316):
Using default value 1316
Last cylinder or +size or +sizeM or +sizeK (1316-1958, default 1958): +100M
Command (m for help): n
First cylinder (1329-1958, default 1329):
Using default value 1329
Last cylinder or +size or +sizeM or +sizeK (1329-1958, default 1958): +100M
Command (m for help): n
First cylinder (1342-1958, default 1342):
Using default value 1342
Last cylinder or +size or +sizeM or +sizeK (1342-1958, default 1958): +100M
Command (m for help): n
First cylinder (1355-1958, default 1355):
Using default value 1355
Last cylinder or +size or +sizeM or +sizeK (1355-1958, default 1958): +100M
然后在分区主界面按“t”来转换分区类型,raid的id为fd
Command (m for help): t
Partition number (1-11): 8
Hex code (type L to list codes): fd
Changed system type of partition 8 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-11): 9
Hex code (type L to list codes): fd
Changed system type of partition 9 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-11): 10
Hex code (type L to list codes): fd
Changed system type of partition 10 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-11): 11
Hex code (type L to list codes): fd
Changed system type of partition 11 to fd (Linux raid autodetect)
Command (m for help):
完成分区后,按“p”来查看我们做的操作是否正确。
Command (m for help): p
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 13 104391 83 Linux
/dev/sda2 14 535 4192965 83 Linux
/dev/sda3 536 1057 4192965 8 Linux
/dev/sda4 1058 1958 7237282+ 5 Extended
/dev/sda5 1058 1188 1052226 82 Linux swap / Solari s
/dev/sda6 1189 1253 522081 83 Linux
/dev/sda7 1254 1315 497983+ 83 Linux
/dev/sda8 1316 1328 104391 fd Linux raid autodetect
/dev/sda9 1329 1341 104391 fd Linux raid autodetect
/dev/sda10 1342 1354 104391 fd Linux raid autodetect
/dev/sda11 1355 1367 104391 fd Linux raid autodetect
Command (m for help):
确定没有问题后,按“wq”保存并退出。
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@localhost ~]#
退出后一定要用partprobe工具来让刚才的操作立即生效。
[root@localhost ~]# partprobe /dev/sda
[root@localhost ~]#
创建分区到这里就结束了,
下面开始创建设备文件。
2. 创建阵列设备
系统默认有个md0可以给我使用,如果要多个raid的话,就需要自己去创建。
创建md1这个设备文件
创建设备文件用mknod命令
#mknod /dev/md1 b 9 1
Mknod 是命令 /dev/md1是设备名称
后面得b代表是创建的是个设备
9 是主设备号 1代表从设备号
主设备号不能改,从设备号是系统中唯一的。
创建好了之后,可以使用ls /dev/md1来查看
[root@localhost ~]# mknod /dev/md1 b 9 1
[root@localhost ~]#
[root@localhost ~]# ls /dev/md0
/dev/md0
[root@localhost ~]# ls /dev/md1
/dev/md1
[root@localhost ~]#
当然也可以不需要去创建这个阵列设备,可以在创建raid的时候加上-a yes ,系统自动的创建设备文件,可以看到,md0这个设备文件,我们没有去创建,这个系统默认就有的。
创建设备文件到这里就结束了,
下面开始创建raid设备。
3. 创建raid设备
使用mdadm工具来创建raid5
#mdadm –C /dev/md1 -a yes -l 5 -n 3 -x 1 /dev/sda8 /dev/sda9 /dev/sda10 /dev/sda11
[root@localhost ~]#
[root@localhost ~]# mdadm -C /dev/md1 -a yes -l 5 -n3 -x 1 /dev/sda8 /dev/sda9 /dev/sda10 /dev/sda11
mdadm: array /dev/md1 started.
[root@localhost ~]#
raid5就已经创建成功了,就是/dev/md1
关于创建raid里面的参数意义
/dev/md1 raid设备的名字
-a yes 创建raid的时候同时创建raid的设备文件
-l 5 raid设备的级别
-n 3 raid设备的磁盘的数量
-x 1 热备盘数量
/dev/sda8,9,10,11 raid是由哪些盘组成的
Raid的设备就创建成功了,下面来查看下刚才创建的raid5
可以使用#mdadm –D /dev/md0来查询raid的信息
[root@localhost ~]# mdadm -D /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Sat Feb 20 12:24:09 2010
Raid Level : raid5
Array Size : 208640 (203.78 MiB 213.65 MB)
Used Dev Size : 104320 (101.89 MiB 106.82 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Sat Feb 20 12:24:10 2010
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 64K
UUID : ea1f12df:849bd58d:5c766fdc:5dccd818
Events : 0.2
Number Major Minor RaidDevice State
0 8 8 0 active sync /dev/sda8
1 8 9 1 active sync /dev/sda9
2 8 10 2 active sync /dev/sda10
3 8 11 - spare /dev/sda11
[root@localhost ~]#
通过mdadm –D /dev/md1命令,可以看到关于raid的很多信息
可以看到mdadm的版本,什么时候创建的,raid的级别,raid的大小,每个设备的大小,raid的组成成员,总共有几个设备,raid的状态,等等很多信息。
还可以看到刚才创建raid5的可用空间是200MB
创建raid设备就到这里了,
下面开始格式化raid设备
4. 要想去使用raid,还是先得格式化
#mkfs.ext3 /dev/md1
[root@localhost ~]# mkfs.ext3 /dev/md1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
52208 inodes, 208640 blocks
10432 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
26 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]#
格式化成功,接下来就是要挂载了。
5. 挂载raid设备
挂载raid的命令是
#mount /dev/md1 /mnt/raid5
[root@localhost ~]#
[root@localhost ~]# mount /dev/md1 /mnt/raid5/
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 4061572 2311856 1540068 61% /
/dev/sda6 505604 10565 468935 3% /home
/dev/sda2 4061572 1856572 1995352 49% /var
/dev/sda1 101086 13588 82279 15% /boot
tmpfs 192132 0 192132 0% /dev/shm
/dev/hdc 2935370 2935370 0 100% /media/RHEL_5.4 i386 DVD
/dev/md1 202047 5920 185695 4% /mnt/raid5
[root@localhost ~]# cd /mnt/raid5/
[root@localhost raid5]# ls
lost+found
[root@localhost raid5]#
挂载成功
整个raid的创建和使用就是这么多了。
复制一些数据到/mnt/raid5里面去,方便等下做实验。
[root@localhost ~]# cp /boot/* /mnt/raid5/
cp: omitting directory `/boot/grub'
cp: omitting directory `/boot/lost+found'
[root@localhost ~]# cd /mnt/raid5/
[root@localhost raid5]# ls
config-2.6.18-164.el5 symvers-2.6.18-164.el5.gz
initrd-2.6.18-164.el5.img System.map-2.6.18-164.el5
initrd-2.6.18-164.el5kdump.img vmlinuz-2.6.18-164.el5
lost+found
[root@localhost raid5]#
下面是关于软件raid的测试和修复
首先模拟磁盘故障
将raid5中的一个成员给down掉,试试热备盘能不能主动的成为热raid中的成员。
模拟磁盘故障的命令
#mdadm /dev/md1 –f /dev/sda10
[root@localhost ~]#
[root@localhost ~]# mdadm /dev/md1 -f /dev/sda10
mdadm: set /dev/sda10 faulty in /dev/md1
[root@localhost ~]#
已经模拟一块磁盘故障了
在使用mdadm –D /dev/md1来查询raid的状态
#mdadm –D /dev/md1
[root@localhost ~]#
[root@localhost ~]# mdadm -D /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Sat Feb 20 12:24:09 2010
Raid Level : raid5
Array Size : 208640 (203.78 MiB 213.65 MB)
Used Dev Size : 104320 (101.89 MiB 106.82 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Sat Feb 20 12:41:56 2010
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : ea1f12df:849bd58d:5c766fdc:5dccd818
Events : 0.6
Number Major Minor RaidDevice State
0 8 8 0 active sync /dev/sda8
1 8 9 1 active sync /dev/sda9
2 8 11 2 active sync /dev/sda11
3 8 10 - faulty spare /dev/sda10
[root@localhost ~]#
可以看到raid5以前里面的成员/dev/sda10已经坏掉了,热备盘很快的成为了raid5里面的成员,继续工作。
[root@localhost ~]# cd /mnt/raid5/
[root@localhost raid5]# ls
config-2.6.18-164.el5 symvers-2.6.18-164.el5.gz
initrd-2.6.18-164.el5.img System.map-2.6.18-164.el5
initrd-2.6.18-164.el5kdump.img vmlinuz-2.6.18-164.el5
lost+found
[root@localhost raid5]#
可以看到,raid5里面的数据都没有丢失。
刚才只是将raid5里面的一个成员给down掉了,由于有热备盘给自动的顶了上去,其实的raid5根本就没有什么问题,如果现在将raid5里面的另外一个成员也给down掉,raid5还可以正常工作吗。
在来模拟其中一块盘坏掉了
#mdadm /dev/md1 –f /dev/sda8
[root@localhost ~]# mdadm /dev/md1 -f /dev/sda8
mdadm: set /dev/sda8 faulty in /dev/md1
[root@localhost ~]#
在用mdadm –D /dev/md1来查看一下raid5的工作状态
#mdadm –D /dev/md1
[root@localhost ~]#
[root@localhost ~]# mdadm -D /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Sat Feb 20 12:24:09 2010
Raid Level : raid5
Array Size : 208640 (203.78 MiB 213.65 MB)
Used Dev Size : 104320 (101.89 MiB 106.82 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Sat Feb 20 12:49:17 2010
State : clean, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 2
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : ea1f12df:849bd58d:5c766fdc:5dccd818
Events : 0.10
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 9 1 active sync /dev/sda9
2 8 11 2 active sync /dev/sda11
3 8 10 - faulty spare /dev/sda10
4 8 8 - faulty spare /dev/sda8
[root@localhost ~]#
可以看到,raid5的模式已经变了,现在raid5就只有两块磁盘在工作了
[root@localhost ~]# cd /mnt/raid5/
[root@localhost raid5]# ls
config-2.6.18-164.el5 symvers-2.6.18-164.el5.gz
initrd-2.6.18-164.el5.img System.map-2.6.18-164.el5
initrd-2.6.18-164.el5kdump.img vmlinuz-2.6.18-164.el5
lost+found
[root@localhost raid5]#
可以看到,raid5里面的数据还是没有丢失。
在raid里面如何去移除一块磁盘
#mdadm /dev/md1 –r /dev/sda10
[root@localhost ~]#
[root@localhost ~]# mdadm /dev/md1 -r /dev/sda10
mdadm: hot removed /dev/sda10
[root@localhost ~]#
在用mdadm –D /dev/md1来查看一下raid5的工作状态
#mdadm –D /dev/md1
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 9 1 active sync /dev/sda9
2 8 11 2 active sync /dev/sda11
3 8 8 - faulty spare /dev/sda8
[root@localhost ~]#
/dev/sda10已经被我们移除掉了。
在raid里面如何去添加一个新的磁盘
# mdadm /dev/md1 –a /dev/sda10
[root@localhost ~]#
[root@localhost ~]# mdadm /dev/md1 -a /dev/sda10
mdadm: added /dev/sda10
[root@localhost ~]#
可以看到,/dev/sda10又被添加进来了。
在用mdadm –D /dev/md1来查看一下raid5的工作状态
#mdadm –D /dev/md1
Number Major Minor RaidDevice State
0 8 10 0 active sync /dev/sda10
1 8 9 1 active sync /dev/sda9
2 8 11 2 active sync /dev/sda11
3 8 8 - faulty spare /dev/sda8
[root@localhost ~]#
可以看到,raid5又已经正常工作了,
所有的操作都是在线的,是不需要离线的。
关于如何在下次启动的时候再raid生效,当然如果是/dev/md0是不要去任何操作的,/dev/md0在下次启动是会自动激活。
我们知道raid是在/etc/rc.d/sysinit这个脚本激活的,现在来看看这个脚本
# RAID setup
update_boot_stage RCraid
[ -x /sbin/nash ] && echo "raidautorun /dev/md0" | nash --quiet
if [ -f /etc/mdadm.conf ]; then
/sbin/mdadm -A -s
fi
这个raid在/etc/rc.d/rc.sysinit这个脚本里面的内容,在下次启动计算机的时候,系统会去读取/etc/mdadm.conf里面的文件,然后激活raid,如果没有这个文件raid级激活不了。
将这个文件手动敲出来,可以用这条命令
#mdadm –D –s > /etc/mdadm.conf
[root@localhost rc.d]# mdadm -D -s > /etc/mdadm.conf
[root@localhost rc.d]#
必须在/etc/mdadm.conf中加入auto=yes
ARRAY /dev/md1 level=raid5 num-devices=3 metadata=0.90 UUID=ea1f12df:849bd58d:5c766fdc:5dccd818 auto=yes
~
那么这样,创建的raid在下次启动的时候,就可以自动激活了,刚才创建的是/dev/md1,如果是/dev/md0,就不需要去写这些东西。如果系统中还有其他的raid,都要手动的写出这个文件,每个raid都要写,只有/dev/md0不需要去做这个事情。
如果要想每次启动计算机,raid5都自动挂载,还是要进入/etc/fstab这个文件里面才可以。
/dev/md1 /mnt/raid5 ext3 defaults 0 0
~
重启看下,能不能够raid能不能够自动激活和自动挂载上去。
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 3.9G 2.3G 1.5G 61% /
/dev/sda6 494M 11M 458M 3% /home
/dev/sda2 3.9G 1.8G 2.0G 49% /var
/dev/sda1 99M 14M 81M 15% /boot
tmpfs 188M 0 188M 0% /dev/shm
/dev/md1 198M 14M 174M 8% /mnt/raid5
/dev/hdc 2.8G 2.8G 0 100% /media/RHEL_5.4 i386 DVD
[root@localhost ~]# cd /mnt/raid5/
[root@localhost raid5]# ls
config-2.6.18-164.el5 symvers-2.6.18-164.el5.gz
initrd-2.6.18-164.el5.img System.map-2.6.18-164.el5
initrd-2.6.18-164.el5kdump.img vmlinuz-2.6.18-164.el5
lost+found
[root@localhost raid5]#
Raid已经激活了而且也挂载到/mnt/raid5下面去了
在linux下面创建RAID的讨论就到这里了。