在Linux中实现RAID

Author: 甘露 Date: 2001年 27期

?牐燫AID(Redundant Array of Independent Disks)是把相同的数据存储在多硬盘上的一种技术,I/O操作交替在不同的硬盘上进行,因此,整个系统失效的时间将大大延长。因此,RAID也是我们对高要求系统常采取的一种系统维护方案。下面,我们就来看看如何在Linux下实现这一功能。
  #1?牐犚弧⒆急腹ぷ?
  ?牐犠急窻AID之前,提醒你将硬盘上的重要数据备份到软盘或光盘或磁带上,以免发生意外造成不必要的损失。当然你需要至少两块硬盘,最好保证硬盘的接口类型(IDE或SCSI)、参数(柱面数/磁头数/扇区数/转速/缓存/DMA)等是一致的。
  #1?牐牰⑹迪植街?
  ?牐牭谝徊剑汗鼗诙橛才探拥降谝桓鯥DE控制器的Slave接口上。
  ?牐犠ⅲ杭偕枘愀乙谎训谝豢橛才坦以诘谝桓鯥DE控制器的Master接口上,而CD-ROM接在第二个IDE控制器的Master上。
  ?牐牭诙剑浩舳低常訰oot身份登录,运行以下命令对硬盘进行分区:
  ?牐?# fdisk /dev/hdb
  ?牐犠ⅲ航诙橛才袒殖梢桓鲋鞣智?立一个/dev/hdb1分区
  ?牐牭比唬颂岣叻梦仕俣龋憧梢越才探斜冉舷钢碌幕郑】赡芙智侠矸植荚诓煌挠才躺稀H缓螅儆肕dcreate将它们组合成一个mdx(x:1,2,3)。如果没有在以前对硬盘进行分区,确保你的/dev目录中已经设定了RAID硬盘,请参照下例:
  ?牐?# mknod /dev/md0 b 9 0
  ?牐?# mknod /dev/md1 b 9 1
  ?牐?# chmod 0600 /dev/md﹖
  ?牐牭谌剑海?1)如果你还在使用2.0.x的内核版本,可能需要连上Internet去找到与你的内核版本一致的补丁,因为它只支持RAID0,至于RAID-1、RAID-4和RAID-5,则需要补丁程序,然后才能支持。绝大多数的补丁都可以在RAID tools directory(ftp://ftp.kernel.org/pub/linux/daemons/raid/)里面找到,另外也可以在Ingo Molnar’s RAID patcher directory中找找,大多数的2.2内核版本都可以找到补丁。注意要使用与你的内核版本一致的补丁,假如不一致,可能导致无法使用,或者结果更糟。使用补丁时,首先进入内核源代码目录(/usr/src),然后使用patch命令,如下例:
  ?牐?# cd /usr/src/linux
  ?牐?# patch -p1 <~/raid-2.2.17-A0
  ?牐牸尤氩苟⊥瓯弦院螅褂靡韵卵∠罾粗匦卤嘁肽诤恕?
  ?牐犠ⅲ喝绻阏谑褂玫暮诵氖?2.0.X,并且不是自己编译过的话,大多数情况下是支持软RAID的。如果不能确定,则应自己编译核心。在配置时,应选择对md(Multi-Device多设备)的支持。
  ?牐?.CONFIG_BLK_DEV_MD=yes
  ?牐?.CONFIG_MD_STRIPED=yes
  ?牐?.CONFIG_MD_MIRRORING=yes
  ?牐?.CONFIG_MD_RAID5=yes
  ?牐?.CONFIG_MD_BOOT=yes
  ?牐?.CONFIG_AUTODETECT_RAID=yes
  ?牐牻幼虐沧癛AID tools(ftp://ftp.kernel.org/pub/linux/daemons/raid/raidtools-0.41.tar.gz)工具,这是一个只有48k的小程序。下载后,进行编译:
  ?牐?# gunzip -d raidtools-0.9.tar.gz
  ?牐?# tar -xvf raidtools-0.9.tar
  ?牐?# cd  raidtools-0.9
  ?牐?# ./configure
  ?牐?# make
  ?牐?# make install 
  ?牐爉ake install在/dev下产生md0-md3共4个设备。
  ?牐牭セ鱋K按钮,完成安装。
  ?牐?# mdcreate raid0 -c8k /dev/md0 /dev/hda1 /dev/hdb1
  ?牐牻麺ount到根目录下的某个目录上,就可以正式使用了。安装方法如下:
  ?牐?# mount  /dev/md0  /raid
  ?牐犠ⅲ?/raid为笔者在根分区建的一个Mount点
  ?牐犑褂胢kraid命令创建你新定义的RAID硬盘,
  ?牐?# mkraid /dev/md1 这样就可以生成一个新的设备:/dev/md1。
  ?牐犕保残枰谀阈陆ǖ腞AID硬盘上创建文件系统,
  ?牐?# mke2fs -v /dev/md1
  ?牐犠ⅲ涸谛碌拇娲⑸璞干辖?立Ext2文件系统
  ?牐犉舳陆?立的RAID盘:
  ?牐?# /sbin/mdadd -ar
  ?牐牪榭?/proc/mdstats文件的内容,以检查RAID0的状态。
  ?牐?# cat /proc/mdstats
  ?牐犎绻低诚允镜母吕嗨疲?
  ?牐燩ersonalities:[raid0]
  ?牐爎ead—ahead 1024 sectors
  ?牐爉d0: active raid0 hda1[1]hdb1[0]2202416 blocks 8k chunks
  ?牐爉d1: inactive
  ?牐爉d2: inactive
  ?牐爉d3: inactive
  ?牐犝馑得鱎AID0已经正确执行了。然后将以下两个命令加入到Init.sysinit文件中,在文件系统初始化中加载RAID0,这样,只要系统一启动,首先就执行RAID,用户就不必再手工安装了。
  ?牐?/sbin/mdrun -ar
  ?牐爉ount /dev/md0 /raid
  ?牐牭比唬绻悴痪醯寐榉常部梢允止ぴ诵幸陨厦睿允侄绞狡舳鞷AID盘。
  ?牐牐?2)如果你使用的是最新的2.4内核版本,恭喜你,你可以省略到处找补丁和下载安装Raid tools的麻烦了,因为新发布的2.4内核已经在几个方面作了极大改进(新的版本中,本身就已经提供了Raidtools在/sbin目录中,有Raidtools的一系列工具,其中有Mkraid、Raid0run、Raidstop、Raidstart等一组工具。),包括更统一的配置,以及在/etc/raidtab目录中关于RAID更详细的说明文档,另外的好处是你可以不再写传统的脚本文档(scripts),Linux就可以自动识别和运行RAID卷了。
  ?牐犎绻皇悄阕约罕嘁牍幕埃蠖嗍齃inux的发行版在一般情况下是支持软RAID的。如果不能确定,则应自己编译核心,编译方法同上。在配置时,应选择对md的支持。同时使用2.4内核版本的devfs功能。
  ?牐牻幼沤?立文件/etc/raidtab。一个简单的/etc/raidtab文件如下:
  ?牐爎aiddev /dev/md0(注:指明RAID设备)
  ?牐爎aid-level 0(注:指明将在RAID硬盘上建立何种RAID)
  ?牐爊r-raid-disks 3(注:说明RAID硬盘上分区的个数)
  ?牐爌ersistent-superblock 0(注:一般设定为1,但是如果使用的是已经有的老式的mdtools RAID硬盘,就必须设定为0)
  ?牐燾hunk-size 8k(注:说明RAID硬盘stripe的块大小,可以是从4k到128k,当然,应该是2的倍数。一般来说4k和8k是最常见的设定值,你可以试一下,哪个值最适合于你的系统)
  ?牐燿evice      /dev/hda1
  ?牐爎aid-disk    0
  ?牐燿evice      /dev/hdb1
  ?牐爎aid-disk    1
  ?牐燿evice       /dev/hdc1
  ?牐爎aid-disk     2
  ?牐爎aiddev /dev/md1
  ?牐爎aid-level     5
  ?牐爊r-raid-disks   4
  ?牐爊r-spare-disks  1(注:如果使用RAID 5阵列,在此处说明spare的数量。注意只有两块硬盘是无法使用RAID 5的)
  ?牐爌ersistent-superblock   1
  ?牐爌arity-algorithm  left-symmetric(注:说明将要使用的语法,通常使用“left-symmetric”能够增加性能)
  ?牐燾hunk-size  8k
  ?牐燿evice     /dev/sda1
  ?牐爎aid-disk   0
  ?牐燿evice     /dev/sdb1
  ?牐爎aid-disk   1
  ?牐燿evice     /dev/sdc1
  ?牐爎aid-disk   2
  ?牐燿evice     /dev/sdd1
  ?牐爎aid-disk   3
  ?牐燿evice     /dev/sde1
  ?牐爏pare-disk  0
  ?牐犚坏┰?/etc/raidtab定义好RAID硬盘以后,同样使用mkraid命令创建新定义的RAID硬盘。
  ?牐?# mkraid /dev/md1 这样就可以生成一个新的RAID设备:/dev/md1。
  ?牐犕保残枰谀阈陆ǖ腞AID硬盘上创建文件系统。
  ?牐?# mke2fs -v /dev/md1(注:在新的存储设备上建立Ext2文件系统)
  ?牐牼笤剂饺种樱碌奈募低臣纯烧飞伞W鐾暾庑┍匦氲墓ぷ饕院螅庸倚碌腞AID硬盘,再试试是否正常工作了。
  ?牐?# mount  /dev/md0  /raid(注:/raid为笔者在根分区建的一个Mount点)
  ?牐?# raidstart -a(注:启动软RAID)
  ?牐?# cat mdstat
  ?牐犎绻低诚允镜母吕嗨疲?
  ?牐燩ersonalities:?? [raid0]
  ?牐爎ead—ahead 1024 sectors
  ?牐爉d0:active raid0 hda1[1] hdb1[0]2202416 blocks 8k chunks
  ?牐爑nused devices:??
  ?牐牴?喜你,这表明一切顺利,你的RAID0已正常运行了。
  #1?牐犎⒆⒁馐孪?
  ?牐犞档米⒁獾氖荓ILO和Loadlin都需要一个没有stripped/mirrored的分区来读取内核的image映像文件,因此,如果你打算把根分区(/)也RAID,可能你将无法启动,这种情况下,你或者使用最初的ramdisk支持(使用mkinitrd命令建立你的ramdisk映像),或者注意下载网上的一些补丁。
  ?牐犃硗庖步ㄒ槟惆裄AID分区标志为0xfd类型,同时在配置文件中把CONFIG_AUTODETECT_RAID设为yes,这样你就不需要在一个初始化脚本文件中定义raidstart了,因为最新的内核版本会自动进入/etc/fstab目录,简单地对你的RAID硬盘与其他硬盘一视同仁,即便它被用作root device。