luckisme 发表于 2005-7-28 19:16:51

Software RAID For Linux

我想大家也聽過RAID 吧! 它能夠保護你的資料, 或是增加讀取的效能,或是把數個硬碟結合在一起。正如大家所知道RAID 也有Hardware RAID 和Software RAID 之分。Hardware RAID 是透過硬體的支援令OS 認為它是一個device。而Software RAID 則是利用OS 的功能來模擬RAID。由於在Linux 下支援的RAID 卡實在不多, 所以在Linux 下要用IDE 作RAID 便只能用Software RAID 的方法了。


RAID 主要分為Linear , RAID 0 to 5 各種Level, 我想大家也很清楚其分別吧, 所以只會簡介一下 : Linear mode 是會把2 個或以上的Harddisk 連起來, 寫完一個再寫一個。RAID-0 和Linear 差不多, 但資料會同時寫在那數個harddisk 上。好處是能夠增進讀寫效能,壞處則是只要其中一個harddisk 有問題則整個RAID-0 的partition 的資料也會不見了(唉~ 筆者家中的電腦舊harddisk 壞了, 所有資料全部失去.. 但和RAID-0 無關 ^^) RAID-1 則會把資料重複寫進harddisk, 好處當然是能夠保護資料, 即使一個harddisk 有問題另一個仍然會保留了應有的資料。 壞處便是效能可能會下降。

至於RAID4 和 5 , 都必須有3個harddisk 以上才能執行。 它們在儲存資料時會同時儲存一寫計算出來的資料。那麼3個harddisk 中其中一個有問題時便能夠靠那寫特點計算的資料重新建立數據。4 和5 的不同之處在於,RAID-4 會把所有計算出來資料存儲在一個 harddisk 上, 但如果所有harddisk 均同速的話那便會拖慢整個RAID-4 partition。而 RAID-5 則會把計算出來的資料分開。

值得一提的是在同一RAID partition 內的harddisk 最好速度一樣, 大小也一樣。除了 Linear mode 外其他level 的RAID 在使用不同速度和大小的 harddisk時都可能會令到效能下降。

另外在RAID-4,5 中我們常常會加進一個spare disks, spare disks 在平常是不會被讀寫的,只有在其中一個harddisk fail 時spare disks 才會代替原有harddisk 的功能。

最後, Swap parition 是不需要RAID 的,因為linux kernel 本身已經能夠同時控制多個 swap parition 的存取來增進效能了。

Kernel Setting

在Linux 中設定Software RAID 其實是十分簡單的,首先你必需重新compile 一個support RAID 的kernel。最新的kernel 2.4.x 已經內建RAID support 了。

你必需要enable 以下的RAID 選項:

Multidevice support ->

Multiple devices driver support (RAID and LVM) -- y
RAID support -- y
Linear (append mode) -- y (如果你用linear mode)
RAID-0 (striping) mode -- y (如果你用RAID - 0)
RAID-1 (mirroring) mode -- y (如果你用RAID - 1)
RAID-4 /RAID-5 mode --y (如果你用RAID 4 或5)

以上的選項如果你的RAID partition 將會是root paritition 的話請必定要選y 而不是 compile 成modules。但如果不是的話(例如只有/home 是RAID paritition),那用modules 也無問題。

然後compile kernel 也不用教吧 ^^
make dep;make bzImage;make modules;make modules_install

設定RAID tools

現在reboot 一下, 看看有沒有問題, 沒有的話便要裝raidtools 了多數的distribution 也附有raidtools 的, 如果沒有的話, 用debian 的請安裝raidtools2 :

apt-get install raidtools2

用RPM 的話便自己到rpmfind.net 下載了並安裝 ,或到ftp 下載sources compile~ (對不起~ 筆者也中了Debian 毒 ^^)

完成安裝了嗎? 那麼便要設定 /etc/raidtab 了,現在你應該沒有這個file 的,但mkraid 預設是會讀取這個設定檔。

Linear mode 的範例設定檔:

raiddev /dev/md0                        <--device 名
        raid-level        linear                <--Raidlevel 是linear
        nr-raid-disks        2                <--會被加進partition 的總parition 數
        chunk-size        32               
        persistent-superblock        1
        device                /dev/hde1        <--第0個parition
        raid-disk        0
        device                /dev/hdf1        <--第1個parition
        raid-disk        1

至於chunk-size 和persistent-superblock 是什麼呢? chunk-size 是指寫進單一個 partition 的大小, 例如在RAID-0 中把一個file同時寫進兩個或以上parition 時, 會把 file 分成多大才寫進一其中一個partition 呢? (總不能1 bit 寫在這, 1bit 寫在那吧) chunk-size 在linear mode 中也許沒意義, 但在其他level 如RAID-0 對效能是會有影響的。至於persistent-superblock, 加上許是為了令kernel 在開機時能直接detect 到那 partition。

