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/sdd1NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsdb 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/lv0meta-data=/dev/mapper/vg0-lv0 isize=256 agcount=4, agsize=655360 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0data = bsize=4096 blocks=2621440, imaxpct=25 = sunit=0 swidth=0 blksnaming =version 2 bsize=4096 ascii-ci=0 ftype=0log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1realtime =none extsz=4096 blocks=0, rtextents=0data blocks changed from 2621440 to 3145728 逻辑卷的缩容(只针对ext文件系统)如何缩减lvs?$ 首先,取消挂载umount /mnt/lv0其次,缩减文件系统$ resize2fs /dev/vg/lv0 50G ext文件系统缩减到50Gxfs文件系统只能扩不能缩。。。然后,缩减逻辑卷$ 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=300300+0 records in300+0 records out314572800 bytes (315 MB) copied, 27.5877 s, 11.4 MB/s$ ls1.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/vg0lv0$ mount /dev/vg0/lv0 /mnt$ ls /mnt1.txt data 如果想要删除LVM快照,用lvremove命令,后面跟上快照设备文件的绝对路径即可,例如:
浙公网安备 33010602011771号