作為網絡操作系統,冗余磁盤陣列(Redundant Array of IneXPensive Disks,簡稱RAID)功能是必備的功能之一。從Linux 2.4內核開始,Linux就提供軟件RAID,不必購買昂貴的硬件RAID控制器和附件(一般中、高擋服務器都提供這樣的設備和熱插拔硬盤),就能極大地增強Linux磁盤的I/O性能和可靠性。同時,它還具有將多個較小的磁盤空間組合成一個較大磁盤空間的功能。這裡的軟件RAID不是指在單個物理硬盤上實現RAID功能。為提高RAID的性能,最好還是使用多個硬盤,使用SCSI接口的硬盤效果會更好。 RAID作用及主要使用類型 RAID將普通硬盤組成一個磁盤陣列,在主機寫入數據時,RAID控制器把主機要寫入的數據分解為多個數據塊,然後並行寫入磁盤陣列;主機讀取數據時,RAID控制器並行讀取分散在磁盤陣列中各個硬盤上的數據,把它們重新組合後提供給主機。由於采用並行讀寫操作,從而提高了存儲系統的存取程度。此外,RAID磁盤陣列更主要的作用是,可以采用鏡像、奇偶校驗等措施來提高系統的容錯能力,保證數據的可靠性。一般在安裝Linux操作系統時可以根據需要進行RAID的安裝配置。 在使用Linux操作系統的過程中,也可以根據應用的需要,用手工方法進行RAID的配置。配置前提是必須已經安裝raidtools工具包。該包可以從http://people.redhat.com/mingo/raidtools處下載最新版raidtools-1.00.3.tar.gz ,然後用root用戶解壓縮包然後輸入以下命令: # cd raidtools-1.00.3 # ./configure # make # make install 這樣raidtools-1.00.3就安裝好了,從而可以隨時安裝使用RAID。 在Linux系統中,主要提供RAID 0、RAID 1、RAID 5三種級別的RAID方法。RAID 0又稱為Stripe或Striping,中文譯為集帶工作方式。它是將要存取的數據以條帶狀形式盡量平均分配到多個硬盤上,讀寫時多個硬盤同時進行讀寫,從而提高數據的讀寫速度。RAID 0另一目的是獲得更大的“單個”磁盤容量。 RAID 1又稱為Mirror或Mirroring,中文譯為鏡像方式。這種工作方式的出現完全是為了數據安全考慮的,它是把用戶寫入硬盤的數據百分之百地自動復制到另外一個硬盤上或硬盤的不同地方(鏡像)。當讀取數據時,系統先從RAID 1的源盤讀取數據,如果讀取數據成功,則系統不去管備份盤上的數據;如果讀取源盤數據失敗,則系統自動轉而讀取備份盤上的數據,不會造成用戶工作任務的中斷。由於對存儲的數據進行百分之百的備份,在所有RAID級別中,RAID 1提供最高的數據安全保障。同樣,由於數據的百分之百備份,備份數據占了總存儲空間的一半,因而,Mirror的磁盤空間利用率低,存儲成本高。 RAID 5是一種存儲性能、數據安全和存儲成本兼顧的存儲解決方案,也是目前應用最廣泛的RAID技術。各塊獨立硬盤進行條帶化分割,相同的條帶區進行奇偶校驗(異或運算),校驗數據平均分布在每塊硬盤上。以n塊硬盤構建的RAID 5陣列可以有n-1塊硬盤的容量,存儲空間利用率非常高。RAID 5不對存儲的數據進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成RAID5的各個磁盤上,並且奇偶校驗信息和相對應的數據分別存儲於不同的磁盤上。當RAID 5的任何一塊硬盤上的數據丟失,均可以通過校驗數據推算出來。RAID 5具有數據安全、讀寫速度快,空間利用率高等優點,應用非常廣泛。其不足之處是如果1塊硬盤出現故障以後,整個系統的性能將大大降低。RAID 5可以為系統提供數據安全保障,但保障程度要比Mirror低,而磁盤空間利用率要比Mirror高。RAID 5具有和RAID 0相近似的數據讀取速度,只是多了一個奇偶校驗信息,寫入數據的速度比對單個磁盤進行寫入操作稍慢。同時由於多個數據對應一個奇偶校驗信息,RAID 5的磁盤空間利用率要比RAID 1高,存儲成本相對較低。 RAID在Linux下的創建過程 在實際使用過程中,一般都是使用多個單獨的磁盤建立RAID,當然也可以使用單個磁盤建立RAID,具體步驟類似。在此,我以使用單個磁盤建立RAID為例進行介紹。 1.以root用戶登錄 2.使用fdisk工具創建RAID分區 (1)fdisk /dev/hda,這裡假定IDE1主接口上的硬盤有剩余空間。 (2)使用命令n創建多個大小相同的新分區,若建立RAID 0或RAID 1分區數至少要大於等於2, RAID 5分區數至少大於等於3。n—起始柱面(可直接按回車)—分區大小;重復以上過程到想創建的RAID分區數為止。結果如下所示: disk /dev/hda: 240 heads, 63 sectors, 3876 cylinders Units = cylinders of 15120 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 1221 9230728+ c Win95 FAT32 (LBA) /dev/hda2 1222 1229 60480 83 Linux /dev/hda3 1230 1906 5118120 83 Linux /dev/hda4 1907 3876 14893200 f Win95 Ext'd (LBA) /dev/hda5 1907 1960 408208+ 82 Linux swap /dev/hda6 1961 2231 2048728+ b Win95 FAT32 /dev/hda7 2709 3386 5125648+ b Win95 FAT32 /dev/hda8 3387 3876 3704368+ 7 HPFS/NTFS /dev/hda9 2232 2245 105808+ 83 Linux /dev/hda10 2246 2259 105808+ 83 Linux /dev/hda11 2260 2273 105808+ 83 Linux /dev/hda12 2274 2287 105808+ 83 Linux 使用n命令創建4個Linux分區後,用命令p顯示分區情況。這裡/dev/hda9、/dev/hda10、/dev/hda11、/dev/hda12為創建的4個Linux分區。 (3)使用命令t改變分區類型為software raid類型。t—分區號—fd(分區類型);重復以上過程。修改分區類型後如下所示: /dev/hda9 2232 2245 105808+ fd Linux raid autodetect /dev/hda10 2246 2259 105808+ fd Linux raid autodetect /dev/hda11 2260 2273 105808+ fd Linux raid autodetect /dev/hda12 2274 2287 105808+ fd Linux raid autodetect (4)使用命令w保存分區表。 3.重新啟動使分區表生效 4.使用man raidtab查看配置文件結構 5.使用編輯命令將配置文件內容寫入 /etc/raidtab 如下所示: raiddev /dev/md0 raid-level 5 nr-raid-disks 3 nr-spare-disks 1 persistent-superblock 1 parity-algorithm left-symmetric chunk-size 8 device /dev/hda9 raid-disk 0 device /dev/hda10 raid-disk 1 device /dev/hda11 raid-disk 2 device /dev/hda12 spare-disk 0 這裡創建RAID-5,使用3個RAID磁盤,1個備用磁盤。注意“chunk-size 8”一句不能少,指定RAID-5使用的塊大小為8KB。RAID-5卷會以8KB的塊寫入其組成分區,即RAID卷的第一個8KB在hda9上,第二個8KB在hda10上,依此類推。設備名可為md0或md1等。“spare-disk”磁盤主要起備用作用,一旦某一磁盤損壞可以立即頂上,這裡也可以不要。 6.使用mkraid /dev/md0創建RAID陣列 這裡md表示創建的是RAID磁盤類型。結果如下所示: [root@localhost root]# mkraid /dev/md0 handling MD device /dev/md0 analyzing super-block disk 0: /dev/hda9, 105808kB, raid superblock at 105728kB disk 1: /dev/hda10, 105808kB, raid superblock at 105728kB disk 2: /dev/hda11, 105808kB, raid superblock at 105728kB disk 3: /dev/hda12, 105808kB, raid superblock at 105728kB md0: WARNING: hda10 appears to be on the same physical disk as hda9. True protection against single-disk failure might be compromised. md0: WARNING: hda11 appears to be on the same physical disk as hda10. True protection against single-disk failure might be compromised. md0: WARNING: hda12 appears to be on the same physical disk as hda11. True protection against single-disk failure might be compromised. md: md0: RAID array is not clean -- starting background reconstrUCtion 8regs : 2206.800 MB/sec 32regs : 1025.200 MB/sec pII_mmx : 2658.400 MB/sec p5_mmx : 2818.400 MB/sec raid5: using function: p5_mmx (2818.400 MB/sec) raid5: raid level 5 set md0 active with 3 out of 3 devices, algorithm 2 7.使用 lsraid -a /dev/md0 查看RAID分區狀況 結果如下所示: [root@localhost root]# lsraid -a /dev/md0 [dev 9, 0] /dev/md0 86391738.19BEDD09.8F02C37B.51584DBA online [dev 3, 9] /dev/hda9 86391738.19BEDD09.8F02C37B.51584DBA good [dev 3, 10] /dev/hda10 86391738.19BEDD09.8F02C37B.51584DBA good [dev 3, 11] /dev/hda11 86391738.19BEDD09.8F02C37B.51584DBA good [dev 3, 12] /dev/hda12 86391738.19BEDD09.8F02C37B.51584DBA spare 8.mkfs.ext3/dev/md0將RAID分區格式化為ext3格式 結果如下所示: [root@localhost root]# mkfs.ext3 /dev/md0 mke2fs 1.27 (8-Mar-2002) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 53040 inodes, 211456 blocks 10572 blocks (5.00%) reserved for the super user First data block=1 26 block groups 8192 blocks per group, 8192 fragments per group 2040 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729, 204801 raid5: switching cache buffer size, 4096 --> 1024 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 22 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. 9.mount /dev/md0 /mnt/md0 這裡應首先在mnt目錄下創建md0子目錄。 至此,所有創建工作完成,md0目錄就成為具有RAID作用的一個目錄。 檢驗RAID的效果 我們可以使用以下步驟檢驗RAID的效果。 1.dd if=/dev/zero of=/dev/hda9 bs=100000000 count=10 將RAID的第一個磁盤分區hda9全部置0;bs表示一次寫多少位,count表示寫多少次。這裡一定要使寫入的數據大於磁盤分區的容量,否則由於RAID的作用,數據會自動恢復原有值。如下所示: [root@localhost root] # dd if=/dev/zero of=/dev/hda9 bs=100000000 count=10 dd: writing `/dev/hda9': No space left on device 2+0 records in 1+0 records out 2.用lsraid -a /dev/md0查看到/dev/hda9數據全為0 如下所示: [root@localhost root]# lsraid -a /dev/md0 lsraid: Device "/dev/hda9" does not have a valid raid superblock lsraid: Device "/dev/hda9" does not have a valid raid superblock lsraid: Device "/dev/hda9" does not have a valid raid superblock lsraid: Device "/dev/hda9" does not have a valid raid superblock [dev 9, 0] /dev/md0 86391738.19BEDD09.8F02C37B.51584DBA online [dev ?, ?] (unknown) 00000000.00000000.00000000.00000000 missing [dev 3, 10] /dev/hda10 86391738.19BEDD09.8F02C37B.51584DBA good [dev 3, 11] /dev/hda11 86391738.19BEDD09.8F02C37B.51584DBA good [dev 3, 12] /dev/hda12 86391738.19BEDD09.8F02C37B.51584DBA spare 3.raidstop /dev/md0 4.raidstart /dev/md0 則/dev/hda9的數據恢復正常,說明RAID的數據校驗功能已起作用。 在使用Linux的過程中,可以隨時創建RAID來提高數據的可靠性和I/O性能,甚至可以將多個硬盤剩余的較小空間組合成一個較大空間。