18.4. RAID

18.4.1. 軟體 RAID

18.4.1.1. 連接式磁碟裝置驅動程式(CCD, Concatenated Disk Driver) 設定

Original work by Christopher Shumway. Revised by Jim Brown.

對大容量儲存設備而言,最關鍵的要素乃是速度、可靠性及價格。 然而這三者往往難以兼顧:快速可靠的設備通常很貴; 而降低成本通常也犧牲了速度或可靠性。

接下來要介紹的系統,價格是最重要的考量,接下來是速度, 最後才是可靠性。 順序如此是因為資料傳輸的速度最終取決於網路, 而儘管可靠性十分重要,卻有簡單的取代方案: 將資料完整備份於 CD-R 中。

選擇大容量儲存設備方案時,首先要定義您的需求。 如果您重視速度或可靠性甚於價格,接下來的介紹恐非您所需。

18.4.1.1.1. 安裝硬體

除了系統磁碟外,下面介紹的 CCD 磁碟陣列將使用到三顆 30GB、 5400 RPM 的 Western Digital IDE 磁碟,以提供約 90GB 的儲存空間。 最理想的情況是每個磁碟由獨立使用的排線連接獨立使用的 IDE 控制器, 不過為了降低成本,利用 jumper 設定磁碟,使每個 IDE 控制器可連接 一個主磁碟加一個副磁碟,如此可不必加裝額外的 IDE 控制器。

開機後,BIOS 應該設定成自重偵測磁碟。更重要的是 FreeBSD 應該 要偵測到它們:

ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33
ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33
ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33
ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33

注: 如果 FreeBSD 沒有偵測到所有磁碟,請確認 jumper 都設定正確。 許多 IDE 磁碟可以設定成 “Cable Select” (根據排線位置決定),這並非 master(主磁碟) 或 slave(副磁碟)。 請參閱磁碟的說明文件以正確設定 jumper 。

接下來,考慮如何將它們變成檔案系統的一部份。您可以參考 vinum(8)(µÚ 20 章) 及 ccd(4)。 在此我們選擇 ccd(4)

18.4.1.1.2. 設定 CCD

ccd(4) 可以將多個磁碟接起來成為一個大磁碟。要使用 ccd(4),您的 kernel 需要支援 ccd(4)。將這行加入到 kernel 設定檔,並重編、重安裝 kernel:

device   ccd

也可以載入 kernel 動態模組來支援 ccd(4)

使用 ccd(4) 請先用 bsdlabel(8) 來初始磁碟:

bsdlabel -r -w ad1 auto
bsdlabel -r -w ad2 auto
bsdlabel -r -w ad3 auto

上述指令會建立 ad1cad2cad3c, 這些 bsdlabel 都使用了整個磁碟。

下一步是修改 label type,同樣用 bsdlabel(8) 來處理:

bsdlabel -e ad1
bsdlabel -e ad2
bsdlabel -e ad3

這個指令會打開一個編輯器(預設是 vi(1),可以用 EDITOR 環境變數來指定其它編輯器),並將目前磁碟的 label 資訊顯示在該編輯器裡。

一個還未變動過的磁碟 label 資訊看起來會像這樣:

8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  c: 60074784        0    unused        0     0     0   # (Cyl.    0 - 59597)

在此我們要新增一個 e partition 給 ccd(4) 使用。 通常複製 c partition 那一行, 再把 fstype 那一行改成 4.2BSD 就可以了。 改完之後看起來應該會像這樣:

8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  c: 60074784        0    unused        0     0     0   # (Cyl.    0 - 59597)
  e: 60074784        0    4.2BSD        0     0     0   # (Cyl.    0 - 59597)

18.4.1.1.3. 建立檔案系統

現在所有的磁碟都已經建好 bsdlabel 了,可以開始建立 ccd(4)。 用 ccdconfig(8) 來建立 ccd(4),參考下面的指令:

ccdconfig ccd0(1) 32(2) 0(3) /dev/ad1e(4) /dev/ad2e /dev/ad3e

每個參數的作用如下:

(1)
第一個參數是要設定的裝置名稱,在這個例子裡是 /dev/ccd0c。其中 /dev/ 可有可無。
(2)
「interleave」的大小。所謂 interleave 是指一排磁碟區塊 (disk block)的大小,通常以 512 bytes 為單位,所以 interleave 設為 32 即為 16,384 bytes。
(3)
ccdconfig(8) 設定模式的參數。如果您打算啟用磁碟鏡設 (drive mirroring),您可以在此指定參數。這個例子沒有使用鏡設, 所以設成 0。
(4)
ccdconfig(8) 最後的參數是要加入到陣列的所有磁碟。 請使用完整的路徑。

