阿旺的 Linux 開竅冊-LVM 和 RAID

阿旺的 Linux 開竅手冊







基礎篇
進階篇
補腦篇
版權所有,引用請註明出處

 進階篇

Advanced Chapter 5 : LVM 和 RAID

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〞會有多少帳號要預留多大才夠?不得己情形下用 fdiskparted 重新分割硬碟對系統管理者來說一直是個惡夢。雖有許多商業軟體如 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 的術語如下: 了解原理後實作就不難了,其步驟大致如下:
  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: gpt

Number  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 有關的指令如下: 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 有關的指令如下:

lvcreate 建立 LV
lvcreate 就類似傳統 fdiskparted 分割硬碟 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 有關的指令如下:

預設 LV 是 Linear volume ,但 LV 也可工作在 Stripe volumeMirror volume 模式,和額外的 Snapshot volume 功能各說明如下: 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 其優缺點各如下:

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

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

其間對一般使用者可能只覺硬碟頓一下但無傷大雅。但不管是 Hardware RAIDSoftware 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 RAIDFake RAID 可能只支援有限的 RAID-Levles。雖標準的 RAID-Levles 從 RAID0~RAID6 但 RAID 2~RAID4 理論大於實際並不實用,也少有商業化的成品就略過不介紹了。




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)和 LVMkpartx 的〝 dm〞( /dev/mapper/)都是虛擬儲存裝置。

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

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 ^














www.reliablecounter.com
digital mastering

[註5.0] 可用 dmsetup table 來觀察那個 PV 當 mirror-log 或 mirror-leg。

[註5.0A] Fedora 8 的快照功能似乎有 bug 無法建立 snap-volume。

[註5.1] LSI Logicl 晶片組的 RAID 控制卡判斷硬碟沒反應的 time-out 時間一般是 10 秒,3ware 晶片組為 20 秒,而 Linux 的 Soft RAID time-out 時間是 30 秒。(參考來源 wiki: http://en.wikipedia.org/wiki/Time-Limited_Error_Recovery#Software_Raid)

[註5.1A] 參考來源 WD Knowledge Base 中文: http://wdc-tw.custhelp.com/app/answers/detail/a_id/7019/session/L3RpbWUvMTQwNzk0ODcyMy9zaWQvLUxSSm9MX2w%3D
& 英文: http://wdc.custhelp.com/app/answers/detail/a_id/1397/p/227,283/session/L3RpbWUvMTMyMTQzOTc4NS9zaWQvdVhvYmpmSms%3D

[註5.2] IDE 界面的硬碟不支援熱插拔,SCSI/SAS/SATA//eSATA/USB 界面的硬碟才有可能支援熱插拔,但有無支援還是要參考硬體的說明書。以目前主流的 SATA 界面的硬碟來說主機板 BIOS 要支援〝ACHI〞 mode 且 OS 也要支援才有熱插拔功能