Root On Vinum 軟體式磁碟陣列

前言

Root on Vinum 也就是能把系統也建立於軟體 RAID 中 (一般來說只有硬體 RAID 能將系統納入),下列圖表中只有 Mirror (RAID1) 能夠建立 Root on Vinum 也就是能把系統也建立於軟體 RAID 中 (一般來說只有硬體 RAID 能將系統納入),詳細原因請參考 FreeBSD Handbook - 22.8 Using Vinum for the Root Filesystem,另外從 FreeBSD 5.1-Release 開始請使用 bsdlabel 指令 (在這之前的版本指令為 disklabel)。







文章目錄

1、實作環境
2、安裝及設定
     2-1、步驟1 - 安裝 FreeBSD 時注意事項
     2-2、步驟2 - 開機便啟動 Vinum 服務 (/boot/loader.conf)
     2-3、步驟3 - 修改 HDD 成為 Vinum Volume
     2-4、步驟4 - 建立 RAID-1 (Mirror) Plex (For /dev/ad0)
     2-5、步驟5 - 檢查 Volume 分區是否正確
     2-6、步驟6 - 修改檔案系統設定檔 (/etc/fstab)
     2-7、步驟7 - 將第二顆 HDD 加入至 RAID-1 (Mirror) Plex
3、災難復原 Root On Vinum





1、實作環境

  • FreeBSD 5.3-RELEASE
  • Base System Vinum
  • Physical HDD * 2 顆
  • System: 4GB (/dev/ad0、/dev/ad1)
  • SWAP 128MB
  • 根目錄 (/) 3967MB





2、安裝及設定

2-1、步驟1 - 安裝 FreeBSD 時注意事項

本次實作其 FreeBSD 檔案系統僅切出根目錄 (/) 及 SWAP,而安裝 FreeBSD 時 先建立 SWAP (這樣 offset 就從 0 開始方便之後設定) 剩下的空間則全部切給根目錄 (/)。



2-2、步驟2 - 開機便啟動 Vinum 服務 (/boot/loader.conf)

安裝 FreeBSD 完成後於開機 Boot Menu 時選擇 4 進入 Singal User Mode 並修改 /boot/loader.conf 以便系統重新開機時便自動載入 Vinum 服務 (適用於 FreeBSD 5.x Release)。
mount -u /               //掛載根目錄
mount -a                 //掛載所有 Mount Point (適用於多 Slice)
vi /boot/loader.conf //加入如下二行
vinum_load="YES"
vinum.autostart="YES"  




2-3、步驟3 - 修改 HDD 成為 Vinum Volume

鍵入指令 bsdlabel 修改 HDD (/dev/ad0) 內容 swap offset、swap size、fstype 修改內容如下 (避免二個分區產生重疊的現象)。
修改 b: swap
  1. size:由 262144 修改至 261863 (因為 262144 - 281 = 261863)。
  2. offset:由 0 修改至 281。
新增 d: vinum
  1. size:8388497 (c: size 為 8388513 -16 = 8388497)。
  2. offset:16。

了解後開始進行修改 /dev/ad0s1 內容。
#bsdlabel -e /dev/ad0s1

修改前

修改後



2-4、步驟4 - 建立 RAID-1 (Mirror) Plex (For /dev/ad0)

在建立 Vinum 設定檔以前要注意待會要填入的 root 及 swap 的 len (size) 及 offset 數值。
root
  • len (size):8126369。
  • offset:262128 (因為 262144 - 16 = 262128)。
swap
  • len (size):261863。
  • offset:265 (因為 281 - 16 = 265)。

