首頁 > 軟體

LVM邏輯卷管理器設定使用詳解

2020-06-16 17:15:04

簡介 
邏輯卷是一種device mapper技術,即可以將一個或者多個底層塊裝置組織成一個邏輯裝置,從而提供動態改變大小不停機情況下新增磁碟快照以及備份 等功能,使得對於磁碟的管理更加方便。

 

Logical Volume Manager (LVM),邏輯卷管理LVM是一個多才多藝的硬碟系統工具,無論在Linux或者其他類似的系統,都是非常的好用。傳統分割區使用固定大小分割區,重新調整大小十分麻煩,但是LVM可以建立和管理“邏輯”捲,而不是直接使用物理硬碟,可以讓管理員彈性的管理邏輯卷的擴大縮小,操作簡單,而不損壞已儲存的資料。可以隨意將新的硬碟新增到LVM,以直接擴充套件已經存在的邏輯卷,LVM並不需要重新啟動就可以讓核心知道分割區的存在。文章詳細記錄在PV/VG/LV中3個階段的建立/新增/擴充套件/減小/刪除等實戰操作步驟,方便自己回顧一些基礎用法,也希望能夠幫助大家更好的理解LVM的原理。

  • 邏輯卷的組成結構 
    邏輯卷的組成如下圖所示:

從上圖中可以看出,整個邏輯卷的體系分為3個層次: 
底層的PV 
中層的VG 
最上層的LV
 
最底層的PV作為整個邏輯卷體系的最底層,可以理解為打上了可以被納入邏輯卷管理體系的標籤的整塊磁碟或者磁碟上的某個分割區;中間層的VG是邏輯卷的卷組,由一個或者多個PV組成,並且用同一標準進行分塊,每一塊被稱為PE(Physical Extent)或者PP(Physical Partition),作為LVM的最小定址單元;最上層的LV是從VG中劃分出來的捲,並且作為裝置檔案,可以在其上面建立各種linux支援的檔案系統。在LV層面也有一個概念LE(Logical Extent)。LE與PE一一對應。

  • 針對LVM底層PV的一些基本操作 
    對於底層的PV而言,操作的命令如下表所示:

命令解釋
pvchange 控制指定PV是否可以分派新空間的許可權
pvck 檢查PV的LVM後設資料的一致性
pvcreate 將指定磁碟或分割區轉化為PV
pvdisplay 詳細地檢視系統當前的PV情況
pvmove 在同一VG捲組裡面移動一個PV的資料到另一個PV裡面
pvremove 刪除PV標籤,即移除PV
pvs 簡略地檢視系統當前的PV情況
pvresize 當PV對應的裝置分割區(如md軟raid)擴容之後,利用該命令可以擴容PV
pvscan 掃描所有打著PV標籤的裝置檔案

      一些pv操作的實驗如下所示:

$ lsblk /dev/sdb /dev/sdd1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0   7G  0 disk 
sdd1   8:49   0   7G  0 part
  
建立pv 
$ pvcreate /dev/sdb /dev/sdd1
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdd1" successfully created
  
檢視pv
$ pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb        lvm2 ---  7.00g 7.00g
  /dev/sdd1       lvm2 ---  7.00g 7.00g
  
掃描pv
$ pvscan
  PV /dev/sdb          lvm2 [7.00 GiB]
  PV /dev/sdd1         lvm2 [7.00 GiB]
  Total: 2 [14.00 GiB] / in use: 0 [0   ] / in no VG: 2 [14.00 GiB]
  
檢查pv後設資料
$ pvck /dev/sdb
  Found label on /dev/sdb, sector 1, type=LVM2 001
  Found text metadata area: offset=4096, size=1044480
$ pvck /dev/sdd1
  Found label on /dev/sdd1, sector 1, type=LVM2 001
  Found text metadata area: offset=4096, size=1044480
  
刪除pv
$ pvremove /dev/sdd1
  Labels on physical volume "/dev/sdd1" successfully wiped 
  • 針對LVM中層VG的一些基本操作 
    對於中層的VG而言,操作的命令如下表所示

