LVM 和 RAID

  Linux

Advanced Chapter 5 : LVM 和 RAID

阿旺的 Linux 開竅手冊
http://wanggen.myweb.hinet.net/ach5/ach5.html

5.0 LVM 邏輯卷冊 
LVM 原理
pvcreate 建立 PV
vgcreate 建立 VG
lvcreate 建立 LV
 Linear Volume 線性模式
 Stripe Volume 交織模式
 Mirror Volume 鏡像模式
 Snapshot Volume 快照模式
LVM 遷移/備份
5.1 RAID 磁碟陣列
 Hardware-RAID
 Soft-RAID
 Semi-Hardware-RAID
RAID 硬碟的選擇
RAID Levels
RAID 0 (stripe)
RAID 1 (mirror)
RAID 降級
Spare-Disk預備硬碟
RAID 5
RAID 5 的不可復原錯誤
RAID 6
混合 RAID(Hybrid RAID)
5.2 Linux Soft RAID 軟硬磁碟陣列
mdadm 建立/管理 Software-RAID 
Create 模式,建立 Software-RAID 
 /etc/mdadm.conf 編輯 RAID 設定檔
 /proc/mdstat 監控 Soft-RAID
Mmanage 模式,管理 Software-RAID
Assemble 模式,重啟之前建立的 RAID
Monitor 模式,監控 Software-RAID
Grow 模式,改變 RAID 大小
Misc 雜項模式
不特定模式
mdadm 建立混合 RAID

 

LVM 和 RAID


5.0 LVM 邏輯卷冊
就算有經驗的老手在安裝系統時也一樣會遇到 partition 要如何規劃的困擾,如很難評估幾年後〝/home〞會有多少帳號要預留多大才夠?不得己情形下用 fdisk 或 parted 重新分割硬碟對系統管理者來說一直是個惡夢。雖有許多商業軟體如 Norton PartitionMagic 可不破壞資料動態調整 partition 的大小,但操作時要停止 Linux 的服務在 Windows /DOS 下進行,這對 24 小時不關機的 server 也是罪大惡極。

1989 年發展出來的 LVM(Logical Volume Manager 邏輯卷冊管理員) 可有效的在 Linux 系統持續運作時變更 filesystem 的大小彌補了傳統固定 partition 容量的不足。

LVM 原理
LVM 可動態調整 partition 是利用〝虛擬儲存〞(Storage virtualization)技術, 而 LVM 更進一步如下圖把一個以上的 partition 或硬碟合併成一個大的虛擬裝置叫〝 Volume Group〞(VG)。

下圖範例的 Volume Group 就像一個虛擬大硬碟是由實體硬碟(Physical Volume) 的〝/dev/sda2〞,〝/dev/sda3〞,〝/dev/sdb2〞和一整個硬碟〝/dev/sdc〞所組合而成,而這個 Volume Group (VG) 可再加減 partition 或硬碟來達到縮放的目的。

而這個虛擬大硬碟 VG 再分割出的虛擬 partition 叫〝 Logical Volume〞(LV)。而 LV 也是虛擬的 partition 故也可縮放。

了解 LVM 原理後再來解說 LVM 的一些名詞,常出現在 LVM 的術語如下:

  • Physical Volume (PV)實體卷冊
    實體硬碟或其所分割出來的 partition 就是一個 Physical Volume,但如為 partition 要把 partition ID 改為〝LVM〞好讓作業系統知道這些 partition 可組成邏輯卷冊 LVM。
  • Volume Group (VG) 卷冊群組
    一個以上的 PV 可組成 Volume Group (VG),故可視為多個 partition 或硬碟合併成一個虛擬大硬碟,例如 user 有四個 250GB 的實體硬碟,可合併成一個 1T 的 VG,就可把此 VG 當一個大硬碟來管理。

    • Physical Extend (PE) 實體延伸
      整個 VG 是由無數的 PE 組成,PE 可想像為 ext2 的 block,所以 PE 是VG 的最小單位,通常預設為 4M~32M(也可在建立 VG 時指定 PE 的大小)。同一VG 內所有 PE大小需一致故新的 PV 加入到 VG 後,PE 的大小自動更改為 VG 中定義的 PE 大小。
  • Logical Volume (LV) 邏輯卷冊
    VG 再分割出的虛擬 partition 叫 Logical Volume。英文〝 Logica〞一般中文都譯音為〝邏輯〞在英文有〝看作〞,〝解讀成〞有虛擬的意境,如邏輯電路中高電位叫〝邏輯1〞意義為把高電位〝解讀〞成1。再例如 logical partition 不是直接由 MBR table 所記錄的 partition 所以 BIOS 偵測不到無法用於開機,但閞機後的作業系統透過定圵仍能捕捉可〝看作〞是 partition 故叫 logical partition。Logical Volume 有〝 Logical〞就是虛擬出來的。

    • Logical Extend (LE)邏輯延伸
      LE 實際上就是 PE,只是在 LV 內叫 LE。在 VG 內調整 LV 的大小實際上就變動 PE 的數量但不用再格式化故也不會造成資料的遺失因只移動空的 LE。

了解原理後實作就不難了,其步驟大致如下:

  1. 建立 PV
    把一整個硬碟或 partition 用指令 pvcreate 轉為 PV,如是 partition 要把 ID 設為〝LVM〞後再轉為 PV。
  2. 用 vgcreate 將 一個以上的 PV 組成 VG
  3. 最後用 lvcreate 把 VG 分割出 LV
  4. 需一開機就掛載 LVM 可編輯〝/etc/fstab〞或把可能時常會變更大小的目錄如〝/home〞移到 LVM。

經過以上操作後最後得到的 Logical Volume (LV)這個虛擬 partition 就可和傳統硬碟無異的操作方式用 mkfs 來 format filesystem 再用 mount 來掛載。

pvcreate 建立 PV
PV (Physical Volume) 只是簡單的把整個硬碟或 partition 用 pvcreate 來轉換就 ok 了超級簡單!但如是 partition 最好把 ID 設為〝lvm〞。有一點要特别注意 partition 轉 PV 後原 partition 內的 filesystem 和資料可能會蒸發。如真的沒有多餘的硬碟可練習可利用虛擬儲存裝置

下例一顆新 640G 硬碟〝/dev/sdc〞分割 4 個 partition 後把 partion #1~ partition #3 轉成 PV。

例 :

parted /dev/sdc print ←列出 partiton 資訊
Model: ST964032 2AS (scsi)
Disk /dev/sdc: 640GB
Sector size (logical/physical): 512B/512B
Partition Table: gptNumber  Start   End    Size   File system  Name  Flags
1      17.4kB  160GB  160GB               p1
2      160GB   320GB  160GB               p2
3      320GB   480GB  160GB               p3
4      480GB   640GB  160GB               p4
parted /dev/sdc set 1 lvm on ←將 partitoin#1 ID 設為〝lvm〞(如用 fdisk 操作 ID 為〝8e〞)
parted /dev/sdc set 2 lvm on ←將 partitoin#2 ID 設為〝lvm〞
parted /dev/sdc set 3 lvm on ←將 partitoin#3 ID 設為〝lvm〞
pvcreate /dev/sdc1 /dev/sdc2 /dev/sdc3 ←將 partitoin#1~3 轉成 PV
Physical volume “/dev/sdc1” successfully created
Physical volume “/dev/sdc2” successfully created
Physical volume “/dev/sdc3” successfully created

如要整個硬碟轉 PV 如下例 :

parted /dev/hdb mklabel loop ←將硬碟〝/dev/hdb〞內的 partition 都清除
pvcreate /dev/hdb ←將整個硬碟〝/dev/hdb〞 轉成 PV

建立 PV 就是那麼簡單,也可只把不同的地方寫在〝{ }〞裡面如 pvcreate /dev/sdc{1,2,3}= pvcreate /dev/sdc1 /dev/sdc2 /dev/sdc3。而 pvcreate /dev/sd{a,b}=pvcreate /dev/sda /dev/sdb

上例中 parted 參數〝 mklabel loop 〞會把 partition 都清除,此功能為將儲存裝置 partition-table 清除且不可再分割 partition 但可直接轉 PV。或沒多餘的硬碟但想玩 LVM 可如下用 dd 和 losetup 創造 loop-device 。

例 :