設定檔 (/etc/vinum.conf) RAID-1 (Mirror) 作法如下:
vi /etc/vinum.conf                              //建立 Vinum 設定檔,內容如下
 drive d0 device /dev/ad0s1d                       //指定 Drive
  volume root                                      //屆時對應到 /dev/vinum/root
   plex org concat                                 //指定 Plex 種類為 Concatenate
    sd len 8126369s driveoffset 262128s drive d0   //注意 size 及 offset 的值
  volume swap
   plex org concat                                 //指定 Plex 種類為 Concatenate
    sd len 261863s driveoffset 265s drive d0       //注意 size 及 offset 的值
 #vinum                                            //進入 Vinum Prompt
 vinum->list                                       //查看目前 Vinum 設定 (確定目前沒有任何 Vinum 設定)
 vinum->create -f /etc/vinum.conf                  //載入剛才建立的 Vinum 設定檔
 vinum->Ctrl+D or quit                             //離開 Vinum Prompt


當載入 Vinum 設定檔時可看到載入設定檔後的 Vinum 狀態如下:




2-5、步驟5 - 檢查 Volume 分區是否正確

跟前面實作不同之處在於,前面將 Vinum Plex 設定好後要執行 newfs 指令來初始化 Vinum Volume,而此時是執行 fsck 指令來檢查 Vinum Volume。為何有如此的差別? 因為目前是將作業系統一起製作成軟體 RAID 若您執行 newfs 指令會將作業系統給初始化 (清空所有資料),因此請執行 fsck 指令來檢查 Vinum Volume 並確保檢查結果為成功 (否則屆時會發生 Kernel Panic 的狀況),請鍵入如下 fsck 指令來開始檢查 Vinum Volume。
fsck -n -t ufs /dev/vinum/root  //檢查 Root Volume 是否正確

若您發現執行 fsck 指令來檢查 Vinum Volume 總是失敗時通常是在 Vinum 設定檔 (/etc/vinum.conf) 中可能 size 或 offset 數值計算錯誤所導致的。




2-6、步驟6 - 修改檔案系統設定檔 (/etc/fstab)

將 Device 從原本的 /dev/ad0 改為 /dev/vinum。
  • 將根目錄 (/) 由 /dev/ad0s1a 修改為 /dev/vinum/root
  • 將 swap 由 /dev/ad0s1b 修改為 /dev/vinum/swap
vi /etc/fstab
 #Device          Mountpoint  FStype  Options  Dump  Pass#
 /dev/vinum/swap  none        swap    sw       0     0   //修改後
 /dev/vinum/root  /           ufs     rw       1     1   //修改後


修改檔案系統設定檔 (/etc/fstab) 完成後請輸入 reboot 指令將系統重新開機吧 (現在您已經擁有具 RAID-1 功能的一顆 HDD 了)。



2-7、步驟7 - 將第二顆 HDD 加入至 RAID-1 (Mirror) Plex

  1. 開機倒數十秒畫面,按 4 進入 Single User Mode。
  2. 執行 mount -a 指令來載入所有 Mount Point。
  3. 針對 HDD (/dev/ad1) 執行 Fdisk 及 Label (同 步驟1.新增 HDD 成為 Vinum Drive 所述)。
  4. 執行 bsdlabel 修改 /dev/ad1 內容其 size 及 offset 數值 (同 步驟3.修改 HDD 成為 Vinum Volume 所述)。
  5. 建立新的 Vinum 設定檔 (/etc/vinum.conf.ad1) 為何要新增另一個 Vinum 設定檔? 因為 Vinum 的設定具有累加性,所以若您沒有新增另一個 Vinum 設定檔而是修改本來的 Vinum 設定檔,那麼當您載入 Vinum 設定檔時 Vinum 會以為 Drives 有四顆 HDD (新的 ad0,ad1 本來的 ad0,ad1)。
設定檔 (/etc/vinum.conf.ad1) RAID-1 (Mirror) 作法如下:
vi /etc/vinum.conf.ad1      //建立 Vinum 設定檔,內容如下
 drive d1 device /dev/ad1s1d   //指定 Drive
  volume root                  //屆時對應到 /dev/vinum/root
   plex org concat             //指定 Plex 種類為 Concatenate
    sd len 8126369s driveoffset 262128s drive d1  //注意 size 及 offset 的值 (同 ad0 的數值設定)
  volume swap
   plex org concat             //指定 Plex 種類為 Concatenate
    sd len 261863s driveoffset 265s drive d1 //注意 size 及 offset 的值 (同 ad0 的數值設定)
