简介
逻辑卷是一种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