站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

Vinum-軟體 RAID

前言

磁碟機陣列組 (RAID, Redundant Array of Independent Disks)

Vinum 名詞

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

_ConcatenateRAID0RAID1RAID5RAID10
PlexConcatenateStriped 279kConcatenate + ConcatenateRaid5 279kStriped 279k + Striped 279k
Drives (HDD)332234
Volume111211
Plex112412
Subdisk332434
Root on VinumNone None None Yes None None

實作環境

安裝及設定

本次實作將分為 (建立軟體 RAID、災難復原軟體 RAID、Root On Vinum、災難復原 Root On Vinum) 二個部份作說明,主因為軟體 RAID 部份沒有將作業系統包含在內,而 Root On Vinum 則是有將作業系統包含在內。

建立軟體 RAID

步驟1.新增 HDD 成為 Vinum Drive

依序鍵入如下指令來新增/格式化三顆 1GB HDD (/dev/ad1、/dev/ad2、/dev/ad3) 成為 Vinum Drive,完成後我們可以利用 df -h 指令來查看目前系統的 Mount Point 是否已將三顆 1GB HDD (/dev/ad1、/dev/ad2、/dev/ad3) 加入了。

 #/stand/sysinstall
 #Configure
 #Fdisk >> ad1 >> D = Delete Slice >> A = Use Entire Disk (整顆都拿來用) >> Q = Finish >> None >> OK
 #Label >> C = Create >> ad1s1d /disk2 1024MB UFS2+S Y >> W = Write >> WARNING: YES >> Q = Finish >> 離開 sysinstall

新增 HDD 成為 Vinum Drive

步驟2.修改 HDD 成為 Vinum Volume

鍵入指令 bsdlabel 將三顆 1GB HDD (/dev/ad1、/dev/ad2、/dev/ad3) 種類 (fstype) 從 Vinum Drive (4.2 BSD) 修改為 Vinum Volume (vinum)

 #bsdlabel -e /dev/ad1s1       //將 4.2BSD 修改為 vinum
 #bsdlabel -e /dev/ad2s1       //將 4.2BSD 修改為 vinum
 #bsdlabel -e /dev/ad3s1       //將 4.2BSD 修改為 vinum

修改前 fstype: 4.2 BSD 修改後 fstype: vinum

步驟3.建立各種 Vinum Plex

在此步驟中自行選擇您所要產生的 Vinum Plex 種類而產生 Vinum Plex 的方式有二種 (直接設定、設定檔),不同點在於自動規劃硬碟空間或手動規劃硬碟空間。

  1. 直接設定 (直接輸入指令):自動規劃整顆 HDD 容量
  2. 設定檔 (/etc/vinum.conf):手動規劃分配每顆 HDD 容量

步驟3-1.建立 Concatenate Plex

建立 Concatenate Vinum Plex 也就是單純將三顆 HDD (/dev/ad1、/dev/ad2、/dev/ad3) 空間相加,其資料寫入方式為一顆 HDD 空間寫完 (滿了) 才換另一顆 HDD,資料寫入方式如下圖: (Concatenate 圖片引用來源為 [FreeBSD Handbook - Chapter 21 The Vinum Volume Manager - 21.3 Access Bottlenecks])

Concatenate

 #vinum                                                 //進入 Vinum Prompt
 vinum->concat -v /dev/ad1s1d /dev/ad2s1d /dev/ad3s1d   //將三顆 HDD 使用 Concatenate 方式連結起來
 vinum->start                                           //更新設定至 Drive
 vinum->list                                            //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                  //離開 Vinum Prompt
 #vi /etc/vinum.conf                                    //建立 Vinum 設定檔,內容如下
 drive ad1 device /dev/ad1s1d                           //指定 Drive
 drive ad2 device /dev/ad2s1d
 drive ad3 device /dev/ad3s1d
 volume concat                                          //屆時對應至 /dev/vinum/concat
  plex org concat                                       //指定 Plex 種類為 Concatenate
    sd length 1023m drive  ad1                          //指定 Subdisk Size為  1023 MB
    sd length 1023m drive  ad2
    sd length 1023m drive  ad3
 #vinum                                                 //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf                       //載入剛才建立的 Vinum 設定檔
 vinum->start                                           //更新設定至 Drive
 vinum->list                                            //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                  //離開 Vinum Prompt

