在以数据为中心的信息时代,如何妥善有效地保护数据是存储系统的核心问题之一。人们可以忍受计算机宕机,所有应用程序重新启动或者硬件损坏,但是他们要求信息永远不会丢失。冗余磁盘阵列(RedundantArrayofIndependentDisks)技术是各种企业信息系统和个人广泛使用的解决方案,一般的中高档服务器多使用硬件RAID控制器,但是由于硬件RAID控制器的价格昂贵,导致系统成本大大增加。而随着处理器的性能快速发展,使得软件RAID的解决方法得到人们的重视。这里我们主要介绍在Linux系统中软件RAID的配置和使用方法,它既降低了系统的总投资,也能满足系统应用的需要。一.简介在Linux系统中目前以MD(MultipleDevices)虚拟块设备的方式实现软件RAID,利用多个底层的块设备虚拟出一个新的虚拟块设备,并且利用条带化(stripping)技术将数据块均匀分布到多个磁盘上来提高虚拟设备的读写性能,利用不同的数据冗余算法来保护用户数据不会因为某个块设备的故障而完全丢失,而且还能在设备被替换后将丢失的数据恢复到新的设备上。关于不同冗余级别的定义和数据块以及校验块的分布示意图可以参考存储专业委员会给出的参考资料“CommonRAIDDiskDataFormatSpecification”。目前MD支持linear,multipath,raid0(stripping),raid1(mirror),raid4,raid5,raid6,raid10等不同的冗余级别和组成方式,当然也能支持多个RAID阵列的层叠组成raid1+0,raid5+1等类型的阵列。在参考资料“SoftwareRAIDHOWTO”中介绍了早期软件RAID阵列功能特点和使用方式,但是因为软件RAID程序的功能不断增加,因此很有必要写份新的使用介绍。本文主要先讲解用户层mdadm如何管理软件RAID以及使用中经常遇到的问题和解决方法。在流行的Linux的发布版中,如FedoraCore,Gentoo,Ubuntu,Debian,SuseLinux系统中一般已经将MD驱动模块直接编译到内核中或编译为可动态加载的驱动模块。我们可以在机器启动后通过cat/proc/mdstat看内核是否已经加载MD驱动或者cat/proc/devices是否有md块设备,并且可以使用lsmod看MD是否是以模块形式加载到系统中。[root@fc5mdadm-2.6.3]#cat/proc/mdstatPersonalities:unuseddevices:none[root@fc5mdadm-2.6.3]#cat/proc/devices|grepmd1ramdisk9md253mdp[root@fc5mdadm-2.6.3]#lsmod|grepmdmd_mod733640如果Linux系统既没有将MD编译到内核也没有自动加载MD模块,则没有/proc/mdstat文件,那么需要执行命令modprobemd加载驱动模块。[root@fc5mdadm-2.6.3]#cat/proc/mdstatcat:/proc/mdstat:Nosuchfileordirectory[root@fc5mdadm-2.6.3]#modprobemd[root@fc5mdadm-2.6.3]#lsmod|grepmdmd_mod733640如果系统中没有MD驱动模块则需要自己从Linux内核源代码网站下载源代码包,并且重新编译内核,并且需要在内核的配置文件选择。[*]Multipledevicesdriversupport(RAIDandLVM)*RAIDsupportMLinear(append)modeMRAID-0(striping)modeMRAID-1(mirroring)modeMRAID-10(mirroredstriping)mode(EXPERIMENTAL)MRAID-4/RAID-5/RAID-6mode[*]Supportaddingdrivestoaraid-5arrayMMultipathI/OsupportMFaultytestmoduleforMD在Linux系统中用户层以前使用raidtool工具集来管理MD设备,目前广泛使用mdadm软件来管理MD设备,而且该软件都会集成在Linux的发布版中。如果系统中没有安装可以到RAID驱动程序和mdadm软件的维护者NeilBrown的个人网站来下载源码包进行编译安装,或者下载RPM包直接安装。mdadm的最新版本是2.6.3。可以使用mdadm--version查看当前系统使用的版本。本文使用的是mdadm-2.6.3,Linux内核版本是Linux-2.6.22.1。下面的测试命令是在虚拟机环境中测试运行的。[root@fc5mdadm-2.6.3]#uname-r2.6.22.1[root@fc5mdadm-2.6.3]#./mdadm--versionmdadm-v2.6.3-20thAugust2007二.mdadm管理软RAID阵列mdadm程序是一个独立的程序,能完成所有的软RAID管理功能,主要有7种使用模式:模式名字主要功能Create使用空闲的设备创建一个新的阵列,每个设备具有元数据块Assemble将原来属于一个阵列的每个块设备组装为阵列Build创建或组装不需要元数据的阵列,每个设备没有元数据块Manage管理已经存储阵列中的设备,比如增加热备磁盘或者设置某个磁盘失效,然后从阵列中删除这个磁盘Misc报告或者修改阵列中相关设备的信息,比如查询阵列或者设备的状态信息Grow改变阵列中每个设备被使用的容量或阵列中的设备的数目Monitor监控一个或多个阵列,上报指定的事件2.1为磁盘划分分区如果MD驱动被编译到内核中,当内核调用执行MD驱动时会自动查找分区为FD(Linuxraidautodetect)格式的磁盘。所以一般会使用fdisk工具将HD磁盘或者SD磁盘分区,再设置为FD的磁盘。[root@fc5mdadm-2.6.3]#fdisk/dev/sdkDevicecontainsneitheravalidDOSpartitiontable,norSun,SGIorOSFdisklabelBuildinganewDOSdisklabel.Changeswillremaininmemoryonly,untilyoudecidetowritethem.Afterthat,ofcourse,thepreviouscontentwon'tberecoverable.Warning:invalidflag0x0000ofpartitiontable4willbecorrectedbyw(rite)Command(mforhelp):nCommandactioneextendedpprimarypartition(1-4)pPartitionnumber(1-4):1Firstcylinder(1-512,default1):1Usingdefaultvalue1Lastcylinderor+sizeor+sizeMor+sizeK(1-512,default512):512Usingdefaultvalue512Command(mforhelp):tSelectedpartition1Hexcode(typeLtolistcodes):FDChangedsystemtypeofpartition1tofd(Linuxraidautodetect)Command(mforhelp):wThepartitiontablehasbeenaltered!Callingioctl()tore-readpartitiontable.Syncingdisks.[root@fc5mdadm-2.6.3]#fdisk-l/dev/sdkDisk/dev/sdk:1073MB,1073741824bytes128heads,32sectors/track,512cylindersUnits=cylindersof4096*512=2097152bytesDeviceBootStartEndBlocksIdSystem/dev/sdk115121048560fdLinuxraidautodetect软RAID阵列实际上也可以使用任何标准的块设备作为底层设备,如SCSI设备、IDE设备、RAMdisk磁盘和NBD(NetworkBlockDevice)等,甚至是其他的MD设备。如果MD驱动是模块形式加载,需要在系统运行时由用户层脚本控制RAID阵列启动运行。如在FedoraCore系统中在/etc/rc.d/rc.sysinit文件中有启动软RAID阵列的指令,若RAID的配置文件mdadm.conf存在,则调用mdadm检查配置文件里的选项,然后启动RAID阵列。echoraidautorun/dev/md0|nash--quietif[-f/etc/mdadm.conf];then/sbin/mdadm-A-sfi2.2创建新的阵列mdadm使用--create(或其缩写-C)参数来创建新的阵列,并且将一些重要阵列的标识信息作为元数据可以写在每一个底层设备的指定区间。--level(或者其缩写-l)表示阵列的RAID级别,--chunk(或者其缩写-c)表示每个条带单元的大小,以KB为单位,默认为64KB,条带单元的大小配置对不同负载下的阵列读写性能有很大影响。--raid-devices(或者其缩写-n)表示阵列中活跃的设备个数,而--spare-devices(或者其缩写-x)表示阵列中热备盘的个数,一旦阵列中的某个磁盘失效,MD内核驱动程序自动用将热备磁盘加入到阵列,然后重构丢失磁盘上的数据到热备磁盘上。创建一个RAID0设备:mdadm--create/dev/md0--level=0--chunk=32--raid-devices=3/dev/sd[i-k]1创建一个RAID1设备:mdadm-C/dev/md0-l1-c128-n2-x1/dev/sd[i-k]1创建一个RAID5设备:mdadm-C/dev/md0-l5-n5/dev/sd[c-g]-x1/dev/sdb创建一个RAID6设备:mdadm-C/dev/md0-l6-n5/dev/sd[c-g]-x2/dev/sdb/dev/sdh创建一个RAID10设备:mdadm-C/dev/md0-l10-n6/dev/sd[b-g]-x1/dev/sdh创建一个RAID1+0设备:mdadm-C/dev/md0-l1-n2/dev/sdb/dev/sdcmdadm-C/dev/md1-l1-n2/dev/sdd/dev/sdemdadm-C/dev/md2-l1-n2/dev/sdf/dev/sdgmdadm-C/dev/md3-l0-n3/dev/md0/dev/md1/dev/md2当RAID1/4/5/6/10等创建成功后,需要计算每个条带的校验和信息并写入到相应磁盘上,所以RAID阵列有一个冗余组数据同步的初始化过程(resync)。但是MD设备只要创建成功后即可对外被上层应用读写使用,当然由于上层数据读写降低数据同步的性能。初始化的时间长短和磁盘阵列自身性能以及读写的应用负载相关,使用cat/proc/mdstat信息查询RAID阵列当前重构的速度和预期的完成时间。[root@fc5mdadm-2.6.3]#cat/proc/mdstatPersonalities:[raid10]md0:activeraid10sdh[6](S)sdg[5]sdf[4]sde[3]sdd[2]sdc[1]sdb[0]3145536blocks64Kchunks2near-copies[6/6][UUUUUU][===...........]resync=15.3%(483072/3145536)finish