RAID-0 的範例設定檔:

raiddev /dev/md0
        raid-level        0
        nr-raid-disks        2
        chunk-size        32
        persistent-superblock        1
        device                /dev/hde1
        raid-disk        0
        device                /dev/hdf1
        raid-disk        1

RAID-1 的範例設定檔:

raiddev /dev/md0
        raid-level        1
        nr-raid-disks        2
        nr-spare-disks        1                <-- 還記得剛才說過的spare-disks 嗎?
        chunk-size        4
        persistent-superblock        1
        device                /dev/hde1
        raid-disk        0
        device                /dev/hdf1
        raid-disk        1
        device                /dev/hdh1
        spare-disk        0

RAID-4 的範例設定檔:

raiddev /dev/md0
        raid-level        4
        nr-raid-disks        3                <-- 最少要有3個partition
        nr-spare-disks        1
        persistent-superblock        1
        chunk-size        32
        device                /dev/hde1
        raid-disk        0
        device                /dev/hdf1
        raid-disk        1
        device                /dev/hdg1
        raid-disk        2
        device                /dev/hdh1
        spare-disk        0

RAID-5 的範例設定檔:

raiddev /dev/md0
        raid-level        5
        nr-raid-disks        3
        nr-spare-disks        1
        persistent-superblock        1
        chunk-size        32
        parity-algorithm        left-symmetric
        device                /dev/hde1
        raid-disk        0
        device                /dev/hdf1
        raid-disk        1
        device                /dev/hdg1
        raid-disk        2
        device                /dev/hdh1
        spare-disk        0

怎麼樣? 很簡單吧!

寫完你的設定檔後便執行:

mkraid /dev/md0

那麼你的RAID parition 便建立起來了!看一看 /proc/mdstat 吧! ^^

chpapa@power:~$ sudo cat /proc/mdstat
Personalities :
read_ahead 1024 sectors
md0 : active raid5 hdh1 hdg1 hdf1 hde4
      80418048 blocks level5, 32k chunk, algorithm 2

unused devices:

跑起來了, 很爽吧!
(順帶一提, 筆者測試是用HPT370 的RAID Card,在Linux Kernel 中選用HPT366 的driver 便能認得出各devices 了)

哈哈~ 但那些沒看完文章便走去mount /dev/md0 的人該打了, 你還未format partition 呀!

mke2fs -b 4096 /dev/md0

(如果是用RAID 4, 5 的話, mke2fs 是有特點options 的: -R stride=8, 為什麼是8? chunksize 除以 blocksize)

假如你的RAID parition 是要在開機時能夠讓Linux 自動Detect (例如是要做root partition) 的話, 你還有一些事情要做的。

首先當然是要有kernel support 吧, 如果是root partition 的話請compile 成內建而不是modules。另外要有persistent-superblock, 剛才便已經有了。最後是每個parition type 都要為Linux raid autodetect。

頭兩項剛才已經列明了做法, 至於要把partition type 轉為Linux raid autodetect...

首先用raidstop 暫停raid partition /dev/md0

power:/# raidstop /dev/md0

power:/# fdisk /dev/hde

The number of cylinders for this disk is set to 5606.
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): p

Disk /dev/hde: 255 heads, 63 sectors, 5606 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot    Start       End    Blocks   IdSystem
/dev/hde1   *         1         7   56196   83Linux
/dev/hde2             8      71    514080   83Linux
/dev/hde3            72       135    514080   82Linux swap
/dev/hde4         136      560643945807+83Linux

跑 t 指令