因為此次實作都是將 HDD 全部容量規劃給 Vinum 所以不管採用方式一或方式二得到的結果皆相同,如下圖所示

Concatenate Vinum Plex

步驟3-2.建立 RAID-0 (Stripe) Plex

建立 RAID-0 (Stripe) Vinum Plex 也就是將三顆 HDD (/dev/ad1、/dev/ad2、/dev/ad3) 空間相加,其資料寫入方式為將資料寫入不同 HDD 因此 I/O 速度加快,資料寫入方式如下圖: (RAID-0 (Stripe) 圖片引用來源為 [FreeBSD Handbook - Chapter 21 The Vinum Volume Manager - 21.3 Access Bottlenecks])

RAID-0 (Stripe)

 #vinum                                                 //進入 Vinum Prompt
 vinum->stripe -v /dev/ad1s1d /dev/ad2s1d /dev/ad3s1d   //將三顆 HDD 使用 Stripe 方式連結起來
 vinum->start                                           //更新設定至 Drive
 vinum->list                                            //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                  //離開 Vinum Prompt
 #vi /etc/vinum.conf                                    //建立 Vinum 設定檔,內容如下
 drive ad1 device /dev/ad1s1d                           //指定 Drive
 drive ad2 device /dev/ad2s1d
 drive ad3 device /dev/ad3s1d
 volume stripe                                          //屆時對應至 /dev/vinum/stripe
  plex org striped   279k                               //指定 Plex 種類為 Stripe 資料交錯區塊為 279k (當寫入資料達 279k 就換寫另一顆 HDD)
   sd length 1023m drive  ad1                           //指定 Subdisk Size為 1023 MB
   sd length 1023m drive  ad2
   sd length 1023m drive  ad3
 #vinum                                                 //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf                       //載入剛才建立的 Vinum 設定檔
 vinum->start                                           //更新設定至 Drive
 vinum->list                                            //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                  //離開 Vinum Prompt

因為此次實作都是將 HDD 全部容量規劃給 Vinum 所以不管採用方式一或方式二得到的結果皆相同,如下圖所示

RAID-0 (Stripe) Vinum Plex

步驟3-3.建立 RAID-1 (Mirror) Plex

建立 RAID-1 (Mirror) Vinum Plex 也就是二顆 HDD (/dev/ad1、/dev/ad2) 內的資料一模一樣,其資料寫入方式為同一份資料同時寫入二顆 HDD 內(Concatenate + Concatenate)

 #vinum                                                 //進入 Vinum Prompt
 vinum->mirror -v /dev/ad1s1d /dev/ad2s1d               //將二顆 HDD 使用 Mirror 方式建立鏡射
 vinum->start                                           //更新設定至 Drive
 vinum->list                                            //查看目前 vinum 設定
 vinum->Ctrl+D or quit                                  //離開 Vinum Prompt
 #vi /etc/vinum.conf                                    //建立 Vinum 設定檔,內容如下
 drive ad1 device /dev/ad1s1d                           //指定 Drive
 drive ad2 device /dev/ad2s1d
 volume mirror                                          //屆時對應至 /dev/vinum/mirror
  plex org concat                                       //指定 Plex 種類為 Concatenate
   sd length 1023m drive  ad1                           //指定 Subdisk Size為 1023 MB
  plex org concat 
   sd length 1023m drive  ad2
 #vinum                                                 //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf                       //載入剛才建立的 Vinum 設定檔
 vinum->start                                           //更新設定至 Drive
 vinum->list                                            //查看目前 Vinum 設定
 vinum->start mirror.p1                                 //啟動 mirror.p1 進行資料同步 (同步 mirror.p0 的資料)
 vinum->Ctrl+D or quit                                  //離開 Vinum Prompt

