LVM逻辑卷管理器配置使用详解

来源:互联网 发布:无限透支黑卡 知乎 编辑:程序博客网 时间:2024/06/06 00:41

简介 
逻辑卷是一种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将指定磁盘或分区转化为PVpvdisplay详细地查看系统当前的PV情况pvmove在同一VG卷组里面移动一个PV的数据到另一个PV里面pvremove删除PV标签,即移除PVpvs简略地查看系统当前的PV情况pvresize当PV对应的设备分区(如md软raid)扩容之后,利用该命令可以扩容PVpvscan扫描所有打着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检查VGvgchange修改特定VG的属性,包括是否激活,uuid号,……vgconvert修改VG元数据格式,例如从LVM1改为LVM2vgcreate创建VG卷组vgs简略地查看系统VG卷组情况vgdisplay详细地查看系统VG卷组的使用情况vgexport将特定VG变为未知状态,用于迁移卷组到别的系统上面vgimport将未知状态的特定VG卷组变为正常状态,用于迁移卷组到别的系统上面vgextend将PV添加到特定VG中vgimportclone用于导入重复的卷组(例如某卷组的快照),并修改其UUIDvgmerge在满足特定条件下,对多个卷组进行归并vgmknodes重新创建卷组设备目录以及逻辑卷特殊文件vgreduce将未使用的PV从特定VG中移除vgremove移除特定VGvgrename重命名指定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创建LVlvs简略地查看系统内的LV情况lvdisplay详细地查看系统内的LV情况lvextend扩展指定LV的容量大小lvm管理LVM的一个shell工具lvmconfLVM配置修改器lvmconfig查看LVM配置的工具lvmdiskscan扫描所有LVM2可见的设备lvmdump创建LVM的dump文件,用于诊断lvmetad缓存LVM元数据的守护程序lvmpolldLVM操作命令的轮询守护程序lvreduce缩容指定的LVlvremove删除指定的LVlvrename重命名指定的LVlvresize调整指定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