home products tech support contact us

 Linux 技術支援    ⇒   基礎篇    進階篇    補腦篇    指令索引    中⇒ENG
版權所有, 引用請註明出處

 LVM 邏輯卷冊

1.0 LVM 邏輯卷冊
        LVM 原理
        pvcreate 建立 PV
        vgcreate 建立 VG
        lvcreate 建立 LV
            Linear Volume 線性模式
            Stripe Volume 交織模式
            Mirror Volume 鏡像模式
            Snapshot Volume 快照模式
        LVM 遷移/備份



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

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

以下是一些 LVM 的優點:

  1. 彈性和動態調整: LVM 允許你建立虛擬的邏輯卷(LV),這些卷可以跨越多個物理硬碟或硬碟分割區。這提供了更大的彈性,可以隨時調整卷的大小,而無需關閉系統或影響運行中的應用程式。

  2. 資料遷移和遷移: LVM 允許你在不中斷服務的情況下遷移資料,例如將資料從一個物理硬碟遷移到另一個硬碟,或者將資料從一個邏輯卷遷移到另一個卷。這對於升級硬碟或重新組織存儲配置非常有用。

  3. 快照和備份: LVM 提供了快照功能,可以在不中斷系統運行的情況下創建磁碟卷的快照。這對於備份和數據恢復很有幫助,因為你可以在創建快照後進行操作,而原始數據保持不變。

  4. 容錯和冗餘: LVM 支援鏡像(Mirroring)模式,使你可以在多個物理硬碟之間創建冗餘複本,提高數據的容錯能力。如果一個硬碟失效,數據仍然可用。

  5. 容量的有效管理: LVM 允許你將物理硬碟的容量進行抽象化,從而更有效地管理和分配可用空間。

  6. 即時擴充: 你可以即時地擴充邏輯卷的大小,而不需要重新分割硬碟或暫停服務。

  7. 多個文件系統: LVM 允許在同一組物理硬碟上創建多個邏輯卷,這些卷可以運行不同的文件系統,以滿足不同的需求。

總之,LVM 提供了更靈活、更具效率和更容易管理的硬碟存儲方案,特別是對於需要隨著時間進行容量調整、遷移資料或保護數據的場景來說。





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 的一些名詞,常出現在 LVM 的術語如下: 了解原理後實作就不難了,其步驟大致如下:
  1. 建立 PV:
    把一整個硬碟或 partition 用指令 pvcreate 轉為 PV,如是 partition 要把 ID 設為〝LVM〞後再轉為 PV。
  2. 建立 VG:
    vgcreate 將 一個以上的 PV 組成 VG
  3. 建立 LV:
    最後用 lvcreate 把 VG 分割出 LV
  4. 掛載 LVM:
    需一開機就掛載 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 有關的指令如下:

^ back on top ^

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

^ back on top ^


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 容量,用法和 lvcreate 類似,選項〝-L〞或〝-l〞來指定 LV 大小 (參考 lvextend 指令 範例)。
  2. rezise2fs (只支援 ext2/ext3/ext4 filesystem) lvextend 增加 LV 容量完成後記得後 rezise2fs 更改 LV 上的 filesystem 大小 。(xfs filesystem 相對應的指令為 xfs_growfs,例: xfs_growfs /dev/myVG/myLV)
縮小 LV
縮減 LV要暫時的 umount 停機一下,步驟如下 。
  1. umount LV 上的 filesystem。
  2. e2fsck 檢查 LV 上的 filesystem 。
  3. resize2fs 更改 LV 上的 filesystem 大小 。
  4. lvreduce 縮小 LV(可能不支援 xfs filesystem)。
  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 的檔案有無被破壞

^ back on top ^

其他和 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 ←activate the 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 ^




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

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