因為此次實作都是將 HDD 全部容量規劃給 Vinum 所以不管採用方式一或方式二得到的結果皆相同,如下圖所示

RAID-1 (Mirror) Vinum Plex

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

未進行資料同步 資料同步中 資料同步完成

步驟3-4.建立 RAID5 (Rotated Block-Interleaved Parity) Plex

建立 RAID5 (Rotated Block-Interleaved Parity) Vinum Plex 也就是將三顆 HDD (/dev/ad1、/dev/ad2、/dev/ad3) 在將資料寫入達 279k 時便寫入一個同位檢查元 (Parity) 來避免當有其中一顆 HDD 損壞時還能保持資料的一致性,也因為這樣的機制所以三顆 HDD 完成 RAID-5 後只能得到二顆 HDD 相加的空間,資料寫入方式如下圖: (RAID-5 圖片引用來源為 [FreeBSD Handbook - Chapter 21 The Vinum Volume Manager - 21.4 Data Integrity])

RAID-5

 #vinum                                               //進入 Vinum Prompt
 vinum->raid5 -v /dev/ad1s1d /dev/ad2s1d /dev/ad3s1d  //將三顆 HDD 使用 RAID-5 方式連結
 vinum->start vinum0.p0                               //啟動 RAID-5 初始設定
 vinum->list                                          //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                //離開 Vinum Prompt
  1. 當 HDD 狀態 (State) 為 DownInitEmpty 時則代表 vinum0.p0.so 及 vinum0.p0.s1 及 vinum0.p0.s2 還沒進行 RAID-5 初始設定
  2. 當 HDD 狀態 (State) 為 UP 時則代表 mirror.p0.so 及 mirror.p0.s1 及 mirror.p0.s2 完成 RAID-5 初始設定

沒進行 RAID-5 初始設定 完成 RAID-5 初始設定

 #vi /etc/vinum.conf                                  //建立 Vinum 設定檔,內容如下
 drive ad1 device /dev/ad1s1d                         //指定 Drive
 drive ad2 device /dev/ad2s1d
 drive ad3 device /dev/ad3s1d
 volume raid5                                         //屆時對應至 /dev/vinum/raid5
  plex org raid5   279k                               //指定 Plex 種類為 RAID-5 (當寫入資料達 279k 就寫入同位檢查元 Parity)
   sd length 1023m drive  ad1                         //指定 Subdisk Size為 1023 MB
   sd length 1023m drive  ad2
   sd length 1023m drive  ad3
 #vinum                                               //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf                     //載入剛才建立的 Vinum 設定檔
 vinum->start raid5.p0                                //啟動 RAID-5 初始設定
 vinum->list                                          //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                //離開 Vinum Prompt
  1. 當 HDD 狀態 (State) 為 DownInitEmpty 時則代表 raid5.p0.so 及 raid5.p0.s1 及 raid5.p0.s2 還沒進行 RAID-5 初始設定
  2. 當 HDD 狀態 (State) 為 UP 時則代表 raid5.p0.so 及 raid5.p0.s1 及 raid5.p0.s2 完成 RAID-5 初始設定

沒進行 RAID-5 初始設定 完成 RAID-5 初始設定

步驟3-5.建立 RAID-10 (Stripe + Mirror) Plex

