(源自freebsdchina)在 FreeBSD 上使用軟 RAID-1

  有沒有想過為低端伺服器做軟 RAID?你或許想過在不購置硬 RAID 控制卡的前提下,通過磁片鏡像為你的工作站帶來冗餘保護。你是否有過痛苦的配置經歷,使你對 Unix 系統上的軟 RAID 卻步?
  FreeBSD 5.3 及更高的版本加入了 gmirror(8);它讓你輕易地配置使用軟 RAID 1。儘管 gmirror 已有不少教程,但我發現它們不是要求用 bsdlabel 來手動計算分區的大小就是要用到一張用以修正現有系統的軟碟。
  我以為在安裝作業系統的過程中配置 RAID 更為合理。我也希望配置步驟能做到易於理解並且不造成諸如計算出錯的人為錯誤。通過拼湊現有的說明文字,自己進行多方配置實驗後,我找到了在數個不同系統上都適用的配置步驟。我也從 gmirror 的編寫者 Pawel Jakub Dawidek 那裏得到了很有價值的回饋;他透露了 gmirror 一些尚未公開的特性。
GEOM 背景知識
  在介紹配置步驟之前,先瞭解一下 GEOM 是很有用的。GEOM 是 FreeBSD 5.0 引入的模組磁片構架。該模組構架允許通過編寫程式來操控磁片。FreeBSD 5.3 引入的軟 RAID 程式就是最好的例子。
  gstripe(8) 可做 RAID 0
  gmirror(8) 可做 RAID 1
  graid3(8) 可做 RAID 3
  以上的首字元 g 表示這些程式都利用到了 GEOM。
  注:若你不知道 RAID 為何物,則可參閱 Webopedia 有關定義不同 RAID 的鏈結 http://www.webopedia.com/TERM/R/RAID.html
  man 4 geom 述說了 geom 所用到的磁片術語;在設置 gmirror 的過程中,我們將會看到一些。它們包括:
  provider -- 該 GEOM 實體在 /dev 下出現。本文將介紹如何創建 /dev/mirror/gm0 這個 provider,它代表磁片鏡像或雙工。
  consumer -- 該實體接收 I/O 請求。在鏡像/雙工的例子中,這指的就是兩塊硬碟。我用兩根資料線分別連接兩塊 IDE 硬碟,得到 /dev/ad0 和 /dev/ad2。
  metadata (元資料) -- 在不同的 RAID 中,它包括陣列成員及其尺寸、位置,邏輯磁片及分區的描述和磁碟陣列的當前狀態。
  鏡像/雙工 -- RAID 1 保持兩塊硬碟的資料一致。換句話說,它將一塊硬碟的資料鏡射到另一塊硬碟。若兩塊硬碟同接在一根 IDE 資料線上,則稱為鏡像;若兩塊硬碟接在不同的資料線上,則稱為雙工。因為單一資料線易造成單點故障,所以採用雙工的占大多數。