執行 ccdconfig(8) 之後,ccd(4) 已設定完成可供建立檔案系統。 請參考 newfs(8) 或輸入:

newfs /dev/ccd0c

18.4.1.1.4. 讓一切自動完成

通常您會希望每次開機時都能自動掛上(mount) ccd(4)。 用下面的指令將您目前的設定寫入 /etc/ccd.conf

ccdconfig -g > /etc/ccd.conf

如果 /etc/ccd.conf 存在,每次開機時 /etc/rc 都會執行 ccdconfig -C 。 如此便可自動設定 ccd(4) 以便之後掛上(mount)檔案系統。

注: 如果您開機時選擇進入單人模式(single mode),在掛上 (mount(8)) ccd(4) 的檔案系統之前您得先執行設定的指令:

ccdconfig -C

要在每次開機時自動掛上(mount) ccd(4),請在 /etc/fstab 加入 ccd(4)

/dev/ccd0c              /media       ufs     rw      2       2

18.4.1.2. Vinum 容量管理系統

Vinum 容量管理系統(以下簡稱 Vinum) 可視為一種虛擬磁碟。 它將區塊裝置(block device) 的介面與對應資料的方式切割開來,比起原本 slice 劃分的磁碟,Vinum 可增加了彈性、效能和穩定度 [1] vinum(8) 實作了 RAID-0、RAID-1 和 RAID-5 等模組, 它們都可以單獨使用,也可以互相搭配使用。

請見 µÚ 20 章 以參考更多關於 vinum(8) 的資訊。

18.4.2. 硬體 RAID

FreeBSD 也支援許多硬體 RAID 控制器。 這些控制器自行掌控一個小型的 RAID 系統, 因此不需要特定軟體來管理。

透過控制器上的 BIOS 幾乎能控制所有的操作。 接下來將簡單介紹如何設定 Promise IDE RAID 控制卡。首先確認控制卡已安裝,接著開機。 它應該會提示一些資訊[2]。依指示進入控制卡的設定畫面, 從這裡您可以將全部的硬體結合成一個大磁碟。完成之後,FreeBSD 將只會看到這個大磁碟。當然您也可以使用其它的 RAID 模式。

18.4.3. 重建(rebuild) ATA RAID1 陣列

FreeBSD 允許您熱插拔磁碟陣列裡壞掉的磁碟, 當然在重開機前就得先發現。

也許您會在 /var/log/messages(或 dmesg(8) 的輸出) 看到類似下面的訊息:

ad6 on monster1 suffered a hard error.
ad6: READ command timeout tag=0 serv=0 - resetting
ad6: trying fallback to PIO mode
ata3: resetting devices .. done
ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\
status=59 error=40
ar0: WARNING - mirror lost

請用 atacontrol(8) 來得到更多資訊:

# atacontrol list
ATA channel 0:
	Master:      no device present
	Slave:   acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0

ATA channel 1:
	Master:      no device present
	Slave:       no device present

ATA channel 2:
	Master:  ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
	Slave:       no device present

ATA channel 3:
	Master:  ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
	Slave:       no device present

# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED
  1. 首先您得將損壞磁碟所在的 ata channel 卸載(detach), 如此才能安全地移除:

    # atacontrol detach ata3
    
  2. 用好的磁碟換下損壞的。

  3. 重新載入(re-attach) ata channel:

    # atacontrol attach ata3
    Master:  ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
    Slave:   no device present
    
  4. 將新的磁碟加入原本的磁碟陣列成為備援(spare) 磁碟:

    # atacontrol addspare ar0 ad6
    
  5. 重建磁碟陣列:

    # atacontrol rebuild ar0
    
  6. 可以用下面指定來確認重建的進度:

    # dmesg | tail -10
    [output removed]
    ad6: removed from configuration
    ad6: deleted from ar0 disk1
    ad6: inserted into ar0 disk1 as spare
    
    # atacontrol status ar0
    ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed
    
  7. 等重建完就完成了。

[1]

譯註:原文這裡是用「和」,但要視實際使用方式而定。 例如用 RAID-0 就不會增加穩定度 :)。

[2]

譯註:例如按 F1 可以進入控制卡 BIOS 之類的資訊。

本文及其他文件,可由此下載:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。
關於本文件的問題,請洽詢 <doc@FreeBSD.org>。