建立 RAID-10 (RAID-0 Stripe + RAID-1 Mirror) Vinum Plex 也就是將四顆 SCSI HDD (/dev/da0、/dev/da1、/dev/da2、/dev/da3) 運用 Stripe + Mirror 技術將資料寫入不同 HDD (I/O 速度加快) 同時又同步 HDD 內的資料,來避免當有其中一顆 HDD 損壞時還能保持資料的一致性,也因為這樣的機制所以四顆 HDD 完成 RAID-10 後只能得到二顆 HDD 相加的空間。

 #vinum                                                                 //進入 Vinum Prompt
 vinum->mirror -v -s /dev/da0s1d /dev/da1s1d /dev/da2s1d  /dev/da3s1d   //將四顆 HDD 使用 RAID-10 方式連結
 vinum->start                                                           //更新設定至 Drive
 vinum->list                                                            //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                                  //離開 Vinum Prompt
  1. 當 HDD 狀態 (State) 為 FaultyEmpty 時則代表 vinum0.p0.so 及 vinum0.p0.s1 及 vinum0.p1.s0 及 vinum0.p1.s1 還沒進行 RAID-10 初始設定
  2. 當 HDD 狀態 (State) 為 UP 時則代表 vinum0.p0.so 及 vinum0.p0.s1 及 vinum0.p1.s0 及 vinum0.p1.s1 完成 RAID-10 初始設定

完成 RAID-10 初始設定

 #vi /etc/vinum.conf                                                    //建立 Vinum 設定檔,內容如下
 drive d0 device /dev/da0s1d                                            //指定 Drive
 drive d1 device /dev/da1s1d
 drive d2 device /dev/da2s1d
 drive d3 device /dev/da3s1d
  volume raid10                                                         //屆時對應至 /dev/vinum/raid10
   plex org striped 279k                                                //指定 Plex 種類為 Stripe
    sd length 1023m drive d0
    sd length 1023m drive d2
   plex org striped 279k
    sd length 1023m drive d1
    sd length 1023m drive d3
 #vinum                                                                 //進入 Vinum Prompt
 vinum->create -f /etc/vinum.conf                                       //載入剛才建立的 Vinum 設定檔
 vinum->start raid10.p1                                                 //更新設定至 Drive
 vinum->list                                                            //查看目前 Vinum 設定
 vinum->Ctrl+D or quit                                                  //離開 Vinum Prompt
  1. 當 HDD 狀態 (State) 為 FaultyEmpty 時則代表 raid10.p0.so 及 raid10.p0.s1 及 raid10.p1.s0 及 raid10.p1.s1 還沒進行 RAID-10 初始設定
  2. 當 HDD 狀態 (State) 為 UP 時則代表 raid10.p0.so 及 raid10.p0.s1 及 raid10.p1.s0 及 raid10.p1.s1 完成 RAID-10 初始設定

沒進行 RAID-10 初始設定 開始進行 RAID-10 初始設定

步驟3-6.查看 Vinum Plex Log

當設定完成您所要的 Vinum Plex 後您可透過 Vinum Log 來查看完整的 Vinum 產生記錄

 #more /var/log/vinum_history        //查看 Vinum Log

採用直接設定 Vinum Plex 方式常用指令說明

步驟3-7.清除 Vinum Plex 設定

當您設定好 Vinum Plex 後在尚未進行初始化 Vinum Volume 以前您可隨時更改您的 Vinum Plex 種類,下列步驟為清除 Vinum Plex 設定

 #vinum                              //進入 Vinum Prompt
 vinum->resetconfig                  //清除 Plex 設定 (系統警告將清除所有設定!!)
 WARNING!  This command will completely wipe out your vinum configuration.
 All data will be lost.  If you really want to do this, enter the text
 NO FUTURE
 Enter text ->                       //鍵入 NO FUTURE 後按下 Enter
 Vinum configuration obliterated     //顯示清除 Vinum Plex 設定
 vinum->list                         //查看目前 Vinum 設定
 0 drives:                           //可發現沒有任何 Vinum Plex 設定
 0 volumes:
 0 plexes:
 0 subdisks:

步驟4.初始化 Vinum Volume

