簡介#
Logical Volume Manager(LVM, 邏輯卷管理)是一種在傳統硬碟分割區上在加上一層邏輯層的硬碟管理方式。
相較於傳統的硬碟管理方式,LVM 能夠實現動態的調整硬碟大小,並且依照不同層級分群,在管理上更加直觀。
因此如伺服器、NAS 等較為需要時常調整硬碟空間的環境,LVM 極為實用。
p.s. 以下所提之指令可能需要 root 權限執行。
層級概念#
其層級概念由底層到高層分別可以劃分成如下:
Physical Volume(PV,物理卷)
指的是實體的儲存空間,如完整的硬碟或其分割區,例如/dev/sda、/dev/sda1…等。Volume Group(VG,卷組)
如同名稱是個群組,裡頭可以有一個或多個PV組成。Logical Volume(LV,邏輯卷)
在傳統的硬碟分區中,若設其為PV、VG後,則該分區的概念在 LVM 中應當被看作整顆實體硬碟。
而LV便是從VG劃分的「硬碟分區」,概念與傳統硬碟分區很像,可以對其進行格式化、掛載、安裝系統等操作,差別在於LV可以更加動態的調整大小。Physical Extent(PE,物理區塊)
LVM 把PV劃分成固定大小的PE(如 4MB),而這些PE是分配LV的最小單位。(LV的大小實際上就是由PE數量決定的)
而我們通常只須重點關注於VG及LV即可,操作時通常圍繞在這兩個層面。
安裝#
以 Ubuntu 為例,可以使用apt直接安裝:
1apt install lvm2
安裝完後可以透過指定pvs、vgs、lvs查看現有的PV、VG、LV。(一開始安裝完應該會是空的)
創建 PV#
選定要使用 LVM 的實體硬碟或分區,並透過pvcreate指定初始化 PV,
舉例欲將/dev/sdb及/dev/sdc1使用 LVM:
1pvcreate /dev/sdb /dev/sdc1
查看當前的PV:
1pvs
p.s. 可以使用指令df -h查看硬碟及分區
創建 VG#
接著將一個或多個PV以指令vgcreate設為一個VG,舉例以先前創建的/dev/sdb及/dev/sdc1為例:
1vgcreate vg0 /dev/sdb /dev/sdc1
其中vg0為VG的名稱,可以自行命名,但請避免特殊符號及空格。
接著查看當前的VG:
1vgs
若是往後有新的PV空間要擴展進VG,則只需要使用指令vgextend即可:
1# 舉例擴展 /dev/sdd 至 vg0
2vgextend vg0 /dev/sdd
創建 LV#
透過指令lvcreate創建LV:
1lvcreate -L 20G -n lv0 vg0
這將以vg0分割出一個 20GB 大小的 LV 並命名為lv0(可以自行修改)。
如果想將整個VG的剩餘空間都劃分為LV,則可以使用如下寫法:
1lvcreate -l 100%FREE -n lv0 vg0
查看當前的LV:
1lvs
使用 LV#
先前說過 LV 如同硬碟分區,因此我們可以像正常分區一樣的使用它,例如格式化:
1mkfs.ext4 /dev/vg0/lv0
然後掛載:
1mkdir /mnt/lv_data
2mount /dev/vg0/lv0 /mnt/lv_data
擴增 LV#
具體步驟如下,假設欲擴增VG剩餘空間的 10GB 到lv0:
1lvextend -L +10G /dev/vg0/lv0
或者也可以將所有的剩餘空間給lv0:
1lvextend -l +100%FREE /dev/vg0/lv0
接著必須讓檔案系統重新掃描變更後的硬碟,
如果你的 LV 已經格式化成ext4檔案系統,則使用resize2fs指令,並支援在線、離線調整:
1resize2fs /dev/vg0/lv0
若為xfs則使用xfs_growfs指令,但只支援在線調整:
1xfs_growfs /mnt/lv_data
接著確認 LV 大小是否擴增正確:
1lvs
LV 縮減?#
該操作相較於前面的這些步驟更為危險,若操作不當將可能導致資料毀損。
關於這部份請見下一篇文章解說:「LVM 安全的縮小 LV 的空間」。