如果發現文件系統的容量不足了,可以通過 LVM 輕松的進行擴展(當然也可以進行縮減操作)。本文將緊接前文中的 demo 詳細的介紹擴展文件系統的操作過程。說明:本文的演示環境為 ubuntu 16.04。
警報:可用磁盤空間不足
當我們收到可用磁盤空間不足的警報時,就需要去診斷磁盤空間相關的問題了。一般的結果是:增加磁盤容量(簡單有效,清理掉一些看似沒用的文件是件風險極大的事情)!
df 命令可以幫助我們查看文件系統的容量:
上圖中的 LV nicklv00 的總容量為 15G,此時可用容量已經不足 1G了,我們接下來擴展這個 LV。
查看當前系統中磁盤的概況
在動手擴展文件系統的容量前,我們需要先搞清楚當前系統中磁盤的基本情況。lsblk 命令可以幫助我們查看系統上的所有塊設備列表(下面命令中筆者通過 -e 選項排除了 loop 設備和光驅):
$ lsblk -e 7,11
我們比較關注掛載點 /home/doc 對應的文件系統的情況:它的磁盤類型為 LVM,對應的 LV 名稱為 nicklv00,LV 在名稱為 nickvg 的 VG 中。其中磁盤的整個容量為 20G,而 LV 的容量只有 15G。我們先用 lvdisplay 命令來觀察下 LV 的詳細信息:
$ sudo lvdisplay nickvg/nicklv00
這里比較重要的兩點是 LV 的容量為 15G,它所屬的 VG 名稱為 nickvg。接下來用 vgdisplay 命令查看名稱為 nickvg 的 VG 的詳細信息:
$ sudo vgdisplay nickvg
上圖顯示 VG 的容量為 19.97G,已經分配了 15G,還有 4.97G 是空閑的。如果我們的要求不高,可以直接把 VG 中空閑的 4.97G 分配給 LV nicklv00,但是我們希望給 nicklv00 多分些空間,比如 50G。所以我們需要繼續查看 VG 的底層構成。
通過 pvs 可以查看 pv 與 vg 的組成關系:
$ sudo pvs
VG nickvg 是由 PV /dev/sdd1 構成的,/dev/sdd1 的容量為 19.97G。要查看 PV 的詳細信息,可以使用 pvdisplay 命令:
$ sudo pvdisplay /dev/sdd1
至此我們已經搞清楚了系統當前的存儲系統(忽略了我們不太關心的磁盤),總結一下:硬盤設備 /dev/sdd 的容量為 20G,其上創建了一個 20G 的硬盤分區 /dev/sdd1,硬盤分區 /dev/sdd1 被創建為 LVM 的物理卷(PV,PV 的名稱依然是 /dev/sdd1),大小仍然為 20G。在物理卷 /dev/sdd1 上創建了容量為 20G 的卷組(VG) nickvg,在 nickvg 中有一個 15G大小的邏輯卷(LV) nickvg/nicklv00。文件系統就建立在 LV 上,掛載點為 /home/doc。
擴展方案
我們打算為 /home/doc 下掛載的文件系統增加 50G 的容量,因此僅僅利用 VG 中剩余的 4.97G 空間時不夠的。簡單起見,我們直接新增一塊容量為 50G 的硬盤(此處為虛擬磁盤),通過 LVM 添加到 VG 中,然后擴展 LV,並最終完成擴展文件系統的任務。
添加磁盤並創建物理卷(PV)
在虛擬機中添加虛擬磁盤並非難事,這里不再細說,筆者添加的磁盤設備文件為 /dev/sde:
接下來請參照前文《LVM : 簡介》中的介紹創建磁盤分區,並用磁盤分區創建 LVM 物理卷(PV)。
筆者創建的磁盤分區為 /dev/sde1:
創建的物理卷如下所示:
擴展卷組(VG)
接下來我們需要通過 vgextend 命令擴展卷組。vgextend 命令可以把一個或多個物理卷(LV)加入到 VG 中:
$ sudo vgextend nickvg /dev/sde1
檢查 VG nickvg 的詳細信息:
此時 VG 的容量已經變成了 69.94G,可用的容量有 54.94G,擴展 VG 成功了!再看看 VG 與 PV 的關系:
VG nickvg 由 /dev/sdd1 和 /dev/sde1 兩個 PV 組成,當前總的可用空間為 4.97G + 49.97G。
擴展邏輯卷(LV)
LVM 最主要的功能就是能動態地調整分區的大小,其實也就是修改邏輯(LV)的容量。修改 LV 容量的命令有 lvextend(擴展邏輯卷)和 lvreduce(縮減邏輯卷),這兩個命令的用法差不多,這里我們只介紹 lvextend 命令。lvextend 命令的格式如下:
lvextend [-L (+size) -l (+PE 數)] 邏輯卷名稱
-L 選項表示為 LV 增加指定 size 的容量。
-l 選項表示為 LV 增加指定數目的 PE。
我們通過下面的命令來擴展 LV:
$ sudo lvextend -L 65G nickvg/nicklv00 或者:$ sudo lvextend -L 65G /dev/nickvg/nicklv00
然后檢查下 LV 的詳細信息:
nickvg/nicklv00 邏輯卷的大小已經變成了 65G。再看看 PV 的信息:
哈哈,居然不是直接用光 /dev/sde1 上的空間,而是先用光 /dev/sdd1 上的空間,然后從 /dev/sde1 上分配剩余的空間。
縮減邏輯卷的方式和擴展邏輯卷的方式差不多,只不過使用的是 lvreduce 命令。
擴展文件系統
resize2fs 命令用來擴展或收縮文件系統的容量,但是這個命令只支持 ext2、ext3、ext4 格式的文件系統。筆者的文件系統為 ext4,所以可以使用 resize2fs 命令進行擴展。這個命令還有一個特點,如果是擴展文件系統的容量,那么不管目標文件系統是否處於掛載狀態都可以執行。如果是縮減文件系統的容量,則只能先卸載文件系統,縮減容量后再重新掛載文件系統。下面的命令把文件系統的容量擴展至 LV 的總容量:
$ sudo resize2fs /dev/nickvg/nicklv00
再去查看下文件系統的信息:
目標文件系統已經顯示被擴展到了 64G(各種開銷),至此我們完成了文件系統的擴容任務。
總結
使用 LVM 管理磁盤讓文件系統的擴展/縮減變得非常容易,特別是可以自由的組合硬件磁盤為更大的容量單位(VG),使系統維護者的工作變得輕松不少。除此之外,LVM 還支持快照等特色功能,筆者將在接下來的文章中介紹如何使用 LVM 的快照。