在上述步驟中設定好您要的 Vinum Plex 種類後,請執行如下指令來進行初始化 Vinum 分割區的動作。

 #newfs /dev/vinum/vinum0             //初始化 Volume (類似如下數據)
 /dev/vinum/vinum0: 19535.4MB (40008600 sectors) block size 16384, fragment size 2048
 using 107 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
 super-block backups (for fsck -b #) at:
 160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976,  3387328, 3763680, 4140032, 4516384, 4892736,
 5269088, 5645440, 6021792, 6398144, 6774496, 7150848, 7527200, 7903552,  8279904, 8656256, 9032608, 9408960, 9785312,
 10161664, 10538016, 10914368, 11290720, 11667072, 12043424, 12419776, 12796128, 13172480, 13548832, 13925184, 14301536,
 14677888, 15054240, 15430592, 15806944, 16183296, 16559648, 16936000, 17312352, 17688704, 18065056, 18441408, 18817760,

完成 Vinum Volume 初始化之後我們可以嘗試將該 Volume 掛載來使用

 #mount /dev/vinum/vinum0 /filecenter

步驟5.修改檔案系統設定檔 (/etc/fstab)

將 Vinum Volume 初始化完成並且順利掛載後,為了屆時若系統重新開機時便能自動將 Vinum Volume掛載使用,請修改檔案系統設定檔 (/etc/fstab)

 #vi /etc/fstab
 /dev/vinum/vinum0       /filecenter           ufs     rw              2       2 //加入此行

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

修改 /boot/loader.conf 以便系統重新開機時便自動載入 Vinum 服務 (適用於 FreeBSD 5.x Release)

 #vi /boot/loader.conf
 vinum_load="YES"
 vinum.autostart="YES"

一般來說在 FreeBSD 中要啟動服務是修改 /etc/rc.conf 但此次實作的 FreeBSD 5.x Release 無法透過設定 /etc/rc.conf 中的 start_vinum="YES" 來帶起 Vinum 服務,若使用此方式嘗試帶起 Vinum 服務則系統將無法正確開機並出現如下錯誤訊息。

 Fatal trap 12: page fault while in kernel mode
 fault virtual address   =0x0
 fault code              = supervisor read, page not present
 instruction pointer     = 0x8:0xc05dcb1c
 stack pointer           = 0x10:0xcbcfecac
 frame pointer           = 0x10:0xcbcfecc4
 code segment            = base 0x0, limit 0xfffff, type 0x1b
                         = DPL 0, pres 1, def32 1, gran 1
 processor eflags        = interrupt enabled, resume, IOPL = 0
 current process         = 4 (g_down)
 trap number             = 12
 panic: page fault
 Cannot dump. No dump device defind.
 Automatic reboot in 15 seconds - press a key on the console to abort

災難復原軟體 RAID

建立好軟體 RAID 之後第一步當然就是先測試災難復原啦,以下災難復原步驟將以 Rebuild RAID-5 為例

  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. 執行 umount /ad1 指令修改 fstype 狀態從 4.2 BSD 修改為 vinum (同 步驟2.修改 HDD 成為 Vinum Volume 所述)
    2. 修改完成後進入 Vinum Prompt 後使用 list 指令確定 /dev/ad1 狀態如下
      1. Drives: State:referenced unknow A: 0/0MB
      2. Plexes: State:degraded
      3. Subdisks: State:stale
  6. 在 Vinum Prompt 模式下執行 create -f 設定檔指令可看到 drive ad1 的狀態變化如下 (修改 unknow 為 /dev/ad1s1d)
    1. drive ad1 device /dev/ad1s1d: HDD 正常情況下
    2. drive ad1 device unknown: HDD 損壞後變成 unknow
  7. 將 unknow 修改為 /dev/ad1s1d 後 Vinum 會出現訊息 ad1 State 變為 UP
  8. 在 Vinum Prompt 模式下執行 start vinum0.p0 來執行 Rebuild RAID-5 (此時打 list 指令可看到重建 RAID-5 百分比)

Root On Vinum

Root on Vinum 也就是能把系統也建立於軟體 RAID 中 (一般來說只有硬體 RAID 能將系統納入),詳細原因請參考 [FreeBSD Handbook - 17.9 Using Vinum for the Root Filesystem]

步驟1.安裝 FreeBSD 時注意事項

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

步驟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"   

步驟3.修改 HDD 成為 Vinum Volume

鍵入指令 bsdlabel 修改 HDD (/dev/ad0) 內容 swap offsetswap sizefstype 修改內容如下 (避免二個分區產生重疊的現象)

  1. 修改 b: swap
    1. size:由 262144 修改至 261863 (因為 262144 - 281 = 261863)
    2. offset:由 0 修改至 281
  2. 新增 d: vinum
    1. size:8388497 (c: size 為 8388513 -16 = 8388497)
    2. offset:16

了解後開始進行修改 /dev/ad0s1 內容

 #bsdlabel -e /dev/ad0s1

修改前 修改後

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

在建立 Vinum 設定檔以前要注意待會要填入的 root 及 swap 的 len (size) 及 offset 數值

設定檔 (/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 狀態如下

載入 /dev/ad0 設定

步驟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 檢查成功

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

fsck 檢查失敗

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

將 Device 從原本的 /dev/ad0 改為 /dev/vinum

 #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 了)

步驟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) 為 FaultyStale 時則代表 root.p1 及 swap.p1 還沒進行資料同步
  2. 當 HDD 狀態 (State) 為 R 百分比 (ex. R 6%) 時則代表 root.p1 及 swap.p1 正在進行資料同步中
  3. 當 HDD 狀態 (State) 為 UP 時則代表 root.p1 及 swap.p1 資料同步完成

沒進行資料同步 資料同步中 資料同步完成

災難復原 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) 為 FaultyStaleCrashed 時則代表 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 狀態的變化

