LVM邏輯卷管理器配置使用詳解


簡介 
邏輯卷是一種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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM