一文全解:LVM(邏輯卷管理器)

狂盗一枝梅發表於2024-07-23

前兩篇文章已經講了關於磁碟分割槽和磁碟陣列的相關內容:

一文全懂:Linux磁碟分割槽

一文全懂:獨立冗餘磁碟陣列(RAID)

但是磁碟分割槽完後再想擴容或者縮容就比較麻煩了,甚至很多時候不能擴容或者縮容,這時候就要用到linux非常常用的硬碟裝置資源管理技術:LVM了。

LVM,英文全稱叫做 "Logical Volume Manager",翻譯過來的意思叫做"邏輯卷管理器",主要解決的是磁碟動態擴容或縮容的問題。

一般而言,在生產環境中無法在最初時就精確地評估每個硬碟分割槽在日後的使用情況,因此會導致原先分配的硬碟分割槽不夠用。比如,伴隨著業務量的增加,用於存放交易記錄的資料庫目錄的體積也隨之增加;因為分析並記錄使用者的行為從而導致日誌目錄的體積不斷變大,這些都會導致原有的硬碟分割槽在使用上捉襟見肘。硬碟分好區或者部署為 RAID 磁碟陣列之後,再想修改硬碟分割槽大小就不容易了,LVM作為現在非常普及的硬碟裝置資源管理技術,允許使用者對硬碟資源進行動態調整,從而解決上述問題。

一、邏輯卷管理器基本概念

image-20240722134650922

上圖中涉及到幾個概念:

PV(Physical Volume):物理卷,顧名思義,它可能是一個硬碟,也可能是一個RAID磁碟陣列。

VG(Volume Group):卷組,多個物理卷(PV)組成一個卷組。

LV(Logical Volume):邏輯卷,也即是我們探討的核心了,它基於卷組分配管理磁碟資源。

PE(Physical Extent):基本單元,LV能管理分配的最小單位,LVM分配出來的每個空間都必須是PE的整數倍。

也就是說物理卷(PV)組成了卷組(VG),邏輯卷(LV)基於卷組(VG)分配管理基本單元(PE)。

上圖中的邏輯卷A跨硬碟將若干個PE合併起來,對外直接使用邏輯卷A即可,而不用關心邏輯卷A下到底有幾個硬碟。

二、邏輯卷管理實戰

LVM部署時,需要逐個配置物理卷、卷組和邏輯卷,常用的部署命令如下所示:

功能 物理卷管理 卷組管理 邏輯卷管理
掃描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
顯示 pvdisplay vgdisplay lvdisplay
刪除 pvremove vgremove lvremove
擴容 vgextend lvextend
縮容 vgreduce lvreduce

有人或許會問,為啥邏輯卷管理沒有擴容和縮容的命令呢?

答:邏輯卷對應著底層的硬碟或者RAID磁碟陣列,如果它能擴容或者縮容,就沒有LVM什麼事兒了,哈哈。

以下操作基於Vmware虛擬機器操作。

1、物理卷和卷組建立

先給虛擬機器新增加兩塊20G的硬碟,然後開機。可以看到sdb/sdc兩塊硬碟已經就緒

image-20240722153944333

第一步: 讓兩塊硬碟支援lvm技術

pvcreate /dev/sdb /dev/sdc
image-20240722154254125

第二步: 把兩塊硬碟裝置加入到storage卷組

vgcreate storage /dev/sdb /dev/sdc
image-20240722154755946

第三步: 檢視卷組狀態

vgdisplay
image-20240722155042974

從上述截圖中可以看到,卷組建立完成後,PE相關的引數就已經確定好了,大小是4MB,40G的空間一共劃分出了10238個PE等待lvm劃分邏輯卷使用。

2、邏輯卷建立

第一步: 建立邏輯卷

我們現在從storage卷組中切割出來一塊201M的邏輯卷裝置。

這裡要注意,切割方式有兩種:

  1. 按照大小切割,使用的引數是-L,比如 -L 150M表示的是切割出來150MB大小的邏輯卷;

  2. 以基本單元的個數為單位,使用的引數是-l,每個基本單元的預設大小是4MB,比如-l 37,就可以生成37*4MB=148MB大小的邏輯卷。

比較方便的肯定是根據大小進行切割:

lvcreate -n kdyzm_lv -L 201 storage
image-20240722203327517

建立是成功了,但是可以看到它提示了個資訊:Rounding up size to full physical extent 204.00 MiB。這個意思就是四捨五入建立了204MB的邏輯卷裝置。為什麼呢,我們明明建立的是201MB大小,它擅自給改成了204MB?答案是我們建立的大小必須是PE(Physical Extent,基本單元)的整數倍,PE大小是4MB,所以就給修正成了204MB。

Linux 系統會把 LVM 中的邏輯卷裝置存放在/dev 裝置目錄中(實際上就是個快捷方式),同時會以卷組的名稱來建立一個目錄,其中儲存了邏輯卷的裝置對映檔案(即/dev/卷組名稱/邏輯卷名稱)。