命令命令解釋
vgcfgbackup 備份VG描述檔案(預設/etc/lvm/backup,亦可自由指定)
vgcfgrestore 從備份的VG描述檔案對VG後設資料進行恢復
vgck 檢查VG
vgchange 修改特定VG的屬性,包括是否啟用,uuid號,……
vgconvert 修改VG後設資料格式,例如從LVM1改為LVM2
vgcreate 建立VG卷組
vgs 簡略地檢視系統VG捲組情況
vgdisplay 詳細地檢視系統VG卷組的使用情況
vgexport 將特定VG變為未知狀態,用於遷移卷組到別的系統上面
vgimport 將未知狀態的特定VG捲組變為正常狀態,用於遷移卷組到別的系統上面
vgextend 將PV新增到特定VG中
vgimportclone 用於匯入重複的捲組(例如某卷組的快照),並修改其UUID
vgmerge 在滿足特定條件下,對多個卷組進行歸併
vgmknodes 重新建立捲組裝置目錄以及邏輯卷特殊檔案
vgreduce 將未使用的PV從特定VG中移除
vgremove 移除特定VG
vgrename 重新命名指定VG的名稱
vgsplit 將指定的PV從一個VG裡面挪動到另一個VG裡面
vgscan 掃描系統的VG

        一些vg的操作如下所示

$ pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb        lvm2 ---  7.00g 7.00g
  /dev/sdc1       lvm2 ---  4.00g 4.00g
  /dev/sdd1       lvm2 ---  7.00g 7.00g
  
建立vg0和vg1
$ vgcreate vg0 /dev/sdb /dev/sdd1
  Volume group "vg0" successfully created
$ vgcreate vg1 /dev/sdc1
  Volume group "vg1" successfully created
  
檢視vg
$ vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    2   0   0 wz--n- 13.99g 13.99g
  vg1    1   0   0 wz--n-  4.00g  4.00g
  
掃描vg
$ vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2
  Found volume group "vg1" using metadata type lvm2
  
從vg0中移除/dev/sdd1
$ vgreduce vg0 /dev/sdd1
  Removed "/dev/sdd1" from volume group "vg0"
  
/dev/sdd1新增到vg1當中
$ vgextend vg1 /dev/sdd1
  Volume group "vg1" successfully extended
  
/dev/sdd1從vg1挪動到vg0當中
$ vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    1   0   0 wz--n-  7.00g  7.00g
  vg1    2   0   0 wz--n- 10.99g 10.99g
$ vgsplit vg1 vg0 /dev/sdd1
  Existing volume group "vg0" successfully split from "vg1"
$ vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    2   0   0 wz--n- 13.99g 13.99g
  vg1    1   0   0 wz--n-  4.00g  4.00g 
  • 針對LVM上層LV的一些基本操作 
    對於上層的LV而言,操作命令如下表所示:

命令命令解釋
lvchange 修改指定LV的一些屬性,包括是否是啟用狀態、是否唯讀……
lvconvert 轉換指定LV的屬性,從線性轉化為映象或者快照
lvcreate 建立LV
lvs 簡略地檢視系統內的LV情況
lvdisplay 詳細地檢視系統內的LV情況
lvextend 擴充套件指定LV的容量大小
lvm 管理LVM的一個shell工具
lvmconf LVM設定修改器
lvmconfig 檢視LVM設定的工具
lvmdiskscan 掃描所有LVM2可見的裝置
lvmdump 建立LVM的dump檔案,用於診斷
lvmetad 快取LVM後設資料的守護程式
lvmpolld LVM操作命令的輪詢守護程式
lvreduce 縮容指定的LV
lvremove 刪除指定的LV
lvrename 重新命名指定的LV
lvresize 調整指定LV的大小,即可以擴容也可以縮容
lvscan 掃描系統的LV

        一些LV的操作如下所示:

建立邏輯卷lv0
$ lvcreate -n lv0 -L 10G vg0
  