/dev/ad1 損壞中 修改 /dev/ad1 成為 Vinum Volume 載入 /etc/vinum.conf.ad1.recover 設定檔

參考

[無廢話 FreeBSD vinum 實戰 作者:clive]

[Vinum官網]

[FreeBSD Handbook]

[Daemon News : Software RAID for BSD: Vinum]

[DouZhe.com - 【心得】FREEBSD下VINUM做软RAID过程 - 中国Unix技术社区]

[A bootstrapped RAID-1 setup using Vinum]

[FreeBSD Software RAID GEOM Vinum]

[ Problem Report kern/80805 : vinum does not start at boot and may even cause a kernel panic]

[5.4 + GVINUM + RAID5 = Good?]

[vinum]

[vinum: Inappropriate ioctl for device]

[vinum or gvinum]

[vinum volume manager]

[vinum.autostart problem]

[i386/73624: Vinum not detecting drives on reboot]

[Problem Report i386/73624 : Vinum not detecting drives on reboot]

[FreeBSD vinum RAID5 ボリュームの rebuild のやりかたメモ]

[Recovering Gvinum RAID5 after a crash]

[gvinum: raid5 rebuild hangs on md disk]

[Panic after trying to recover from drive failure with geom_vinum]

[16.4 RAID]

[DragonFly On-Line Manual Pages : vinum (8)]

[gvinum: raid5 rebuild hangs on md disk]

Me FAQ

Q1.freebsd 5.4 無法使用vinum?

Error Message:

5.4無法使用 vinum 怎麼做都是有問題,經測試後發現使用 gvinum 便可順利執行,而 gvinum 的建立方式跟 vinum 沒差多少以下是差異點。

Ans:

其實跟 vinum 沒差多少,原則上就是注意一下路徑的不同即可

  1. 建立vinum plex若是建立 raid5 則無法直接下 raid5 會說 unknow
  2. 設定檔就跟 vinum.conf 內容一樣即可,當然要叫做 /etc/gvinum.conf
  3. 初始化 vinum 分割區執行 newfs /dev/gvinum/raid5
  4. 開機自動啟動則是修改/boot/loader.conf 加入 geom_vinum_load="YES"即可
  5. 記得修改/etc/fstab
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com