dd if=/dev/zero of=disk-image bs=1 count=0 seek=100M ←產生一100M 的 image-file
losetup -fv disk-image ←將 image-file 對映到虛擬設備檔〝/dev/loopN〞
loop device is /dev/loop0
parted /dev/loop0 mklabel loop ←將〝/dev/loop0〞設為不可再分割 partition
pvcreate /dev/loop0 ←將〝/dev/loop0〞轉 PV
Physical volume “dev/loop0” successfully created

其他和 PV 有關的指令如下:

  • pvremove 移除 PV
    pvremove 為移除 PV ,例如 pvremove /dev/hdb3
  • pvmove PV 資料搬遷
    如 pvmove /dev/sda3 會把〝/dev/sda3〞搬到其他空的 PV 上或指出搬到那裡如 pvmove /dev/sda3 /dev/sdc1 為將〝/dev/sda3〞內容都搬到〝/dev/sdc1〞。
  • pvscan 掃描 PV
    想知有那些 partition 被轉為 PV 可用 pvscan 掃描看看。
  • pvdisplay 顯示 PV 資訊
    相較 pvscan 只是把找到的 PV 簡單的顯示, pvdislay [PV name] 會列出每一 PV 的詳細資訊。
  • pvs 顯示 PV 資訊
    和 pvdisplay 相較 pvs 比較徧向顯示屬性。

vgcreate 建立 VG
vgcreate 負責將 一個以上的 PV 組成 VG,用法和 pvcreate 類似但要指定一個名稱給 VG,如下例把 PV〝/dev/sdc1〞和〝/dev/sdc3〞所組成 VG 取名為〝 MyVG〞。

例 :

vgcreate MyVG /dev/sdc1 /dev/sdc3 ←〝/dev/sdc1〞和〝/dev/sdc3〞組成〝MyVG〞的 VG
Volume group “VG1” using metadata typ lm2

經以上操作建立了一個 名為〝 MyVG〞的 VG ,可以想像〝 MyVG〞為 PV〝/dev/sdc1〞和〝/dev/sdc3〞所組成的大硬碟,接下來可用 lvcreate分割成 LV

vgcreate 建立 VG 時系統會根據 VG 的大小決定 PE 的大小,一般是 4M~32M。如要指定 PE 的大小可用選項〝-s #[KMGT]〞,# 為數字而 KMGT 為單位如 vgcreate VolGroup -s 8M /dev/sda 建立的 VG 其 PE 大小為 8M,但 PE 的大小必需為 2N (N 為大於10 的正整數,如 212,=4K)故最小 PE 為 1KiB ,決定 PE 的大小和決定 ext2/ext3 的 block 類似。

其他和 VG 有關的指令如下:

  • vgremove 移除 VG
    pvremove 為移除 VG ,例如 vgremove MyVG 為移除整個〝 MyVG〞這個 VG。
  • vgscan 掃描 VG
    想知系統有無 VG 可用 vgscan 掃描看看。
  • vgdisplay 顯示 VG 資訊
    相較 vgscan 只是把找 VG, vgdislay[VG Nane] 會列出每一 VG 的詳細資訊如VG 的大小(VG Size)和 PE 大小(PE Size),可容納的 PE 數(Total PE)等,而 Tootal P:E x PE-size =VG Size (單位為 MiB 或 GiB)。如時間久了可能會忘掉 VG 由那些 PV 所組成可用 vgdisplay -v 來顯示。
  • vgs 顯示 VG 資訊
    vgs 徧向顯示屬性 。
  • vgextend 擴充 VG
    如事後想擴充 VG 容量可用 vgextend 來擴充,如 vgextend MyVG /dev/sdc2 為把 PV〝 /dev/sdc2〞擴充到〝 MyVG〞這個 VG。
  • vgreduce 縮減 VG
    vgreduce 縮減 VG 為 vgextend 的反動作,如 vgreduce MyVG /dev/sdc2 為把〝 MyVG〞這個 VG 移除 PV〝 /dev/sdc2〞。
  • vgrename 更名 VG 
     vgrename MyVG MyVolGrop 為把 VG 名稱〝 MyVG〞改名為〝MyVolGrop〞。
  • vgchange 變更 VG 設置
    如果 VG 可能因不明原因停止了 (inactive) 可 vgchange [VG_NAME] -ay 來啟動,相反的動作 vgchange [VG_NAME] -an 為停止 VG (可由 lvscan 來觀察 active/inactive 的狀態)。

lvcreate 建立 LV
lvcreate 就類似傳統 fdisk 或 parted 分割硬碟 parition,只是 lvcreate 分割的是 VG。 選項〝-L〞或〝–size〞為指定要分割 LV 的容量(如沒單位預設為 MB),如 lvcreate -L 10G MyVG 會把〝 MyVG〞這 VG 分割出 10G 的 LV。此 LV 的大小 一定是 PE 的整數倍數,如不能整除會自行調整最接近的大小。也可用選項〝l〞(小寫的 L)直接用 PE 數如lvcreate -l 10000 MyVG。此時其大小為 PE-size x 1000,而總 PE 數(Total PE)和 PE 大小(PE-Size)可由 vgdisplay 得知。如不想花腦筋也可用 % 如 lvcreate -l 40%VG MyVolGrop 表示把〝 MyVolGrop〞 這 VG 切 40% 來建立此 LV。

LV 的名稱預設為〝lvol#〞(#為數字),如要指定 LV 名稱要用選項〝-n〞如 lvcreate -L 1000 -n MyLV1 MyVG 從 VG〝 MyVG〞 分割一大小 1GB 名稱為〝MyLV1〞 的 LV。

建立了 LV 後會在〝 /dev〞目錄內產生〝 VG_NAME / LV_NAME〞相對應的儲存裝置(可由 lvscan -v 來得知)而後續的操作就可把這些儲存裝置名稱當實體的儲存裝置使用,可格式化後 mount 。(LV 實際的裝置檔名和 kpartx 類似映射到〝 /dev/mapper/〞內的 VG_NAME-LV_NAME)。

下例操作為規劃了一個 LV 後 fomrat 再掛載。

例 :

lvcreate -L 2G -n MyLV1 MyVG ←從 VG〝MyVG〞 規劃出名稱為〝MyLV1〞2G 大小的 LV
Logical volume “MyLV1” created
lvscan -v ←掃描一下 LV 的裝置檔名
Finding all logical volumes
ACTIVE ‘/dev/MyVG/MyLV1’ [2.00 GB] inherit
mkfs -j /dev/MyVG/MyLV1 ←format 該 LV
mount /dev/MyVG/MyLV1 /mnt ←掛載
df -h ←確定一下掛載情形
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/MyVG-MyLV1  2.0G  68M  1.9G  4%   /mnt

LVM 最棒的地方是可彈性的調整 filesystem 的大小而不會破壞內容,如是增加容量甚至可線上作業,也就是可不停機的情況下進行,其步驟各如下。

增加 LV

  1. 用 lvextend 增加 LV 容量。 (如用光 VG 空間可 vgextend 擴充 VG)
  2. 用 rezise2fs 更改 LV 上的 filesystem 大小 。

縮小 LV 
縮減 LV要暫時的 umount 停機一下,步驟如下 。

  1.  umount LV 上的 filesystem。
  2. 用 e2fsck 檢查 LV 上的 filesystem 。
  3.  resize2fs 更改 LV 上的 filesystem 大小 。
  4.  lvreduce 縮小 LV。
  5. 重新 mount LV 上的 filesystem。

如下例為續上例在 LV 已掛載下加大 filesystem 容量。

例 :(續上例)

