在對磁碟分割槽的大小進行規劃時,往往不能確定這個分割槽要使用的空間的大小。而使用 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 的豐富功能。