在對磁盤分區的大小進行規划時,往往不能確定這個分區要使用的空間的大小。而使用 fdisk、gdisk 等工具對磁盤分區后,每個分區的大小就固定了。如果分區設置的過大,就白白浪費了磁盤空間;如果分區設置的過小,就會導致空間不夠用的情況出現。對於分區過小的問題,可以從新划分磁盤的分區,或者通過軟連接的方式將此分區的目錄鏈接到另外一個分區。這樣雖然能夠臨時解決問題,但是給管理帶來了麻煩。類似的問題可以通過 LVM 來解決。
說明:本文的演示環境為 ubuntu 16.04。
LVM 是什么
LVM 是 Logical Volume Manager 的縮寫,中文一般翻譯為 "邏輯卷管理",它是 Linux 下對磁盤分區進行管理的一種機制。LVM 是建立在磁盤分區和文件系統之間的一個邏輯層,系統管理員可以利用 LVM 在不重新對磁盤分區的情況下動態的調整分區的大小。如果系統新增了一塊硬盤,通過 LVM 就可以將新增的硬盤空間直接擴展到原來的磁盤分區上。
LVM 的優點如下:
- 文件系統可以跨多個磁盤,因此大小不再受物理磁盤的限制。
- 可以在系統運行狀態下動態地擴展文件系統大小。
- 可以以鏡像的方式冗余重要數據到多個物理磁盤上。
- 可以很方便地導出整個卷組,並導入到另外一台機器上。
LVM 也有一些缺點:
- 在從卷組中移除一個磁盤的時候必須使用 reducevg 命令(這個命令要求root權限,並且不允許在快照卷組中使用)。
- 當卷組中的一個磁盤損壞時,整個卷組都會受影響。
- 因為增加了一個邏輯層,存儲的性能會受影響。
LVM 的優點對服務器的管理非常有用,但對於桌面系統的幫助則沒有那么顯著,所以需要我們根據使用的場景來決定是否應用 LVM。
LVM 中的基本概念
通過 LVM 技術,可以屏蔽掉磁盤分區的底層差異,在邏輯上給文件系統提供了一個卷的概念,然后在這些卷上建立相應的文件系統。下面是 LVM 中主要涉及的一些概念。
物理存儲設備(Physical Media):指系統的存儲設備文件,比如 /dev/sda、/dev/sdb 等。
PV(物理卷 Physical Volume):指硬盤分區或者從邏輯上看起來和硬盤分區類似的設備(比如 RAID 設備)。
VG(卷組 Volume Group):類似於非 LVM 系統中的物理硬盤,一個 LVM 卷組由一個或者多個 PV(物理卷)組成。
LV(邏輯卷 Logical Volume):類似於非 LVM 系統上的磁盤分區,LV 建立在 VG 上,可以在 LV 上建立文件系統。
PE(Physical Extent):PV(物理卷)中可以分配的最小存儲單元稱為 PE,PE 的大小是可以指定的。
LE(Logical Extent):LV(邏輯卷)中可以分配的最小存儲單元稱為 LE,在同一個卷組中,LE 的大小和 PE 的大小是一樣的,並且一一對應。
可以這么理解,LVM 是把硬盤的分區分成了更小的單位(PE),再用這些單元拼成更大的看上去像分區的東西(PV),進而用 PV 拼成看上去像硬盤的東西(VG),最后在這個新的硬盤上創建分區(LV)。文件系統則建立在 LV 之上,這樣就在物理硬盤和文件系統中間添加了一層抽象(LVM)。下圖大致描述了這些概念之間的關系:
對上圖中的結構做個簡單的介紹:
兩塊物理硬盤 A 和 B 組成了 LVM 的底層結構,這兩塊硬盤的大小、型號可以不同。PV 可以看做是硬盤上的分區,因此可以說物理硬盤 A 划分了兩個分區,物理硬盤 B 划分了三個分區。然后將前三個 PV 組成一個卷組 VG1,后兩個 PV 組成一個卷組 VG2。接着在卷組 VG1 上划分了兩個邏輯卷 LV1 和 LV2,在卷組 VG2 上划分了一個邏輯卷 LV3。最后,在邏輯卷 LV1、LV2 和 LV3 上創建文件系統,分別掛載在 /usr、/home 和 /var 目錄。
LVM 工具
在安裝 ubuntu16.04 時,如果選擇使用 LVM 創建分區,就會安裝 LVM 相關的工具。當前這個軟件包的名稱為 lvm2,其中包含了大量 LVM 工具(筆者會在隨后的文章中介紹其中一些工具的用法)。比如單是查看 LVM 相關實體狀態的命令就有如下一些:
$ sudo pvscan $ sudo pvs $ sudo pvdisplay $ sudo vgscan $ sudo vgs $ sudo vgdisplay $ sudo lvscan $ sudo lvs $ sudo lvdisplay
如果安裝系統時沒有默認安裝 LVM 工具包,可以通過下面的命令安裝它們:
$ sudo apt update $ sudo apt install lvm2
接下來我們通過例子來演示如何使用 LVM 來一步步的創建出邏輯卷(LV),然后在 LV 上創建文件系統並掛載到 Linux 系統中。
使用 gdisk 對物理磁盤進行分區
目前常見的磁盤分區格式有兩種,MBR 分區和 GPT 分區:
MBR 分區,MBR 的意思是 "主引導記錄"。MBR 最大支持 2TB 容量,在容量方面存在着極大的瓶頸。
GPT 分區,GPT 意為 GUID 分區表,它支持的磁盤容量比 MBR 大得多。這是一個正逐漸取代 MBR 的新標准,它是由 UEFI 輔住而形成的,將來 UEFI 用於取代老舊的 BIOS,而 GPT 則取代老舊的 MBR。
筆者在《Linux 磁盤與磁盤分區》一文中介紹了使用 fdisk 工具創建 MBR 磁盤分區的方式,gdisk 是 Linux 系統中 GPT 格式的磁盤分區管理工具。這里我們僅介紹如何使用 gdisk 創建新的磁盤分區。假設我們的 Linux 系統中增加了一塊新的磁盤,系統對應的設備名為 /dev/sdd,下面我們通過 gdisk 命令對這個磁盤進行分區。
在用 gdisk 命令對磁盤分區前,我們先用 parted 命令查看 /dev/sdd 當前的分區情況:
$ sudo parted /dev/sdd print
結果顯示這是一塊尚未創建分區表的磁盤(Model 顯示該磁盤是通過 VMware 創建的虛擬磁盤)。下面通過 gdisk 命令創建分區:
$ sudo gdisk /dev/sdd
通過 p 命令可以查看磁盤當前的狀態:
輸出中的前幾行是磁盤的基本信息,比如總大小為 20G,一共有多少個扇區(sector),每個扇區的大小,當前剩余的空間等等。然后是已經存在的分區信息(上圖顯示還沒有任何分區):
第一列 Number 顯示了分區的編號,比如 1 號指 /dev/sdd1。
第二列 Start 表示磁盤分區的起始位置。
第三列 End 表示磁盤分區的結束位置。
第四列 Size 顯示分區的容量。
第五列 Code 和第六列 Name 顯示分區類型的 ID和名稱,比如 Linux filesystem 為 8300,Linux swap 為 8200,Linux LVM 為 8e00。
下面通過 n 命令來創建新分區:
分區編號和開始/結束的扇區都直接通過回車選擇默認值,這樣所有的磁盤空間都划分到了一個分區中,然后輸入 8e00 說明我們要創建的分區類型為 Linux LVM。最后輸入 w 命令並確認執行分區操作。分區成功后可通過 p 命令查看我們創建的分區的信息:
此時可以看到新產生的設備文件 /dev/sdd1:
創建物理卷 PV
現在我們可以基於磁盤分區 /dev/sdd1 來創建 LVM 物理卷(LV),可以通過 pvcreate 命令來完成:
$ sudo pvcreate /dev/sdd1
此時 /dev/sdd1 已經完成了從磁盤分區到 PV 的華麗轉身!注意上面的命令,磁盤分區被直接轉換成了 PV,連名稱都沒有變化!我們可以通過 pvs 命令查看 /dev/sdd1,目前它還沒有被加入到 VG 中:
創建卷組 VG
基於一個或多個 PV,可以創建 VG。我們使用剛才創建的 PV /dev/sdd1 來創建一個名稱為 nickvg 的 VG:
$ sudo vgcreate -s 32M nickvg /dev/sdd1
注意 vgcreate 命令中的 -s 選項,它指定了 PE(Physical Extent) 的大小。可以通 vgs 命令觀察 VG 的信息:
$ sudo vgs nickvg
如果目標 VG 已經存在,則使用 vgextend 把 PV 加入到 VG 中即可。
創建邏輯卷 LV
有了 VG 就可以創建邏輯卷 LV 了,lvcreate 命令用來創建 LV,讓我們在前面創建的 nickvg 上創建名稱為 nicklv00 的 LV:
$ sudo lvcreate -L 15G -n nicklv00 nickvg
選項 -L 指定新建 LV 的容量,這里是 15G;選項 -n 則指定新建 LV 的名稱,這里為 nicklv00。可以通過 lvs 命令觀察 LV 的信息,注意需要同時指出 LV 所在的 VG:
格式化邏輯卷(創建文件系統)
當我們創建 LV nickvg/nicklv00 時,其實是創建了名稱為 /dev/nickvg/nicklv00 的設備文件:
現在我們來格式化這個邏輯卷(在該 LV 上創建文件系統),目標為比較常見的 ext4 格式:
$ sudo mkfs.ext4 /dev/nickvg/nicklv00
然后創建個目錄,比如 /home/doc,並把新建的文件系統掛載到這個目錄上:
$ sudo mkdir /home/doc $ sudo mount /dev/nickvg/nicklv00 /home/doc
最后可以通過 df 命令查看這個文件系統的使用情況:
開機自動掛載
編輯 /etc/fstab 文件:
$ sudo vim /etc/fstab
把下面的行添加的文件末尾並保存文件:
/dev/mapper/nickvg-nicklv00 /home/doc ext4 defaults 0 0
總結
本文介紹了 LVM 的基本概念,並從頭開始以 LVM 的方式創建了一個文件系統。筆者故意忽略了很多的細節和 LVM 的強大功能,目的是讓這個入門的 demo 看起來更簡單一些。在后續的文章中筆者會介紹更多詳細的內容以展示 LVM 的豐富功能。