接觸 Linux 多年,檔案系統的使用,說重要也不是,說不重要好像又顯得弱了一點。自己習慣的東西,還是 MBR、Primary、Extended Partition 的那一套,GPT 到現在還搞不懂,人老了真的是越來越不想學新的。
Linux 上的正宗檔案系統當然是 EXT 系統的234,其它諸如 ZFS 或是 BTRFS 就僅只於聽過。所以使用安裝 Linux 也是默默的一個 Partition 系統,一個當 swap,或有時把 home 獨立放一塊。
直到最近公司要換 Server 才開始認真的看了一下這一塊,因為同事們有時會抱怨空間不夠大,只用一顆硬碟或許不是個辦法。另外也有考慮要拿個 SSD 當做 HDD 的 Cache,而這些問題 Logical Volume Manager (LVM) 都可以解決,因此就研究了一下 LVM,把自己用的到的功能寫篇文章跟大家分享。
測試方式
現在還純屬測試階段,所以就使用 VM 來做測試,愛加幾個硬碟就加幾個。這邊我們已 Ubuntu 18.04 為例,用VMWare安裝。在設定環境的時候,不要指定 ISO 檔案,不然會啟動自動安裝模式,就無法選擇 LVM格式。後續在安裝Ubuntu的過程中,請選擇自動LVM分割。
安裝結果
安裝完成 Ubuntu 後,可以下達 fdisk -l 指令,就可以列出目前的分割狀況。fdisk 會列出 MBR 的分割,也會列出 LVM 的分區。
簡單的說,它就是用一個一般的 EXT4 當做系統分割區,然後用 EXTENED 分割區用為 LVM分割。LVM 分割下有兩塊,分為為 root(18.3G) 與swap (1G)。它們的實体位置其實是
- /dev/dm-0 分別指到 /dev/ubuntu-vg/root 與 /dev/mapper/ubuntu–vg-root
- /dev/dm-1 分別指到 /dev/mapper/ubuntu–vg-swap_1 與 /dev/ubuntu-vg/swap_1
LVM 指令
LVM 的指令,簡單可分為三類 pv*, vg*, lv*。
- PV: Physical Volume 實體磁碟的管理工具
- VG: Volume Group 實體磁碟群組管理工具
- LV: Logical Volume 邏輯磁碟管理工具
指令上的使用,概念上來說,是先用 pv* 指令來初始化幾個實體分割區或磁碟,用以組成一個 VG,再把 VG 切割成一個或數個 LV。將來有天儲存空間不夠了,就再接上顆硬碟也是用pv*初始化,加入 VG 內,就可以擴增 LV 的大小了。
接下來,我們就從 VMWARE內新增一顆磁碟,並加入 LVM 內,然後擴增 LV 的磁碟大小,做為指令的實際展示。
PV 指令
在使用 pv* ,要先提到之前範例裡所提的 fdisk -l 指令。可以列出目前的分割與磁碟狀況,假如我們在VMWARE新增了一個40G的磁碟,那麼在 fdisk -l 指令裡,就可以看到產生了 /dev/sdb。
或者有另一個更清楚的指令 lsblk, 可以較完整的列出區塊裝置的狀況。
lsblk 列出了所有的區塊裝置,可以的話,還會列出其內部的分割,甚至是 LV 區塊,所以相對上來講會比 fdisk -l 好用一點。現在我們知道如何列出機器上所有的磁碟了,接來就可以開始對 LVM 進行操作。
pvcreate – 將實體分區轉換成 LVM 用途
pvcreate /dev/sdb – 會把 /dev/sdb 轉換為 LVM 可用的成員分割
pvdisplay – 列出目前的可用的 LVM 實體磁碟
由上圖可以看到有三個可用的 LVM 實体磁碟
- /dev/sda5, /dev/sdc: 已加入 ubuntu-vg VG 內, PV Size 會列出實體大小與剩餘可用的大小。
- /dev/sdb: 還沒加入 VG (VG name 是空的), PV Size 為 40G,目前還沒使用紀錄。
pvremove – 將實體分區轉回一般分區
pvremove /dev/sdb – 會把 /dev/sdb 轉換為 LVM 可用的成員分割。這樣再下 pvdisplay 後,就不會列出 /dev/sdb 了。
pvs – 簡要的列出支援 LVM 的實體裝置
VG 指令
使用 vg* 可以把幾個 physical disk / partition 組成一個 VG (Volume Group),再把 VG 切割成 LV (Logical Volume)
vgcreate – 創建 Volume Group
vgcreate DISK /dev/sdb /dev/sdc
建立一個名為 DISK 的 vg, 包含 /dev/sdb 和 /dev/sdc
vgs – 簡要 VG 狀態
如同 pvs, vgs 可以列出簡要的狀態
vgdisplay – 列出所有的 VG
vgdisplay 不用任何參數的話,可以看到個別 VG 的訊息。
從訊息從還蠻明顯可以知道 VG 的裝況,以上圖為例。VG 名稱為 ubuntu-vg, 目前分割為2個LV。這個 VG 是由2個 PV 所組成,大小一共是79.28GB。
如果想要看更詳細的訊息,包含VG下的每個 LV 狀況和 PV 狀況,可以下達 vgdisplay –verbose ,就可以顯示詳細訊息。若只是要看概要訊息,則只要下 vgs 命令。PV 和 LV 其實也有相似的命令 pvs 與 lvs。
vgextend – 將新的磁碟加入 VG
當我們要將一顆新的PV磁碟加入現有的 VG,就可以使用此 vgextend 的指令。以上面的設定為例,使用 vgextend ubuntu-vg /dev/sdb 就可以將 /dev/sdb 加入 ubuntu-vg 之中。這時,再下 vgdisplay –verbose 就會看到新加入了一顆 PV 碟,並且VG的空間也增加了 40G。
vgreduce – 將PV磁碟移出VG
要將一個 PV 從 VG 移出,則是要使用 vgreduce。以剛的 /dev/sdb 為例,下達 vgreduce ubuntu-vg /dev/sdb,就可以將之移除。要注意的是,這們這裡講的是這個PV剛加入,尚未分配空間給LV前,若想要移除可以下上面的指令,若正使用到一半要移出,會比較麻煩,這邊就不說明。
LV 指令
使用 lv* 可以分配 VG 的空間,給幾個 LV (logical volume),做為如傳統般的 partition 用途。創出 LV 後,可以格式化成所需要各種檔案系統了。
lvcreate – 創建新的 LV
lvcreate -n NAME -L SIZE VGNAME
透過上述的指令,就可以從指定的 VG 裡創建SIZE大小的 LV,並命名為 NAME
lvdisplay – 列出所有的 LV
lvdisplay 不用任何參數的話,可以看到所有VG的 LV 的訊息。
這邊的訊息就顯示有2個LV, device 裝置分別為 /dev/ubuntu-vg/root 與 /dev/ubuntu-vg/swap_1。下面的訊息,也會顯示其空間大小與其它訊息。
lvextend – 增大 partition 空間
當分區空間不夠時,透過上面的命令初始化 PV,加入 VG,最後就可以拿來擴充現有的 LV 了。以上面的例子,分區 /dev/ubuntu-vg/root 的空間原本為 78G。透過命令 lvextend -L+39G /dev/ubuntu-vg/root 就可以把剛新加入的PV空間都分配給它了。
當空間擴充後,但這時用磁碟空間指令 df -h 卻仍是顯示只有 79G。
這是因為檔案系統裡紀錄的大小並沒有被變更,這時再用命令 resize2fs /dev/ubuntu-vg/root 就可以把空間擴增到最大了。
結語
LVM 還有很多指令,沒辦法一一介紹,例如 vg/lv 的 create。這邊只針對我有用到的來說明紀錄一下,由於這是個很成熟的功能了,相信在網路上都可以找到很多相關的資訊。
比較有趣的兩個功能就是「快照」和「用 SSD 當 HDD Cache」,後續如果還有研究再補上來了。