檢視系統內的邏輯卷情況
$ lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0  vg0  -wi-ao---- 10.00g                                                   
  
邏輯卷的擴容
$ lvextend -L +2G /dev/vg0/lv0
  Size of logical volume vg0/lv0 changed from 10.00 GiB (2560 extents) to 12.00 GiB (3072 extents).
  Logical volume lv0 successfully resized.
  
同步檔案系統(如果是ext檔案系統,則使用resize2fs命令)
$ xfs_growfs /dev/vg0/lv0
meta-data=/dev/mapper/vg0-lv0    isize=256    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2621440 to 3145728
  
邏輯卷的縮容(只針對ext檔案系統)
如何縮減lvs?
$ 首先,取消掛載
umount /mnt/lv0
其次,縮減檔案系統
$ resize2fs /dev/vg/lv0 50G    ext檔案系統縮減到50G
xfs檔案系統只能擴不能縮。。。
然後,縮減邏輯卷
$ lvreduce -L 50G /dev/vg/lv0
最後,再掛載
mount /dev/vg/lv0 /mnt/lv0
  
  
注意!
lvextend -r 選項,就直接resizefs了,因此,就不需要再resize2fs或者xfs_growfs了 
  • 關於LVM的快照功能 
    LVM快照是一種以空間換時間時間的方式製作的lvm捲副本。它只在lvm中工作,並只在源邏輯卷發生改變時佔用快照捲的空間。如果源捲的變化達到1GB這麼大,快照卷同樣也會產生這樣大的改變。因而,對於空間有效利用的最佳途徑,就是總是進行小的修改。如果快照將儲存空間消耗殆盡,我們可以使用lvextend來擴容。而如果我們需要縮減快照所佔用捲的大小,可以使用lvreduce。實驗如下:

       目標邏輯卷資訊如下:

$ pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdb   vg0  lvm2 a--  7.00g    0 
  /dev/sdd1  vg0  lvm2 a--  7.00g 1.99g
$ vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  vg0    2   1   0 wz--n- 13.99g 1.99g
$ lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0  vg0  -wi-ao---- 12.00g

       現在對邏輯卷lv0建立快照,命名為snaplv0

$ lvcreate -s -n snaplv0 -p r -L 1G /dev/vg0/lv0
  Logical volume "snaplv0" created.
$ vgs
  VG   #PV #LV #SN Attr   VSize  VFree   
  vg0    2   2   1 wz--n- 13.99g 1016.00m
$ lvs
  LV      VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0     vg0  owi-aos--- 12.00g                                                   
  snaplv0 vg0  sri-a-s---  1.00g      lv0    0.00

        這裡/dev/vg0/lv0的掛載點為/mnt。往/mnt裡面寫入300MB的隨機檔案,再觀察快照情況,可以看    到,快照對應的Data一項有所增長:

dd if=/dev/urandom of=/mnt/2.txt bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 27.5877 s, 11.4 MB/s
ls
1.txt  2.txt  data
$ lvs
  LV      VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0     vg0  owi-aos--- 12.00g                                                   
  snaplv0 vg0  sri-a-s---  1.00g      lv0    29.42
 

        用snaplv0對邏輯卷進行恢復,注意恢復之前需要先將對應的邏輯卷解除安裝。恢復之後可以看到,原有的snaplv0消失,因此可以得出結論,LVM的快照是一次性的

umount /mnt
$ lvconvert --merge /dev/vg0/snaplv0 
  Merging of volume snaplv0 started.
  lv0: Merged: 71.0%
  lv0: Merged: 91.9%
  lv0: Merged: 100.0%
ls /dev/vg0
lv0
mount /dev/vg0/lv0 /mnt
ls /mnt
1.txt  data

       如果想要刪除LVM快照,用lvremove命令,後面跟上快照裝置檔案的絕對路徑即可,例如:

$ lvremove /dev/vg0/snaplv0

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-05/143774p2.htm


IT145.com E-mail:sddin#qq.com