第二步: 格式化和掛載

如果使用了邏輯卷管理器,不建議使用xfs檔案系統,據說xfs和lvm的相容性並不好。所以接下來使用ext4來格式化硬碟。

image-20240723141604629

當然為了掛載重啟後不失效,需要將掛載資訊寫入到/etc/fstab檔案中,此處不贅述。

3、邏輯卷擴容

使用邏輯卷最大的用處就是可以為它動態擴容:卷組由若干塊硬碟組成,使用者在使用儲存裝置時感知不到裝置底層的架構和佈局,更不用關心底層是由多少塊硬碟組成的,只要卷組中有足夠的資源,就可以一直為邏輯卷擴容。

邏輯卷擴容的步驟:取消掛載->邏輯卷擴容->檢查硬碟完整性->重置裝置在系統中的容量->重新掛載硬碟裝置

第一步: 取消掛載

擴容前請一定要記得解除安裝裝置和掛載點的關聯:umount /kdyzm_lv

第二步: 邏輯卷擴容

將邏輯卷/dev/storage/kdyzm_lv的容量從204.00 MB擴容到300MB

lvextend -L 300M /dev/storage/kdyzm_lv 
image-20240723144057857

同時,它也提示了“Size of logical volume storage/kdyzm_lv changed from 204.00 MiB (51 extents) to 300.00 MiB (75 extents).”,這個邏輯卷原來的容量是204M(51個基本單元),現在擴容到了300M(75個基本單元)。

第三步: 檢查硬碟完整性

確認目錄結構、內容和檔案內容沒有丟失。一般情況下沒有報錯,均為正常情況。

 e2fsck -f /dev/storage/kdyzm_lv 
image-20240723144607332

第四步: 重置裝置在系統中的容量

剛剛是對 LV(邏輯卷)裝置進行了擴容操作,但系統核心還沒有同步到這部分新修改的資訊,需要手動進行同步。

resize2fs /dev/storage/kdyzm_lv 
image-20240723144821755

第五步: 重新掛載硬碟

mount /dev/storage/kdyzm_lv /kdyzm_lv
image-20240723145139653

需要注意的是這裡顯示的容量是287M,而非300M,要比我們當初設計的擴容容量小一些,這個原因是硬體廠商的製造標準是1M=1000KB,1KB=1000B;在計算機繫系統中則是1M=1024KB,1KB=1024B。因此硬碟容量會有些“縮水”,300M的硬碟最終會被識別為 300MB*1000K*1000B/1024B/1024K=286.1022MB ,大概的演算法就是這麼算的。

4、縮小邏輯卷

縮容運算元據丟失的風險會比較大,所以Linux系統規定,為了保證資料安全,在對LVM邏輯捲進行縮容操作之前,必須先檢查檔案系統的完整性。完整的縮容步驟如下:

取消掛載->檢查檔案系統完整性->通知系統核心即將縮容->邏輯捲縮容

第一步: 取消掛載

 umount /kdyzm_lv

第二步: 檢查檔案系統的完整性。

上面說過,檢查檔案系統完整性是Linux系統強制要求的,如果跳過這一步驟,就會有如下提示

image-20240723160141292

要求必須先執行命令e2fsck -f /dev/storage/kdyzm_lv,那就按照要求,先執行該命令

e2fsck -f /dev/storage/kdyzm_lv
image-20240723160419763

第三步: 通知系統核心將邏輯卷容量縮小到100M

resize2fs /dev/storage/kdyzm_lv 100M
image-20240723160650082

執行該命令沒有報錯,說明核心透過計算覺得縮容不會有問題,所以批准了縮容操作。

第四步: 邏輯捲縮容

透過lvreduce命令將邏輯卷的容量縮小到100M

lvreduce -L 100M /dev/storage/kdyzm_lv 
image-20240723161043511

執行完命令,它還會提示下該命令有風險,要對執行命令進行二次確認,輸入y即可。

**第五步: ** 重新掛載系統

image-20240723161406733

這樣就完成了縮容。

5、刪除邏輯卷

刪除邏輯卷,需要依次刪除邏輯卷、卷組、物理卷裝置,順序不可顛倒。

第一步: 取消掛載

刪除/etc/fstab檔案中記錄的掛載資訊,取消掛載關聯。

umount /kdyzm_lv

由於沒有寫/etc/fstab檔案,所以這裡不需要刪除相關資訊。

第二步: 刪除邏輯卷

lvremove /dev/storage/kdyzm_lv 
image-20240723163220630

注意這裡需要二次確認。

第三步: 刪除卷組

vgremove storage

這裡只需要寫卷組名稱,因為我們當初建立卷組的時候也是這麼建立的。

image-20240723163441598

第四步: 刪除物理卷

pvremove /dev/sdb /dev/sdc 
image-20240723165218622

最後,歡迎關注我的部落格:https://blog.kdyzm.cn

相關文章