vinum                         //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf.ad1 //載入剛才建立的 Vinum 設定檔
 vinum -> start root.p1        //將 root.p0 資料同步至 root.p1
 vinum -> start swap.p1        //將 swap.p0 資料同步至 swap.p1
 vinum->Ctrl+D or quit         //離開 Vinum Prompt                
# reboot                        //命令系統重新開機 (Root On Vinum 建立完成)


  1. 當 HDD 狀態 (State) 為 Faulty 及 Stale 時則代表 root.p1 及 swap.p1 還沒進行資料同步。
  2. 當 HDD 狀態 (State) 為 R 百分比 (ex. R 6%) 時則代表 root.p1 及 swap.p1 正在進行資料同步中。
  3. 當 HDD 狀態 (State) 為 UP 時則代表 root.p1 及 swap.p1 資料同步完成。





3、災難復原 Root On Vinum

建立好 Root On Vinum 之後第一步當然就是先測試災難復原啦,以下為災難復原步驟 (以 /dev/ad1 損壞為例作說明):
1.開機倒數十秒畫面,按 4 進入 Single User Mode
2.執行 mount -a 指令來載入所有 Mount Point
3.損壞的 HDD 為 /dev/ad1 (進入 Vinum Prompt 模式後使用 list 指令來查看哪顆 HDD 損壞)
4.關機後更換新 HDD 再次執行上述步驟 1 ~ 3
5.將新 HDD 執行 Fdisk 及 Label (同 步驟1.新增 HDD 成為 Vinum Drive 所述)
     1.執行 bsdlabel 修改 /dev/ad1 內容其 size 及 offset 數值 (同 步驟3.修改 HDD 成為 Vinum Volume 所述)
     2.修改完成後進入 Vinum Prompt 後使用 list 指令確定 /dev/ad1 狀態如下
          1.Drives: State:referenced unknow A: 0/0MB
          2.Plexes: State:faulty
          3.Subdisks: State:stale、crashed
6.新增另一個 Vinum 設定檔 /etc/vinum.conf.ad1.recover (因為 Vinum 設定具有累加性),且此 Vinum 設定檔內容僅設定 Drive 部份即可。

設定檔 (/etc/vinum.conf.ad1.recover) RAID-1 (Mirror) 災難復原作法如下:
vi /etc/vinum.conf.ad1.recover  //建立 Vinum 設定檔,內容如下
 drive d1 device /dev/ad1s1d     //指定 Drive (僅此行即可)
vinum                           //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf.ad1..recover  //載入剛才建立的 Vinum 設定檔
 vinum -> start root.p1          //將 root.p0 資料同步至 root.p1
 vinum -> start swap.p1          //將 swap.p0 資料同步至 swap.p1
 vinum->Ctrl+D or quit           //離開 Vinum Prompt                
 #reboot                         //命令系統重新開機 (Root On Vinum 建立完成)


1.當 HDD 狀態 (State) 為 Faulty 及 Stale 及 Crashed 時則代表 root.p1 及 swap.p1 損壞中
     1.當 HDD 狀態 (State) 為 R 百分比 (ex. R 6%) 時則代表 root.p1 及 swap.p1 正在進行資料同步中
     2.當 HDD 狀態 (State) 為 UP 時則代表 root.p1 及 swap.p1

資料同步完成

2.執行 bsdlabel 修改 /dev/ad1 內容其 size 及 offset 數值 (同 步驟3.修改 HDD 成為 Vinum Volume 所述)。
3.載入 /etc/vinum.conf.ad1.recover 設定檔時 Drivers、Subdisks 狀態的變化。