在安裝作業系統的過程中配置鏡像/雙工
  若你打算用 RAID 1,為避免節外生枝,購置兩塊一模一樣的硬碟(相同的型號和尺寸)。若型號或尺寸不一致,事情將會變得很複雜;就算經過艱辛的配置成事了,到頭來,你只能以浪費較大硬碟多出來的空間收場。將一個作為第一主盤,另一個作為第二主盤,接好兩塊一樣的硬碟。在安裝作業系統之前,再次檢查 CMOS 是否已認出兩塊硬碟。
  按自己喜歡的安裝方式開始安裝 FreeBSD 任一版本(5.3 或以上)。到了 Select Drives (選定硬碟)功能表時,將會顯示 ad0 和 ad2。選 ad0,因為你將把作業系統安裝於該主盤上。
  進入 fdisk 介面後,刪除所有現存的分區,然後選 Use entire disk (使用整個磁片)。當提示啟動功能表時,選 Standard MBR (標準 MBR)。
  來到 disklabel 介面時,根據自己的需要將 ad0 分區。若不知道該怎麼做,選 a 讓系統自動分區。然後選擇預設的安裝套件和安裝媒體源,讓作業系統如常安裝。
  安裝完畢後,流覽到 postinstall configurations (後安裝配置)設置你的時區,創建用戶帳號,設定 root 的密碼等。
  不過,當回到 sysinstall 主功能表時,不要急於重啟系統。按下 Alt-F4,進入命令提示行。我們首先鍵入 csh 命令,這樣就得到一個帶歷史記錄的 shell (默認的 shell 是 Bourne)。
  創建鏡像/雙工很簡單,只要鍵入:
  # gmirror label -v -b round-robin gm0 /dev/ad0
  其中,gmirror label 創建鏡像;-v 開啟冗長模式;-b round-robin 選用平衡演算法(目前 round-robin 演算法性能最佳);gm0 即鏡像/雙工的名稱(該名稱代表第一個 GEOM 鏡像);/dev/ad0 代表用以鏡射的源盤。
  然而,若現在便鍵入命令會使你失望。
  # gmirror label -v -b round-robin gm0 /dev/ad0
  Can't store metadata on /dev/ad0: Operation not permitted
  (無法將元資料保存於 /dev/ad0 上:禁止操作)
  這是一種安全特性,表示磁片已被載入以便寫入;因此不可用。不過,你可通過 sysctl MIB,暫時讓 gmirror 繞過這個特性,從而創建鏡像/雙工。
  # sysctl kern.geom.debugflags=16
  kern.geom.debugflags: 0 -> 16
  不用擔心,系統重啟後(數分鐘後的事),該 MIB 將復位為 0。再來一次:
  # gmirror label -v -b round-robin gm0 /dev/ad0
  Metadata value stored on /dev/ad0
  就這樣,RAID 1 配置告成。
  我們有必要讓作業系統每次重啟時自動裝載 RAID。這需要修改兩個檔。第一個文件當前是空的,用 echo 創建即可:
  # echo geom_mirror_load="YES" > /boot/loader.conf
  第二個檔 /etc/fstab 不是空的,所以我建議在修改前做個備份:
  # cp /etc/fstab /etc/fstab.orig
  # vi /etc/fstab
  將所有 ad 改為 gm,在 /dev 後插入 mirror。比如將 /dev/ad0s1a 改為 /dev/mirror/gm0s1a。如果沒有創建別的分區,你會看到以 a, b, d, e 和 f 結尾的五個 ad0s1 分區;你需要逐一修改。
  修改完畢後,再仔細檢查對 /etc/fstab 及 /boot/loader.conf 作出的更改。雖說事後可以修正,但是因敲錯一個字而不能啟動新的系統是很煩的事。
  注:有些教程說過需要在 /etc/rc.conf 中加入 swapoff 選項。現已沒必要。同樣地,沒必要將 shutdown -r now 當成 reboot 來用。
  確定沒有錯誤之後,取出安裝盤後,按下 Alt+F1 退出安裝功能表。
啟用鏡像/雙工
  若你注意看啟動資訊,在系統讀出磁片資訊後,你應看到以白色粗體字顯示的資訊:
  GEOM_MIRROR: Device gm0 created (id=2125638583).
  GEOM_MIRROR: Device gm0: provider ad0 detected.
  GEOM_MIRROR: Device gm0: provider ad0 activated.
  GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
  GEOM_MIRROR: Device gm0 already configured.
  Mounting root from ufs:/dev/mirror/gm0s1a
  系統啟動還在繼續。不過,若在 /etc/fstab 敲錯了一個字,啟動過程將就此停止並等待你輸入正確的資訊。在下面例子中,我在修改 /etc/fstab 時忘了插入 mirror 一詞,即將本應為 /dev/mirror/gm0s1a 的誤作 /dev/gm0s1a,這樣,FreeBSD 便不能找到我的根檔系統。
  Mounting root from ufs:/dev/gm0s1a
  setrootbyname failed
  ffs_mountroot: can't find rootvp
  Root mount failed: 6
  
  Manual root filesystem specification:
    <fstype>:<device>  Mount <device> using filesystem <fstype>
              e.g. ufs:da0s1a
    ?             List valid disk boot devices
    <empty line>       Abort manual input
  
  mountroot>
  所幸的是,它並不是看起來那麼可怕。可以從列出有效的啟動分區入手處理故障:
  mountroot> ?
  
  List of GEOM managed disk devices:
    mirror/gm0s1f mirror/gm0s1e mirror/gm0s1d mirror/gm0s1c mirror/gm0s1b
  mirror/gm0s1a mirror/gm0s1 ad2s1 mirror/gm0 ad0s1 ad2 acd0 ad0 fd0
  若你正確輸入 / 檔系統的位置,它將繼續啟動(boot,原文誤作 reboot)下去。
  mountroot> ufs:/dev/mirror/gm0s1a
  Mounting root from /dev/mirror/gm0s1a
  
  登入之後,先更正 /etc/fstab 的誤處並重新啟動。正常啟動且成功登入後,鍵入以下命令確定鏡像的每個分區已被成功載入。
  % df -h
  Filesystem            Size    Used    Avail    Capacity    Mounted on
  /dev/mirror/gm0s1a    248M     35M     193M       15%        /
  devfs                 1.0K    1.0K       0B      100%        /dev
  /dev/mirror/gm0s1e    248M     12K     228M        0%        /tmp
  /dev/mirror/gm0s1f    7.3G     99M     6.7G        1%        /usr
  /dev/mirror/gm0s1d    248M    196K     228M        0%        /var
  df 不顯示交換分區的資訊,可以用以下命令核實:
  % swapinfo
  Device                1K-blocks    Used    Avail    Capacity
  /dev/mirror/gm0s1b       629544       0   629544        0%