Command (m for help): t
Partition number (1-4): 4
Hex code (type L to list codes): l
0Empty         18AST Windows swa 61SpeedStor       a6OpenBSD      
1FAT12         1bHidden Win95 FA 63GNU HURD or Sys a7NeXTSTEP      
2XENIX root      1cHidden Win95 FA 64Novell Netwareb7BSDI fs      
3XENIX usr       1eHidden Win95 FA 65Novell Netwareb8BSDI swap      
4FAT16 <32M      24NEC DOS         70DiskSecure Mult c1DRDOS/sec (FAT-
5Extended      39Plan 9          75PC/IX         c4DRDOS/sec (FAT-
6FAT16         3cPartitionMagic80Old Minix       c6DRDOS/sec (FAT-
7HPFS/NTFS       40Venix 80286   81Minix / old Lin c7Syrinx         
8AIX             41PPC PReP Boot   82Linux swap      daNon-FS data   
9AIX bootable    42SFS             83Linux         dbCP/M / CTOS / .
aOS/2 Boot Manag 4dQNX4.x          84OS/2 hidden C:e1DOS access   
bWin95 FAT32   4eQNX4.x 2nd part 85Linux extendede3DOS R/O      
cWin95 FAT32 (LB 4fQNX4.x 3rd part 86NTFS volume set e4SpeedStor      
eWin95 FAT16 (LB 50OnTrack DM      87NTFS volume set ebBeOS fs      
fWin95 Ext'd (LB 51OnTrack DM6 Aux 8eLinux LVM       f1SpeedStor      
10OPUS            52CP/M            93Amoeba          f4SpeedStor      
11Hidden FAT12    53OnTrack DM6 Aux 94Amoeba BBT      f2DOS secondary
12Compaq diagnost 54OnTrackDM6      9fBSD/OS          fdLinux raid auto
14Hidden FAT16 <3 55EZ-Drive      a0IBM Thinkpad hi feLANstep      
16Hidden FAT16    56Golden Bow      a5BSD/386         ffBBT            
17Hidden HPFS/NTF 5cPriam Edisk

看來是 fd 吧!

Hex code(type L to list codes): fd

然後跑 w 寫入就成了。

把剛才的做法在每個參與RAID 的partition 都做一次,然後試一下reboot 吧!看一看有沒有開機訊息告訢你已經找到RAID partition 吧!

實例

是次實例是一部原本已經在運行的Server , 它的/ partition 在/dev/hda1, /home 在 /dev/hdb1, 我們假設已經在kernel 設定好RAID5 support 了, 現在會增加四個harddisk 上去並跑RAID5

首先把那些Harddisk 分割好~ 四個harddisk 分別是 /dev/hde , /dev/hdf , /dev/hdg , /dev/hdh
(筆者測試用的電腦是用HPT370 Controller) 打算用 /dev/hde1 作 /boot 開機,用 /dev/hde2 作 /tmp, /dev/hde3 作swap。

首先當然是 fdisk, 相信大家都懂得用fdisk 吧,記緊RAID partition 要差不多size ,也要把partition type 設定為 fd 呀!

安裝raidtools :
apt-get install raidtools2

然後便是篇寫/etc/raidtab 了:

pico /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      32
      device/dev/hde4
      raid-disk       0
      device/dev/hdf1
      raid-disk       1
      device/dev/hdg1
      raid-disk       2
      device/dev/hdh1
      spare-disk      0

然後用mkraid 指令...
mkraid /dev/md0

格式化:
mke2fs -b 4096 -R stride=8 /dev/md0

把新的RAID5 mount 作/mnt/newroot:
mount /dev/md0 /mnt/newroot

把舊的資料抄到 /mnt/newroot
umask 0
cp -ax / /mnt/newroot
cp -ax /home /mnt/newroot/ <-- 因為-ax 只會把同一個partition 的資料抄走, 而 /home 現在和/ 在不同partition, 所以要跑兩次, 這是新手常常忘記了的

把/boot 抄到/dev/hde1 來開機
mount /dev/hde1 /mnt/newroot/boot
cp -R /boot /mnt/newroot/boot

chroot到新的harddisk:
chroot /mnt/newroot

設定新的fstab:
pico /etc/fstab (因為已經chroot, 所以現在/ 已經是/mnt/newroot 了)

/dev/md0        /        ext2        defaults,errors=remount-ro,usrquota,grpquota        0        0
/dev/cdrom        /cdrom        iso9660        defaults,ro,user,noauto        0        0
/dev/hde1        /boot        ext2        defaults        0        0
/dev/hde2        /tmp        ext2        defaults        0        0
/dev/hde3        none        swap        sw        0        0

設定新的lilo:
pico /etc/lilo.conf

boot=/dev/hde
disk=/dev/hde
      bios=0x80
compact
install=/boot/boot-menu.b
delay=1
map=/boot/map
append=""
read-only
default=Linux
image=/boot/vmlinuz-2.4.2
    root=/dev/md0
    label=Linux

然後執行lilo: /sbin/lilo

重新開機後, 把舊的harddisk 拔出來, 應該可以用/dev/hde 來正常開機了最後別忘了用mkswap format swap parition 呀!

多數用者在設定RAID 都不會遇到問題, 反而是lilo 的設定倒是較麻煩,另外筆者沒有試過直接用RAID 作/boot 來開機, 有興趣的讀者可以試一試, ^o^

raidtools 常用指令介紹

以下為RAID 的常用指令:

raidstart - 開動一個已建立的raid partition
raidstop - 暫停一個已開動的raid partition
raidhotadd - 在RAID 運行時加入一個新Harddisk, 例如在RAID5 中有一個harddisk 壞了, 要更換一個新的上去。
raidhotremove - 和raidhotadd 相反, 是會移除harddisk 的

最後提一提各位讀者, 要更動raid partition 的話, 請先用raidstop 暫停它。

鄭斌彬 ([email protected])
原文在 LinuxHall 第十期刊登
页: [1]
查看完整版本: Software RAID For Linux