cp -a /etc/*.conf /mnt ←故意存一些檔案進去看調整大小過程中會不會被破壞
lvextend -L 3G /dev/MyVG/MyLV1 ←將 LV 由原 2G 調為 3G
df -h ←確定 filesystem 有無變大 ?
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/MyVG-MyLV1  2.0G  68M  1.9G  4%   /mnt ←size 還是一樣?因 LV 雖變大了但 filesystem 還沒調整
rezise2fs /dev/MyVG/MyLV1←調整 filesystem 大小
df -h ←再確定 filesystem 大小
/dev/mapper/MyVG-MyLV1  3.0G  68M  2.8G  3%   /mnt ←filesystem 變大了!(3G)
ls /mnt ←確認一下 filesystem 的檔案有無被破壞

下為續上例但縮小 LV 的大小的測試, 但縮小 LV 有其限制,不能小於已使用的容量否則會造成資料損毀。但還是建議縮小 LV 時要先備份以防不測。

例 :(續上例)

umount /mnt ←先卸載
e2fsck -f /dev/MyVG/MyLV1 ←檢查 LV device-mapper 的完整性
resize2fs /dev/MyVG/MyLV1 1G ←縮減 LV 上的 filesystem 到 1G
lvreduce -L 1G /dev/MyVG/MyLV1 ←縮減 LV 到 1G
WARNING: Reducing active logical volume to 1.00 GB
THIS MAY DESTORY YOUR DATA(filesystem etc.)
Do you really want to reduce MyLV1? [y/n]: y ←會有造成資料損毀的警告(按<Y> 繼續)
mount /dev/MyVG/MyLV1 /mnt ←重掛載
ls /mnt ←確認一下 filesystem 的檔案有無被破壞

其他和 LV 有關的指令如下:

  • lvremove 移除 LV
    lvremove 為移除 LV ,移除時要接完整的 /dev/VG_NAME/LV_NAME 名稱如 lvremove /dev/mirror_vg/lvol01 
  • lvscan 掃描 LV
    掃描看有無 LV 和狀態。
  • lvdisplay 顯示 LV 資訊
    列出每一 LV 的詳細資訊。
  • lvs 顯示 LV 資訊
    lvs 徧向顯示屬性。其用法有點複雜,如下用於看目前的 LVM 工作在那一模式(mirror- striped 或 snap-shot等)。例:

    lvs -o segtype,devices,lv_name
    Type    Devices                   LV
    striped /dev/sdb2(0),/dev/sdb1(0) lvol0
  • lvextend 增加 LV 容量
    擴充 LV 容量。
  • lvreduce 縮減 LV
    縮減 LV。
  • lvresize 變更 LV 容量
    和 lvextend 和 lvresize 的差別為 lvresize 可增加或縮減容量,雖方便但多了危險性。
  • lvrename 更名 LV 
    更名 LV,如 lvrename /dev/myvg/lv_old /dev/myvg/lv_new 和 lvrename myvg lv_old lv_new 這兩種用法都可以。
  • lvconvert 轉換 LV
    用於 LV 模式的轉換,常用的用法如下:
    lvconvert -m1 vg0/lvol1 把 Linear volume 轉 Mirror volume 
    lvconvert -m0 vg0/lvol1 把 Mirrored logical volume 轉 linear volume。
    lvconvert –mirrorlog core vg0/lvol1 把 mirrored volume 的 mirror-log 由 RAM 改磁碟 。
    lvconvert –mirrorlog disk vg0/lvol1 把 mirrored volume 的 mirror-log 由磁碟 改 RAM 。

預設 LV 是 Linear volume ,但 LV 也可工作在 Stripe volume 和 Mirror volume 模式,和額外的 Snapshot volume 功能各說明如下:

      • Linear Volume 線性模式
        Linear(線性)模式是 LVM 的預設模式,因 LVM 最初的目的只想彈性的管理硬碟空間。所謂〝 linear〞是指依序使用空間,例如有一 VG 由〝 /dev/sdb〞 和〝/dev/sdc〞 所組成 ,當把此 VG 用 lvcreate 再切成 LV 時可能先從〝 /dev/sdb〞收集 PE 來組成,不足時再動用另一個 PV〝 /dev/sdc〞。
      • Stripe Volume 交織模式
        stripe (交織)為一檔案在寫入磁碟時會把檔案切成一段一段的平行寫入不同的 PV 以增加速度,讀取時亦然分別從不同的 PV 讀取部份的資料組成一檔案。stripe 模式雖可增加速度但伴隨的缺點為其一 PV 損壞就無法還原檔案故風險會增加。例如有一 1G 大小的檔案每 512K 切成一段,奇數段寫入 PV〝 /dev/sdb〞偶數段寫入〝 /dev/sdc〞,兩顆硬碟分工其速度自然也比一顆硬碟快。兩顆硬碟分工就是 stripes =2,如硬碟夠多也可 stripes=3 ,=4 (stripes 數不能大於 PV 數)而要把一檔案切多大為 stripe-szie。

        另點要注意的為 stripe 模式如規劃不當不但速度不會增加還可能變慢,例如 VG 由〝 /dev/sdb1〞和〝 /dev/sdb3〞所組成,就算檔案依 stripe-szie 打散平行存取到〝 /dev/sdb1〞和〝 /dev/sdb3〞事實上只對同一個硬碟存取且反而會造檔案不連續而大幅拖累速度。正確的規劃 stripe 其 VG 內的 PV 要來自不同的硬碟 如 vgcreage vg_striped /dev/sda /sdev/sdb,

        指定 LV 工作在 stripe 模式的選項為〝i #〞(#為 stripes 數),如 lvcreate -L 20G -i2 vg_striped 為 stripes =2。如要指定 stripe-szie選項為〝I#〞(#為數字,單位為 K,且值必需為 2N),如 lvcreate -L 20G -i3 -I256 vg_striped, 為指定 stripe-size=256K 沒如此選項一般預設值 stripe-size 為 64 k。

        如果 VG 內的 PV 大小不一,以 stipes =2 來說其可建立的 LV 最大容量為最小容量 PV 的二倍,例如一 VG內有二個 PV ,其 PE 數各為 1000 和 5000,而能建立的最大 LV 大小為 1000 x PE-size x2。同理 stripes=3 時可建立的 最大容量 LV 為 最小容量 PV 的三倍。

      • Mirror Volume 鏡像模式
        mirror (鏡像)模式是兩個以上的 PV 互相複製就好像鏡子一樣,每一複製品為〝mirror-leg〞。以最基本的 2 mirror-leg 兩個 PV 互相複製, 如下圖 PV#1(mirror-leg1) 和 PV#2(mirror-leg2) 內容是一模一樣,如其一個 mirror-leg 壞了其他 Morror leg 還留有 100% 的複製資料 所以資料還在但此時會自動變 Linear Volume 繼續工作。mirror vulume 和 stripe volume 模式剛好相反,犧牲速度和容量只求安全。

        選項〝m #〞(# 數字)可指定 lvcreate 建立的 LV 時工作在 mirror 模式,〝m 1〞表示動用一個額外的 PV 來複製故有兩個 mirror-leg而〝m 2〞有三個 mirror-leg。例如 lvcreate -L10G -m 1 vg_mirror 會產生一 10G 的 two-way mirror 模式的 LV,但預設需三個 PV,二個 PV互相複製,另一 PV 記錄 mirror 日誌資料(mirror-log)。如下圖所示:

        mirror-log (鏡像日誌資料)所需的空間會比 mirror-leg 小,假設要建立一 5GB 的 2 mirror-leg 的 LV,但 VG 內的 3 個 PV 大小不一各為 10GB/3GB/7GB,欲建立一 5G 的 LV 大於最小 PV(3GB) 時會自動匹配把最小的 PV (3GB) 用來當 mirror-log。而所能建立的最大 LV 容量以最小容量的 mirror-leg 為準(7GB)。[註 5.0]

        如要明確的指定 mirror-leg 和 mirror-log 的 PV,可在 lvcreate 最後加上 PV 順序,依序指定 mirror-leg1,mirror-leg2… 最後一個為 mirror- log 。例如 lvcreate -L10G -m 1 -n mirrorlv vg_mirror /dev/sda1 /dev/sdb1 /dev/sdc1 此時 PV〝 /dev/sda1〞和〝 /dev/sdb1〞 為 mirror-leg,而〝 /dev/sdc1〞為 mirror-log

        mirror volume 的 VG 規劃也會影響可靠度,如 VG 由 PV〝 /dev/sdb1〞和〝 /dev/sdb2〞和 /dev/sdb3〞 所組成,實際是同一硬碟,萬一〝 /dev/sdb〞 掛了有 mirror 也沒用,故使用 mirror 模式 VG 內的 PV 要用不同顆的硬碟。

        如只有二個 PV 也有辦法跑 mirror volume,用次選項〝–mirrorlog core 〞把 mirror-log 放到 RAM 去,但相對的缺點為重開機時可能要花許多時間比對各 mirror-leg 有無一致。

        例:

        lvcreate -L 3G -m1 –mirrorlog core vg_mirror /dev/sda /dev/sdb ←用二個 PV 跑 mirrored logical volume

下面我們來實作一下 2 mirror-leg 的 mirror volume 然後故意破壞其一 mirrow-leg 再來復原看看 。

 

      首先建立一 mirror volume 並掛載。
vgcreate vg_mirr /dev/sdb /dev/sdc{1,2} ←建立 VG 的 PV 為〝/dev/sdb〞和〝/dev/sdc{1,2}〞
lvcreate -L 1G -m1 -n lv0 vg_mirr /dev/sdb /dev/sdc1 /dev/sdc2 ←建立 mirror volume,〝/dev/sdb〞和〝/dev/sdc1〞為 mirror-leg 而〝/dev/sdc2〞為 mirror-log
mkfs /dev/vg_mirr/lv0 ←格式化此 mirror volume
# mount /dev/vg_mirr/lv0 /mnt ←mount 
dd if=/dev/zero of=/mnt/file_test1 bs=100M count=1 ←寫一檔案測試一下

 

      接 下來搞破壞把其一 mirror leg 的 PV〝 /dev/sdb〞破壞看還可不可以正常讀寫 。

 

# dd if=/dev/zero of=/dev/sdb bs=4K count=1000 ←破壞 PV〝/dev/sdb〞
lvscan ←scan 一下 LV
Couldn’t find device with uuid ‘XuwhhB-585a-20lj-vr0-kGoo-0bmg-cGRv82 ←LV 已損壞
echo > /mnt/file_test2 ←寫一檔案看看(一個 mirror-leg 壞了還可讀寫但會自動轉變為 linear voulme)

 

      再下來把壞的 PV 移除換一新的 PV 讓 LV 繼續工作在 mirror volume。
vgreduce –removemissing –force vg_mirr ←移除壞的 PV
vgextend vg_mirr /dev/sdd ←加入一新的 PV〝/dev/sdd〞但新的 PV 最好不要小於壞的 PV
lvconvert -m1 /dev/vg_mirr/lv0 /dev/sdd /dev/sdc1 /dev/sdc2 ←將 linear voume 轉 mirror volume
mount /dev/vg_mirr/lv0 /mnt ←再掛載 mirror volume
ls /mnt ←看一下之前的檔案安在否?
file_test1        file_test2

 

      如 mirroed logical volume 失敗更換 VG 內的 PV 後也可試著用

 lvconvert –repair [-f][-y] VG_NAME/LV_NAME

       來維修,此為一互動的指令會提示是否替換任何失效的 PV, 跳過此提示可用選項〝-y〞 如不替換失效的 PV選項為〝-f〞 。

 

      • Snapshot Volume 快照模式
        LVM 有一很實用的〝snapshot〞(快照)功能,[註 5.0A]此功能會複製出一模一樣的 filesystem ,常用來備份。備份用 dd 或 cp 或 rsync 就好了何必再多此一舉?當然可以但如檔案很多時備份很花時間的而〝snapshot〞如其名像拍照一樣是瞬間完成。

        為什麼 snapshot 可瞬間的備份 filesystem ? LVM snapshot 原理很類似硬連結(hard-link)只是硬連結利用兩個以上的 inode 指向同一筆資料而 snapshot 用 meta-data (中介資料)而不是傻傻的真的去複製檔案,故不管 filesystem 有多大皆神奇的瞬間備份完成。但因要維護 meta-data 故需一額外的空間來記錄但其空間又比真正的去複製檔案小很多,美中不足的是 snapshot volume 和 mirrored volume 不能共存。

        選項〝-s〞可指定 lvcreate 建立快照,預設的快照 LV 名稱為〝lvol#〞(#為數字),也可用選項〝-n〞來指定快照 LV 名稱,因快照 LV要有一空間來維護 meta-data 故一定要和被快照的 LV 同一 VG。

        例如 lvcreat -L 300M -s -n backup /dev/vg0/lvol2 為規劃一 300M 維護快照 meta-data 的空間,其快照 LV 名稱叫〝backup〞原 LV 裝置為〝/dev/vg0/lvol2〞。

        下例我們來實測用快照來備份一個 filesystem 有多快?和測試只用少許維護 meta-data 的空間完全複製比 meta-data 空間大很多很多的 filesystem。

例:(假設己建了 VG〝MyVG〞)

lvcreate -L 3G -n ori_lv MyVG ←建立 3G 大小名稱為〝ori_lv〞的 LV
mkfs /dev/MyVG/ori_lv ←format 此 LV
mkdir /mnt/ori ←建立目錄〝/mnt/ori〞
mount /dev/MyVG/ori_lv /mnt/ori ←掛載 LV〝ori_lv〞 到〝/mnt/ori〞接下來故意放一些檔案到〝/mnt/ori〞
dd if=/dev/zero of=/mnt/ori/1g-image bs=1 count=0 seek=1G ←產生 1G 的檔案
cp /etc/*.conf /mnt/ori ←複製一些檔案進去

接下來產生一 300M 維護快照 meta-data 的空間,看可不可完全複製 3G 的 filesystem

lvcreate -L 300M -s -n snap_backup /dev/MyVG/ori_lv ←產生一名稱為〝snap_backup〞快照 LV,維護 meta-data 空間為 300M
mkdir /mnt/backup ←建立目錄〝/mnt/backup〞
mount /dev/MyVG/snap_backup /mnt/backup ←掛載快照 LV〝snap_backup〞 到〝/mnt/backup〞
df -h /mnt/ori /mnt/backup ←比較兩者 filesystem 大小,應該是一模一樣
Filesystem                  Size  Used Avail Use% Mounted on
/dev/maper/MyVG-ori_lv      3.0G  1.1G  1.8G   5% /mnt/ori
/dev/maper/MyVG-snap_backup 3.0G  1.1G  1.8G   5% /mnt/backup ←300M 的 meta-data 空間可備份超過 300M 的 filesystem(此為 3G)

 

      由以上的測試可發現 snapshot 實在是神奇的備份工具,不但瞬間備份且只佔一點空間,更棒的是 LVM 2 (可用

 lvm version

       查 LVM 版本)連 snapshot-volume 也支援讀寫功能比起 LVM1 的 snapshot-volume 只能讀單純作備份功能更多元 。

 

      snapshot-volume 只備份當下的情形,往後各自讀寫原 LV 或 snapshot LV 是各自獨立而不是像

mirrored-volume

       是同步的,故常用於升級前的測試或校調等反正玩壞了還有 snapshot-volume 的備份資料。但對 sanpshot -volume 或原 LV 讀/寫/修改/刪除/複製檔案等皆會慢慢消耗 snapshot-volume 的維護空間,尤其是複製消耗最快因是用〝寫時複製〞(copy on write) 。故要時常監控維護 snapshot 的 meta-data 空間,一旦到達 100% 時 snapshot-volume 為保資料的完整性此時只能讀不能寫。

 

      如下用

 lvdisplay

       來監控 snapshot 的 meta-data 空間使用情形。

 

      例:
lvdisplay /dev/MyVG/snap_backup
— Logical volume —
LV Name                /dev/MyVG/snap_backup
VG Name                MyVG
LV UUID                fFbaH4-33Hq-s7a3-e1mo-DPov-4wff-dvuAiI
LV Write Access        read/write
LV snapshot status     active destination for /dev/MyVG/ori_lv ←原 LV
LV Status              available
# open                 0
LV Size                3.0 GB
Current LE             768
COW-table size         300.00MB ←Copy On Wirte Talbe (維護 meta-data 大小)
COW-table LE           75
Allocated to snapshot  0.21% ←meta-data 使用情形不要讓其達到 100%
Snapshot chunk size    4.00 KB
Segments               1
Allocation             inherit

LVM 遷移/備份
如把有 LVM 的硬碟搬到其他主機使用或主機在維護時怕不小心誤殺到有 LVM 的硬碟可用 vgexport 先導出(以 VG 為單位),搬到其他主機後再用 vgimport 導入,導出之前要先卸載和用 vgchange 先讓 VG 暫停(inactive),導入時再啟動 VG 再掛載。

如下範例為從本機先導出 LVM 。

umount /mnt ←卸載
vgchange -an my_vg ←inactive VG
vgexport my_vg ←導出 LVM 的 VG
Volume group “my_vg” successfully exported

硬碟搬到其他主機後導入 LVM 範例如下。

vgimport vg_u01 ←導出 LVM 的 VG
Volume group “my_vg” successfully imported
vgchange -ay my_vg ←active VG
mount /dev/my_vg/lv_0 /mnt←掛載

另外如怕 LVM 的組態損壞(如 VG 由那幾顆 PV 組成 LV 有多大等資料)可用 vgcfgbackup 來備份,用vgcfgrestore 來復原,選項〝-f〞接檔名。
例:

vgcfgrestor vg01 -f myvg_backup ←備份 VG〝vg01〞的 metadata 到檔案〝myvg_backup〞
Volume group “vg01” successfully backed up.
vgcfgrestore vg01 -f myvg_backup ←還原 VG〝vg01〞的 metadata
Restored volume group vg01

 

^ back on top ^


5.1 RAID 磁碟陣列RAID 是 Redundant Array of Inexpensive Disks 或 Redundant Array of Independent Disks 的縮寫,中文大多譯為〝容錯磁碟機陣列〞或〝磁碟機陣〞。

〝Redundant〞字典上的解釋為[多餘的,累贅的],在此有備份和容錯的用途,也就是用多餘的硬碟不同的組合來達到備份、容錯、甚至加速的功能。多硬碟合併成一個虛擬裝置叫 RAID。

RAID 如以功能來分類有加速、增加容量、備份或容錯,可組成不同的 RAID-Level 來滿足不同的需求。而組成各種 RAID-Levels 可以用硬體來達到叫 Hardware-RAID,也可用軟體來完成叫 Soft-RAID,或半硬半軟的 Semi-hardware RAID 其優缺點各如下:

  • Hardware RAID(硬體 RAID):
    由硬體來達到所有 RAID 的運算,下圖為 Dell 的 RAID Controller〝PERC H200〞。

    優點:

    1. 和作業系統無關(一般只要在作業系統安裝 RAID 控制卡的驅動程式可開機即可,其餘有關 RAID 的運算都由 RAID 控制卡完成)。
    2. 速度最快。
    3. 資料安全性較高,不會因作業系統的故障而影響 RAID 的設定或忽然斷電時較高級的 RAID 控制卡通常會有備用電池維持一定的電力讓 cache 的資料寫入硬碟。
    4. 容易操作和維護(一般會有 LED/LCD 可監控硬碟狀況)。
    5. 可由 RAID 開機。

    缺點:

    1. 昂貴,視品牌和 RAID-Levels 支援程度而定價錢從台幣幾千元到上萬元不等。
    2. 如 RAID 控制卡壞掉,更換不同型號的控制卡並不保証會認得之前控制卡上 RAID 的資料,故建議用大廠 Server 級的 RAID 控制卡比較有保障(Server 級一般保障零件可供貨 5 年以上)。
  • Soft-RAID(軟體 RAID):
    Soft-RAID 或 Software-RAID 其有關的 RAID 運算都交由 PC 的 CPU 來運算。
    優點:

    1. 不用錢。
    2. 彈性大 ,可自由設定 RAID-levels 等參數且任何儲存媒體如 USB-Driver/IDE/SATA/SAS 等界面的硬碟甚至 partition 都可混合組 RAID。
    3. 不用擔心 Hardware RAID 控制卡故障時原控制卡已停產,但更換不同控制卡有相容問題。

    缺點:

    1. 無法由 Soft-RAID 開機(只有 RAID 1 可,其餘 RAID levels 因要等開完機才有辦法去運算)。
    2. 速度較 Hardware RAID 慢,尤其是工作在 RAID 5/6 且作業系統負載大時。
    3. 和作業系統相依性高,例如用 Linux 作的 Soft RAID 不相容 Windows 的 Soft RAID。
  • Semi-Hardware RAID(半軟半硬體 RAID):
    有些主機板沒 RAID 控制晶片但 BIOS 有選項可開啟 RAID 功能,這種免費就送你的 RAID 是一半軟體一半硬體又叫〝Semi-hardware RAID〞或叫〝 BIOS-RAID 〞典型的 BIOS-RAID 是Intel ICHxR 系列南橋晶片。然天下沒有自吃的午餐,實際上〝Semi-hardware RAID〞 99% 是 Soft-RAID,只是 BIOS 把硬碟控制器 〝騙〞OS 是 RAID 控制器,但 RAID 所需的運算是靠 CPU 運算來完成故幾乎是 Soft-RAID。且經實測其速度也不會比 Soft RAID 快又沒 Soft RAID 的彈性實在騙很大。故又叫〝 FakeRAID〞所以不用也罷。唯一的優點是和作業系統的相依性沒 Soft RAID 高因部份晶片組的 Semi-hardware RAID 在 Windows 和 Linux 都有支援。

RAID 硬碟的選擇
許多人可能認為 RAID 已有基本的備份和容錯能力故硬碟就隨便挑便宜就好,如果只是在練習是無所謂但如是部署在專業用途選硬碟有不少的學問,首先要考慮的為硬碟的校正機制。

因一般的硬碟如運作其間發現某個磁區開始不穩時會〝假死〞然後在背後偷偷的把不穩的磁區內的資料先搬到預留的磁區,搬完後封鎖不穩的磁區再把預留的磁區開放故總容量是不變的 (WDC 的術語叫〝deep recovery cycle〞),乾坤大挪移後硬碟又是一條活龍。

其間對一般使用者可能只覺硬碟頓一下但無傷大雅。但不管是 Hardware RAID 或 Software RAID 如寫入資料 8~30 秒內硬碟都沒反應就會被 RAID 當硬碟已損壞而踢出 RAID[註 5.1]。 雖然 deep recovery cycle 不常發生,但對 24 小時都不關機的應用連續工作個一年〝應該〞會出現個幾次。不只機械硬碟, SSD 固態硬碟因 NAND -Flash 有寫入次數壽命的限制更仰賴這種自我修復機制。

以 WDC 的桌上型消費級硬碟(藍/綠/黑標硬碟)來舉例,假死在執行〝deep recovery cycle〞的時間最久可達 2 分鐘,如果發生時且用在 RAID 早就被 RAID 當故障碟踢掉,而 WDC 的企業級系列的硬碟( 如Velociraptor 和 Re 的 RAID Edition )有〝TLER〞( Time-Limited Error Recovery 限時錯誤校準功能)保證校正時的假死不超過 7 秒就不會被 RAID 踢出註 5.1A]。

不止 WDC 硬碟他牌的企業級(Enterprice)硬碟如 Seaget / Toshiba /Hitachi /Samsug 也皆有類似 TLER 機制只是術語可能叫 ERC(Error Eecovery Control) 或 CCTL (Command Completion Time Limit ),所以組 RAID 時花一些時間到硬碟的官網看一下規格,如要組 RAID 5 更要考慮〝URE〞和容量盡量減少可能的RAID 5 不可復原錯誤, 可不是只看價錢和容量不然怎麼死的都不知道。

RAID-Levles
不同數量的硬碟或 partition 可依功能組成不同的 RAID-Levles,來達到加速、增加容量、備份或容錯某一功能,但如再加硬碟可組混合 RIAD來達到複合功能,如加速+容錯或增加容量+備份等。 一些便宜的 Hardware RAID 或 Fake RAID 可能只支援有限的 RAID-Levles。雖標準的 RAID-Levles 從 RAID0~RAID6 但 RAID 2~RAID4 理論大於實際並不實用,也少有商業化的成品就略過不介紹了。

  • RAID 0 (stripe)
    最少由兩顆硬碟組成,兩顆以上的硬碟組成一個大硬碟,讀/寫時也是把檔案分段平行同時讀/寫在不同的硬碟故(故又叫 stripe)速度最快容量最大但也最危險,因其一硬碟壞了就無法還原檔案。RAID 0 (Stripe) 基本上和 LVM 的Stripe Volume 同一原理 ,故 RAID 0 容量是〝最小硬碟的容量 x 硬碟數〞 。RAID 0 目的是為了容量,速度,沒有備份和容錯功能。
  • RAID 1 (mirror)
    以前我的一個主管常全家人一起出國,但一定分兩班以上的飛機。我好奇問為什那麼?他的理論很特別和實際「被車撞死肇事者不一定有錢可賠你,但飛機失事航空公司一定賠且天文數字,萬一全家都在同一飛機上失事了要賠給誰?至少要有活口才可拿到賠償」。 同理 RAID 1 也是如此來分散風險,至少要留下活口。 RAID 1 最少由兩顆硬碟組成,兩顆以上的硬碟互相鏡像複製(故又叫 mirror),內容一模一樣,故其一硬碟故障還可正常讀/寫。RAID 1 基本上和 LVM 的 Mirror Volume 同一原理 ,故 RAID 1(Mirror) 不管由幾顆硬碟所組成其 RAID1 容量為〝最小硬碟的容量 〞 。

    RAID 1 目的是為備份和容錯故安全性最高,部份的加速功能(讀的速度以最快那一顆硬碟為準但寫要等最慢那顆寫完)。

    • RAID 降級
      具容錯能力的 RAID1/5/6 如壞了一顆硬碟還可繼續工作(RAID 6 可允許同時壞掉兩顆),但此時 RAID 是工作在降級模式(degraded mode),萬一 RAID 再有硬碟故障整個 RAID 就毀了,故最好趕快更換掉故障的硬碟或預留 spare-disk
    • Spare-Disk 預備硬碟
      為了預防 RAID 因磁碟故障而降級,可為具容錯能力的 RAID 加一個以上的〝spare disk〞 (預備硬碟),此預備硬碟平常不工作,但如 RAID 被降級時 spare-disk 會自動加入取代壞掉的硬碟且重建整個 RAID 完全不用人工介入,故也叫〝hot spare disk〞(熱交換硬碟)。重建整個 RAID 的時間可能要好幾小時 (視 RAID 大小和硬碟速度而定) 重建其間還是降級模式,但重建完後又是活龍一條 。
  • RAID 5
    最少由三顆硬碟組成,RAID 5 是 RAID 0 和 RAID 1 之間的優缺點取得平衡的最佳方案。RAID 5 原理為一筆資料寫入 RAID 5 時如下圖資料會拆分到各硬碟,但各硬碟又分別加入還原碼(Parity bit)的容錯機製,如有一顆硬碟故障還可從其餘的硬碟讀取還原碼還原資料繼續工作,此時如有 Spare-disk或更換掉故障的硬碟時因其餘硬碟上存有還原碼可重建(rebuilding) 整個RAID 5。

    RAID 5 的容量是〝 (硬碟數-1) x 最小硬碟的容量〞 。

    RAID 5 可容錯、加速和備份但所需的硬碟又不很多曾經是夢幻組合,但隨目前硬碟的容量愈來愈大而會延伸出不可復原錯誤(Unrecoverable Errors)。

    • RAID 5 的不可復原錯誤
      網路上常可看到有不少人傳災情,反應 RAID 5 更換新硬碟重建時整個 RAID 5 就崩潰了,資料救不回災情慘重! 進而懷疑 RAID 5 的演算法。其實問題不在 RAID 5 而是出在硬碟的〝URE〞 。〝URE〞全名為 unrecoverable read error (不可復原的讀取錯誤)是硬碟的一重要規格,一般消費型硬碟的容許讀取資料發生錯誤的比率為 1/1014 bit ,也就是 URE=1/1014。而企業型硬碟通常 URE=1/1015 。

      表面上 URE=10-14 或 10-15 發生的比例很低可以忽略,但用在 RAID 5 問題會放大。現在 (2014)的硬碟動不動就 1TB 起跳(1T=1012)所以讀完一整個 1TB 的硬碟發生一個 bit 錯誤的比例就不低了,更何況重建 RAID 5 要讀/寫完至少三顆硬碟,其間任何一個 bit 讀/寫錯誤就會使 RAID 5 無法還原資料。

      根據計算重建 2T 由 6 顆硬碟組成的 RAID 5 最差的情況失敗率如下:

      URE RAID 5 of rebuild failure rate
      for 6x 2TB drives (total 12 T)
      1/1014 55%
      1/1015 10%
      1/1016 0%

      (參考來源 http://www.raidtips.com/raid-tips.pdf)

  • RAID 6
    RAID 6 最少由四顆硬碟組成,RAID 6 可視為 RAID 5 加強版用二個獨立不同演算法(algorithm)的還原碼來增加可靠度,容許最多兩顆硬碟同時壞掉也可運作和還原 。因要同時寫入二個獨立的還原碼,寫入的效率比 RAID 5 差又比 RAID 5 相對複雜以前不被重視,但因硬碟容量越來越大是不可逆的現象.而越大的硬碟所產生的RAID 5 不可復原錯誤現象會被放大,故現在又敗部復活。

    RAID 6 的容量是〝 (硬碟數-2) x 最小硬碟的容量〞 。

  • 混合 RAID(Hybrid RAID)
    不同的 RAID-levels 可以串接成混合 RAID (Hybrid-RAID 或叫 Nested-RAID),例如 RAID10 ( 或 RAID 1+0) 為先 RAID1 再 RAID0 可同時有RAID 0 的抉速、容量和 RAID 1 的安全,如下圖。
    只要硬碟夠這種混合的 RAID 理論上可任意結合,但以 RAID 1 和 RAID 0 來說可組 RAID 01 或 RAID 10,但 RAID 01 可靠性較低(自行組合想一下)所以有些混合 RAID 並不常見,比較實用的混合有 RAID 10, RAID 50 和 RAID 60。

    但混合的 RAID 功能倍增後新的難題是如何選擇,如一樣是 4 顆硬碟可組 RAID 10 或 RAID 6,但那種比較好? Google 一下會發現沒有絕對,青菜蘿蔔各有所好!

5.2 Linux Soft RAID 軟硬磁碟陣列Software-RAID (軟體磁碟陣列)雖管理沒硬體 RAID 方便和快速但永遠不會消失因〝不用錢〞另一優點為彈性可自由組合不同的 RAID-level 且可用 partiton 來組 RAID 或來個大雜匯如可混合 IDE/SATA/SCSI/USB 等各種界面的硬碟來組 RAID,這是 Hardware-RAID 辦不到的。況且一些低階的硬體 RAID 控制卡可能只支援有限的 RAID-levels ,例如 Dell 低階的 RAID-Controller (PERC) H200 只支援 RAID0/RAID1和 RAID10,但話說回來用 Sof-fRAID 跑 RAID0/RAID1和 RAID10 也不會比 Hardware-RAID 慢,因基本上 RAID 0 和 RIAD 1 不用什麼運算。

另外組 Software-RAID 時,硬碟 channel (通道)的選擇不僅會影響速度也會影響安全性,尤其是 IDE 界面的硬碟,。如下圖 IDE 界面的硬碟,如要用兩顆硬碟組 RAID1,建硬碟要分散到不同的 channel, (一顆在 Primay Channel,另一顆在 Secondary Channel),因不同 channel 不但可分散 IO 頻寛也可分散風險,例如有可能只 Primary-channel 的硬體控制器或排線(ribbon cable)故障了但 Secondary-channel 上的硬碟/dev/hdc 或 /dev/hdd 不受影響,有活口就有希望。(組 RAID 5/6 亦同)

mdadm 建立/管理 Software-RAID
指令 mdadm,為〝 multiple disk devices admin 〞的縮寫,為 Linux 建立/管理/監控 Software-RAID工具。而所謂的〝 md〞(multiple disk devices)和 LVM 或 kpartx 的〝 dm〞( /dev/mapper/)都是虛擬儲存裝置。

mdadm 為一複合指令用於建立/管理/監控 Software-RAID ,詳細的用法自行參考 man mdadm,這只介紹常用的 createmanageassemble 、monitorgrow 和 misc 模式。

  • Create 模式,建立 Soft-RAID
    mdadm — create md-DEVICE 為建立 Soft-RAID 模式, 建立好了 md 裝置後記得編輯 /etc/mdadm.conf 此時 Soft-RAID 就大功告成,往後就可把 md 裝置當硬碟的 partition 般使用先格式化後再掛載和修改 /etc/fstab 。mdadm –create md-DEVICE 建立 Soft-RAID 基本用法為如下:

    mdadm  –create  /dev/md#  –level=(#|NAME)  –raid-devices=#  DEVICE  [–spare-devices=# DEVICE] 
    (1) (2) (3) (4) (5) (6)

    各選項和參數說明一下:

    1. 〝–create〞或〝-C〞
      建立一新的 Software-RAID。
    2. /dev/md#
      指定編號給 md (multiple disk devices,也就是 RAID devices),可從 md0~md31 或 md99,視不同的發行版而異。
    3. 〝–level=#〞或〝-l=#〞
      〝#〞為數字,指定工作的 RAID-level, Soft-RAID 支援的 RAID-levels 有〝liner〞和 0/1/4/5/6,各簡介一下:

      • –level=linear
        此非標準的 RAID,由二顆以上磁碟或 partition 所組成,目的只有增加容量但不會加速,Linear 為先把某一硬碟用完才會把資料寫到另一硬碟。但只要有一顆硬碟(或 partition)陣亡整個 RAID 就讀不到。
      • –level=stripe 或 level=0
        由二顆以上磁碟或 partition 組成 RAID 0
      • –level=mirror 或 level=1
        由二顆以上磁碟或 partition 組成 RAID 1
      • –level=[456]
        leviel=[456] 用法都很類似,其中 RAID 4/RAID 5 最少要 3 個硬碟(或 partition)而組 RAID 6 至少要 4 顆硬碟。下例為建立一個 RAID 5。例 :mdadm /dev/md2 –create –level=5 –raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
    4. 〝–raid-devices=#〞或〝-n=#
      〝#〞為數字,組成 RAID 所需的硬碟(或 partititon)的數量,,但不包括 spare-disk 的硬碟 。
    5. 〝DEVICE〞
      列出組成硬碟所需的硬碟,比 Hardware-RAID 更方硬的彈性的地方為 RAID 也接受 partition。
      例::mdadm –create /dev/md1 –level=mirror –raid-devices=2 /dev/sdb /dev/sdc2 。為由硬碟〝/dev/sdb〞和 partition〝 /dev/sdc2〞組成一個 RAID 1。上例中當 partition(/dev/sdc2) 或整個硬碟(/dev/sdb)組成 RAID 後原 partition 或硬碟上的資料會蒸發掉,如上面有重要資料先備份。(此時如用 parted -l 觀察硬碟組成 RAID 後硬碟的 partition type 會變 loop)。
    6. 〝–spare-devices=#  DEVICE〞或〝-x=#  DEVICE〞
      此為非必要選項,為指定 spare-disk 數(或 partition),除 –level=linear 或 raid 0 因沒容錯功能不能使用外其他的 RAID-level 皆可用,一般要加到 mdadm 指令的最後。例 :mdadm –create /dev/md0 –level=5 –raid-devices=3 /dev/sdb /dev/sdc /dev/sdd –spare-devices=1 /dev/sde
      • /etc/mdadm.conf 編輯 RAID 設定檔
        用 mdadm 設定好Soft-RAID 後編輯〝/etc/mdadm.conf〞讓下次開機時可根據此檔自動啟動之前所建立的 RAID,雖部分Linux發行版不需此設定檔就可根據 superblcok 上的資料在重開機時啟動 RAID,但重啟模式可能用的到,所以還是建議編輯〝/etc/mdadm.conf〞。〝/etc/mdadm.conf〞重要的記錄有兩項,其一為 RAID 所組成的〝DEVICE〞,第二項為 RAID 的〝UUID〞,其中第二項可由雜項模式 mdadm –detail –scan 產生,如下例為建立一 RAID 1 並編輯〝/etc/mdadm.conf〞。

        例:

        mdadm –create /dev/md0 –level=1 –raid-devices=2 /dev/sdb /dev/sdc –spare-devices=1 /dev/sda6 ←由〝/dev/sdb〞,〝/dev/sdc〞 組 RAID 1,〝/dev/sda6〞為 spare-disk
        mdadm: largest drive (/dev/sda6) exceed size (3767808K) by more than 1%
        Continue creating array? y ←如硬碟或 partition 大小不一樣或內有資料會有警告,按<y>繼續
        mdadm: array /dev/md0 started. ←md (RAID)啟動了echo ‘DEVICE /dev/sdb /dev/sdc /dev/sda6’ > /etc/mdadm.conf ←將組 RAID 的 Device 寫入〝/etc/mdadm.conf〞(要包含 spare-device)
        mdadm –detail –scan >> /etc/mdadm.conf ←將RAID 的 UUID 加入〝/etc/mdadm.conf〞
        cat /etc/mdadm.conf ←確認一下檔案〝/etc/mdadm.conf〞的內容
        DEVICE /dev/sdb /dev/sdc
        ARRAY /dev/md0 level=raid1 num-devices=2 spares=1 UUID=0fcf1a50:057f9442:49ee75e2:9acafdb6

        進階常用的〝/etc/mdadm.conf〞設定還有〝MAILADDR〞 可在 RAID 有問題時發 Email 通知。〝PROGRAM〞可設定 mdadm 偵測到特定狀況去執行特定指令, 詳情的使用可參考 man mdadm.conf 和參考 monitor監控模式,。

        建立了 Soft-RAID 後就可格式化掛載和編輯〝/etc/fstab〞,如下例的操作。

        例:

        mkfs -j /dev/md0 ←格式化
        mount /dev/md0 /medial ←掛載
    • /proc/mdstat 監控 Soft-RAID
      〝/proc/mdstat〞是監控 RAID 狀況的好工具,如上例用 mdadm 建了一個 RAID 1,馬上觀察〝/proc/mdstat〞 輸出如下。例:

      cat -n /proc/mdstat ←監控 RAID 狀況
      1 Personalities : [raid1] ←目前的 raid-levels
      2 md0 : active raid1 sda6[2](S) sdc[1] sdb[0]←RAID 的組合硬碟(S)代表 spare-device
      3       3767808 blocks [2/2] [UU]←RAID 運作情形
      4      [=>……………….]  resync =  5.1% (194752/3767808) finish=11.5min speed=5154K/sec ←顯示同步百分比和預估同步完成時間

      上例中第一行顯示 RAID-levels

      第二行 〝active/inactive〞 為 RAID 啟動與否,〝(S)〞為 spare-disk,如果有〝(F)〞代表〝faulty〞故障的硬碟。

      第三行顯示的〝[2/2][UU]〞代表幾顆硬碟(或 partition)和有無正常的工作,例如 RAID 5 如顯示 [3/2][_UU]此時 RAID 是降級的,三顆硬碟只有二顆是正常的。

      第四行會顯示同步百分比和預估同步完成時間,同步完成時間視 RAID 大小和硬碟速度而定可能幾分鐘到幾小時,但不一定要等同步完才能後續的操作(如格式化),此是顯示 RAID 1 兩顆硬碟互相鏡像複製的進度(RAID 5/6 是建立 RAID的進度) ,但如還沒同步完成就寫資料在 RAID,其間萬一有一顆硬碟壞了RAID 內的資料可能會讀不出來。

      另外用雜項模式 mdadm –detail md-DEVICE 也可監控 RAID 狀況,如下例。

      例:

      mdadm –detail /dev/md0
      /dev/md0:
      Version : 00.90.03
      Creation Time : Wed Aug 21 11:07:44 2013
      Raid Level : raid1
      Array Size : 3767808 (3.59 GiB 3.86 GB)
      Used Dev Size : 3767808 (3.59 GiB 3.86 GB)
      Raid Devices : 2
      Total Devices : 3
      Preferred Minor : 0
      Persistence : Superblock is persistentUpdate Time : Wed Aug 21 11:07:44 2013
      State : active, resyncing
      Active Devices : 2
      Working Devices : 3
      Failed Devices : 0
      Spare Devices : 1

      Rebuild Status : 10% complete

      UUID : 0fcf1a50:057f9442:49ee75e2:9acafdb6
      Events : 0.3

      Number   Major   Minor   RaidDevice State
      0       8       16        0      active sync   /dev/sdb
      1       8       32        1      active sync   /dev/sdc

      2       8        6        –      spare   /dev/sda6

      上例中〝UUID〞 應和 /etc/mdadm.conf 內的 UUID 是一致的。

  • Manage 模式,管理 Software-RAID
    mdadm –manage md-DEVICE 管理模式主要是如追加/刪除 spare-disk,或刪除故障的硬碟,主要有下。

    • –add 或 -a 
      增加 spare-disk, 如果建立 RAID 時沒預留預備硬碟,可事後追加,如下例。例:

      mdadm –manage /dev/md0 –add /dev/sda6 ←追加 spare-disk
      mdadm: added /dev/sda6

      如果是 RAID1/5/6 事先沒預留 spare-disk,當有硬碟故障而降級馬上加入的 spare-disk, RAID 會自動重建。

      〝–manage〞選項通常可省略,故上例可簡化為 mdadm /dev/md0 –add /dev/sda6, 追加 spare-disk 後記得編輯 /etc/mdadm.conf 的〝DEVICE〞 。不然重開機時 spare-disk 可能會沒作用。

    • –re-add
      再加入 spare-disk,如曾移除 spare-disk 可用選項〝–re-add〞再加入,或用選項〝–add〞加入 spare-disk 但重開機後 spare-disk 就不見可用〝–re-add〞試看看(重開機後用 mdadm –detail md-DEVICE 觀察有無 spare-disk)
    • –remove 或 -r 
      移除 spare-disk 或組 RAID 中故障的硬碟。
    • –fail 或 -f
      模擬故障硬碟,此選項主要是模擬組 RAID 的硬碟故障了,可事先演練如真的硬碟壞了的處理方面或要移除活動 RAID 上的硬碟可把硬碟先設為故障再移除。下例為 create 模式所建的 RAID 1,模擬其一硬碟故障的處理。

      例:

      mdadm /dev/md0 –fail /dev/sdc ←模擬〝/dev/sdc〞故障
      mdadm: set /dev/sdc faulty in /dev/md0
      mdadm –detail /dev/md0 ←觀察 RIAD 有無重建
                中間略
      Rebuild Status : 8% complete ←重建資料的進度UUID : 0fcf1a50:057f9442:49ee75e2:9acafdb6
      Events : 0.56
      Number   Major   Minor   RaidDevice State
      0       8       16        0      active sync   /dev/sdb
      1       8        6        1      spare rebuilding   /dev/sda6
      ↑spare-dsik 自動加入重建 RAID
      2       8        8        32     faulty spare  /dev/sdac                                                           ↑〝/dev/sdc〞被標示為故障了
      cat /proc/mdstat ←監控 RAID 狀況
      Personalities : [raid1]
      md0 : active raid1 sda6[2] sdb[0]sdc[1](F)←(F)代表 faulty 壞掉了
      3767808 blocks [2/1] [U_] ←RAID1 二顆硬碟壞了一顆
      [===>…………….]  resync =  18.1% (6874224/3767808) finish=4.5 min speed=12572K/sec ←顯示同步完成進度和時間
      mdadm /dev/md0 –remove /dev/sdc ←移除故障的硬碟
      mdadm: hot removed /dev/sdc

      上例的測試可知 RAID 容錯能力和預留 spare-disk 的好處,只要 RAID1/5/6 有硬碟壞了會自動把 spare-disk 加入,如果硬碟控制卡有支援熱插拔更可不用關機把故障的硬碟移除和更換,如不確定一定要關機後再移除和更換磁碟,否則硬體可能會損壞[註 5.2]。

      上例也可把 –fail 和 –remove 寫在一起而寫成 mdadm /dev/md0 –fail /dev/sdc –remove /dev/sdc

      由於 RAID 某硬碟故障時原 spare-disk 會取代故障硬碟,故最好即時再加一 spare-dsik 來預備,如追加的 spare-disk 硬碟的 device 名稱有變動記得更新 /etc/mdadm.conf

  • Assemble 模式,重啟之前建立的 RAID
    如要把 RAID 停止可用雜項模式 的 mdadm –stop ,要再啟動就 assemble 模式 mdadm –assemble 或 mdadm -A。例:

    umount /dev/md1 ←先卸載 md-device 上的 RAID
    mdadm /dev/md1 –stop /dev/md1 ←停止 md-device
    mdadm: stopped /dev/md1
    mdadm –assemble /dev/md1 ←重啟 md-device
    mdadm: /dev/md0 has been started with 3 drivers and 1 spare.

    如要要啟動的 RAID 有很多個,可配合不特定模式 mdadm –assemble –scan 會掃描/etc/mdadm.conf 所有的 RAID 一一重啟。

  • Monitor 模式,監控 Software-RAID
    mdadm –monitor 會令 mdadm 進入監控模式,當 Soft-RAID 有異常時發出 email 通知或執行一些必要的程式(如備份或修復等),監控模式的許多動作也可用/etc/mdadm.conf 來設定。監控模式一般會再配合選項〝–daemonize〞或〝–daemonise〞 讓其在背景監控。

    常用的監控模式選項如下:

    • –mail 或 -m 
      設定通知的 email例:

      mdadm –monitor –scan –daemonize –mail=abc@123.com ←當任何 RAID 有異常時發 email 通知
      mdadm –monitor /dev/md2 –daemonize –mail=123@abc.com ←只有 /etc/md2 有異常時發 email 通知
    • –program 或 -p
      執行一些必要的程式
    • –syslog 或 -y
      設定所有的事件記錄在 syslog
    • –test 或 -t 
      測試監控模式,用於驗証可否正確的執行 email 通知或必要的程式。
  • Grow 模式,改變 RAID 大小
    如果組 RAID 的硬碟有更換過,例如 RAID 1兩顆硬碟都換過不同的容量的硬碟, RAID 大小有所改變時可用 mdadm –grow 或 mdadm -G 改變 RAID 的大小。例:

    mdadm –grow /dev/md0 –size=max ←改變 md0 容量
    resize2fs /dev/md0 ←調整 filesystem 大小
  • Misc 雜項模式
    雜項主要用於查詢,徹底清除 RAID,重要的選項如下:

    • –query 或 -Q
      查詢 md-device。
    • –detail 或 -D
      顯示一或多個 md-devuce 詳細的資訊。例:

      mdadm –detail /dev/md0 ←顯示 md0 詳細資訊
      mdadm –detail –scan ←掃描所有的 md-devices
    • –examine 或 -E
      查詢硬碟或 partition 有無 RAID 的 metadata (中介資訊)。例:

      mdadm –examine /dev/sdb ←查詢硬碟 /dev/sdb 是否有 RAID 的 metadata
    • –stop
      停止 RAID
    • –zero-superblock
      清除硬碟或 partition 上所有 RAID 的 metadata 或 superblock。有時用 mdadm –create md-DEVICE 建立 RAID 時因某硬碟或 partitioin 內已存在之前 RAID 的 metadata,可試著用 mdadm –zero-superblock DEVICE 把硬碟上的 metadara 徹底清除再試看看。

      如要徹頭徹尾夜清除 RAID 可如下動作 :

      umount /dev/md3 ←先卸載
      mdadm /dev/md0 –stop /dev/md3 ←停止 md
      mdadm –zero-superblock /dev/sda /dev/sdb /dev/sdc ←把組 md 所有硬碟的資訊都清除
      rm /etc/mdadm.conf ←刪除設定檔
  • 不特定模式
    不特定模式主要的選項如下:

        • –scan 或 -S
          此選項為會掃描/etc/mdadm.conf 設定作為參考 。

    例:

    mdadm –assemble –scan ←掃描/etc/mdadm.conf 重啟 RAID
    mdadm –detail –scan ←掃描所有的 md-devices
        • –verbose 或 -v
          顯示詳細資訊。

    例:

    mdadm –create /dev/md0 -v –raid-devices=2 –level=0 /dev/md1 /dev/md2
    • –brief 或 -b
      顯示比 –verbose 更短的資訊。
    • –quit 或 -q
      安靜模式,執行 mdadm 時除非有重要的訊息,否則不輸出。

mdadm 建立混合 RAID
常見的和實用的混合 RAID有 RAID10、,RAID50 和 RAID60,部分發行版有支援 –level=10,故如下例一個指令就可建立 RAID10。

例:

mdadm -v –create /dev/md0 –level=raid10 –raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde ←建立 RAID 10

上述方法雖方便但不易了解各別硬碟的作用,如那個硬碟為 stripe 那個硬硬是 mirror ?,故建議一層一層的建,如下例建一個 RAID 50,先建兩個 RAID 5,再把這兩個 RAID 5 組成 RAID 0 就是 RAID 50。

例:

mdadm –create /dev/md0 –raid-devices=3 –level=5 /dev/sdb1 /dev/sdc1 /dev/sdd1
  ↑ 先建一 RAID 5
mdadm –create /dev/md1 –raid-devices=3 –level=5 /dev/sde1 /dev/sdf1 /dev/sdg1
  ↑ 再建一 RAID 5 
mdadm –create /dev/md3 –raid-devices=2 –level=0 /dev/md0 /dev/md1
  ↑ 二個 RAID5 組成 RAID 0 就是 RAID 50

 

^ back on top ^