同步鏡像/雙工
  剩下的事就是同步兩塊硬碟的資料了。只要鍵入向鏡像插入第二塊硬碟的命令,資料同步將自動進行。
  # gmirror insert gm0 /dev/ad2
  GEOM_MIRROR: Device gm0: provider ad2 detected.
  GEOM_MIRROR: Device gm0: rebuilding provider ad2.
  看看進展如何:
  # gmirror list | more
  Geom name: gm0
  State: DEGRADED
  Components: 2
  Balance: round-robin
  Slice: 4096
  Flags: NONE
  GenID: 0
  SyncID: 1
  ID: 2125638583
  Providers:
  1. Name: mirror/gm0
     Mediasize: 10262568448 (9.6G)
     Sectorsize: 512
     Mode: r6w5e2
  Consumers:
  1. Name: ad0
     Mediasize: 10262568448 (9.6G)
     Sectorsize: 512
     Mode: r1w1e1
     State: ACTIVE
     Priority: 0
     Flags: DIRTY
     GenID: 0
     SyncID: 1
     ID: 3986018406
  2. Name: ad2
     Mediasize: 10262568448 (9.6G)
     Sectorsize: 512
     Mode: r1w1e1
     State: SYNCHRONIZING
     Priority: 0
     Flags: DIRTY, SYNCHRONIZING
     GenID: 0
     SyncID: 1
     Synchronized: 1%
     ID: 1946262342
  注意看 Flags 行上的 SYNCHRONIZING 字眼。這兩塊硬碟的資料要同步需要一些時間,如當前所示才一個百分點。據我所知,10GB 的硬碟大約需時 30 分鐘,75GB 的約需兩個半小時。若你覺得好奇,查查進度:
  # gmirror status
  Name    Status    Components
  mirror/gm0    DEGRADED    ad0
              ad2 (2%)
  資料同步完畢後,你將看到以白色粗體字顯示的系統資訊:
  GEOM_MIRROR: Device gm0: rebuilding provider ad2 finished.
  GEOM_MIRROR: Device gm0: provider ad2 activated.
  若再次輸入 gmirror list,你會看到 State (狀態) 已從 DEGRADED (已降級) 變成 COMPLETE (完畢),Synchronized (已同步) 一行已不見了。若在 Flags 行上看到 DIRTY (不乾淨) 字眼,不用擔心;那僅表示系統已寫入新的資料但尚未完成鏡射。若你在磁片平靜下來後等數秒鐘,則你將會看到 Flags 行變成了 NONE (無)。
  重啟系統,最後檢查一下。
  這回啟動資訊應包含以下這些:
  GEOM_MIRROR: Device gm0 created (id=2125638583).
  GEOM_MIRROR: Device gm0: provider ad0 detected.
  GEOM_MIRROR: Device gm0: provider ad2 detected.
  GEOM_MIRROR: Device gm0: provider ad0 activated.
  GEOM_MIRROR: Device gm0: provider ad2 activated.
  GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
  Mounting root from ufs:/dev/mirror/gm0s1a
  
結語
  GEOM 實用程式在日益進步,它的開發者不斷地將新特性及更新上傳到網頁去。利用 cvsup 更新你手上的 FreeBSD 版本或在決定安裝 FreeBSD 時選用最新的版本是很重要的。
  若你想取得鏡像/雙工的性能資料,用 gstat(8)。通讀 gmirror(8) 的說明文字也是值得倡議的,特別是在你想瞭解如何更換一塊壞硬碟的情況下。
來源:freebsdchina