簡介
邏輯卷是一種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
命令,后面跟上快照設備文件的絕對路徑即可,例如: