一、何为LVM

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。

    LVM的大小可以在不卸载的时候随意扩展和收缩而不损坏里面存放的数据。


二、LVM的组成

wKiom1YJW-zwfDURAAFVqFhodiw260.jpg

①、Physical Volume, PV, 物理卷

    物理卷在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区,我们实际的 partition 需要调整系统识别码 (system ID) 成为 8e (LVM 的识别码),然后再经过 pvcreate 的命令将他转成 LVM 最底层的实体卷轴 (PV) ,之后才能够将这些 PV 加以利用!

物理卷布局

LVM 标签在第二个扇区,接下来是元数据区,之后是设备的可用空间。

1、物理卷标签包含:

  • 物理卷 UUID

  • 以字节为单位的块设备大小

  • 以 NULL 结尾的数据区域位置列表

  • 以 NULL 结尾的元数据区域位置列表

备注:默认情况下,pvcreate 命令会在第二个 512 字节扇区放置物理卷标签。这个标签可选择性地放在前四个扇区中的任意一个,因为扫描物理卷标签的 LVM 工具会检查前四个扇区。物理卷标签以字符串 LABELONE 开始。

2、元数据:卷组的配置详情被称为元数据,卷组的每个物理卷元数据区域中均保存完全相同的元数据副本。

  • 可以使用 pvcreate 命令的 --metadatacopies 0 选项创建没有任何元数据副本的物理卷。默认情况下,卷组中的每个物理卷中都会在其元数据区域保留一个一样的元数据副本。

  • 可使用 pvcreate 命令的 --metadatasize 选项指定元数据区域的大小。对于包含数百个物理卷和逻辑卷的卷组来说,默认大小可能太小。

备注:LVM 允许在每个物理卷中保存 0、1 或者 2 个元数据副本。默认是保存一个副本。一旦设置了在物理卷中保存的元数据备份数目之后就无法再更改。第一个副本保存在设备的起始位置,紧挨着标签。如果有第二个副本,会将其放在设备的末尾。如果不小心写入了不同于想要写入的磁盘,从而覆盖了磁盘的起始部分,那么可以使用在设备末尾的元数据第二个副本恢复元数据。


②、Volume Group, VG, 卷组

    卷组建立在物理卷上,一卷组中至少要包括一物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西!所以 VG 就是 LVM 组合起来的大磁盘!每个 VG 最多仅能包含 65534 个 PE。 如果使用 LVM 默认的参数,则一个 VG 最大可达 256GB 的容量

③、Physical Extend, PE, 物理扩展单元

    物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。LVM 默认使用 4MB 的 PE 区块,而 LVM 的 VG 最多仅能含有 65534 个 PE ,因此默认的 LVM VG 会有 4M*65534/(1024M/G)=256G。 这个 PE 很有趣喔!他是整个 LVM 最小的储存区块,也就是说,其实我们的文件数据都是藉由写入 PE 来处理的。 简单的说,这个 PE 就有点像文件系统里面的 block 大小啦。 所以调整 PE 会影响到 VG 的最大容量!

④、Logical Volume, LV, 逻辑卷

    逻辑卷建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化挂载使用的!PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 内的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的装置档名通常指定为『 /dev/vgname/lvname 』或『 /dev/mapper/vgname-lvname 』,此两个档名都是符号链接,真正的设备名为『 /dev/dm-#(1,2,3...) 』。

⑤、logical Extent,LE,逻辑扩展单元

    逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。


    注意:虽然PE是PV的单元。但PV刚刚创建时并没有创建PE,只有加入到VG后才会生产指定大小的PE,所有PE的大小是由VG决定的。LV的大小是由PE决定的,分配多少个PE则LV就为所有PE的总大小。当PE分配到LV时称为LE。


三、LVM的创建及管理

wKioL1YJZPrjxhcyAABBcT0b7xo498.gif

①、PV的创建和管理

[root@wlw ~]# pv [tab][tab]
pvchange   pvcreate   pvmove     pvresize   pvscan     
pvck       pvdisplay  pvremove   pv
#使用pv加两个tab可以看到PV的相关命令

    pvcreate /dev/DEVICE : 将 partition 创建成为 PV 

[root@wlw ~]# pvcreate /dev/sda{6,7,8}
  Physical volume "/dev/sda6" successfully created
  Physical volume "/dev/sda7" successfully created
  Physical volume "/dev/sda8" successfully created

    pvscan :搜寻目前系统中的所有PV

[root@wlw ~]# pvscan 
  PV /dev/sda6         lvm2 [5.01 GiB]
  PV /dev/sda7         lvm2 [8.01 GiB]
  PV /dev/sda8         lvm2 [10.00 GiB]
  Total: 3 [23.02 GiB] / in use: 0 [0   ] / in no VG: 3 [23.02 GiB]

    pvs : 显示PV的简要信息

[root@wlw ~]# pvs /dev/sda6
  PV         VG   Fmt  Attr PSize PFree
  /dev/sda6       lvm2 ---  5.01g 5.01g
[root@wlw ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sda6       lvm2 ---   5.01g  5.01g
  /dev/sda7       lvm2 ---   8.01g  8.01g
  /dev/sda8       lvm2 ---  10.00g 10.00g
#不指定设备则列出所有的设备信息

    pvdisplay : 显示PV的详细信息

[root@wlw ~]# pvdisplay /dev/sda6
  "/dev/sda6" is a new physical volume of "5.01 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda6
  VG Name               
  PV Size               5.01 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               t522PZ-Rvvy-2kvQ-BiYh-lzdq-RmPJ-fRp74C
#不指定设备则列出所有的设备信息

    pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性

[root@wlw ~]# pvremove /dev/sda6
  Labels on physical volume "/dev/sda6" successfully wiped

    pvmove :将VG中的PV移除,在缩减VG的时候使用。


②、VG的创建和管理

[root@wlw ~]# vg [tab][tab]
vgcfgbackup    vgcreate       vgimport       vgremove
vgcfgrestore   vgdb           vgimportclone  vgrename
vgchange       vgdisplay      vgmerge        vgs
vgck           vgexport       vgmknodes      vgscan
vgconvert      vgextend       vgreduce       vgsplit
#使用vg加两个tab可以看到VG的相关命令

    vgcreate  [-s#[mMgGtT]] VolumeGroupName  PhysicalDevicePath : 创建vg

[root@wlw ~]# vgcreate -s 8M myvg /dev/sda6
  Physical volume "/dev/sda6" successfully created
  Volume group "myvg" successfully created
#-s指定PE的大小,单位指定格式为:kKmMgGtTpPeE

    vgscan :搜寻目前系统中的所有VG

    vgs : 显示VG的简要信息

    vgdisplay : 显示VG的详细信息

    vgextend :向 VG 中添加额外的 PV 

[root@wlw ~]# vgextend myvg /dev/sda7
  Volume group "myvg" successfully extended

    vgreduce :在 VG 内移除 PV

[root@wlw ~]# vgreduce myvg /dev/sda6
  Removed "/dev/sda6" from volume group "myvg"
#在移除PV时,切记要先执行pvmove /dev/sda6,让PV中的PE移动到其他PV中去,以免数据丢失

    vgremove :删除 VG 


③、LV的创建和管理

[root@wlw ~]# lv [tab][tab]
lvchange     lvextend     lvmdiskscan  lvmsar       lvresize
lvconvert    lvm          lvmdump      lvreduce     lvs
lvcreate     lvmchange    lvmetad      lvremove     lvscan
lvdisplay    lvmconf      lvmsadc      lvrename  
#使用lv加两个tab可以看到LV的相关命令

    lvcreate {-L|-l} #[mMgGtT] -n NAME VolumeGroup : 创建LV

[root@wlw ~]# lvcreate -L 4G -n mylv myvg
  Logical volume "mylv" created.
#-L:指定LV大小,-n:指定LV的名字,-l:指定给LV分配多少个PE,默认PE大小为4M,这个时候就可以吧LV格式化并挂载使用了

    lvscan :搜寻目前系统中的所有LV

    lvs : 显示LV的简要信息

    lvdisplay : 显示LV的详细信息

    lvremove :删除 LV


添加LV容量

    lvextend {-L|-l} [+]#[mMgGtT]:扩展逻辑卷,向 LV 里面添加容量

[root@wlw ~]# lvextend -L +2G /dev/myvg/mylv 
  Size of logical volume myvg/mylv changed from 4.00 GiB (512 extents) to 6.00 GiB (768 extents).
  Logical volume mylv successfully resized
#这里给mylv添加了2G的大小,如果是指定-L 5G的话,则代表把mylv修改为5G。

    注意:这里我们修改完LV之后,发现磁盘容量并没有变化,这是因为逻辑卷大小确实扩张了,但是文件系统的大小还是之前的大小并没有变化,此时我们需要重新调整文件系统的大小与逻辑卷大小相同。而无需重新挂载。下面我们针对ext系统文件系统进行演示,如果是其他文件系统需要使用其对应的工具。

[root@wlw ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.8G  4.6G  4.7G  50% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             976M   36M  890M   4% /boot
/dev/sr0              3.7G  3.7G     0 100% /mnt
/dev/mapper/myvg-mylv
                      3.9G   12M  3.7G   1% /mylvm
[root@wlw ~]# resize2fs /dev/myvg/mylv 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/myvg/mylv is mounted on /mylvm; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 3
Performing an on-line resize of /dev/myvg/mylv to 3145728 (2k) blocks.
The filesystem on /dev/myvg/mylv is now 3145728 blocks long.
#resize2fs后面如果没有指定大小则默认调整为整个设备的大小
[root@wlw ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.8G  4.6G  4.7G  50% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             976M   36M  890M   4% /boot
/dev/sr0              3.7G  3.7G     0 100% /mnt
/dev/mapper/myvg-mylv
                      5.9G   12M  5.6G   1% /mylvm
#这里我们可以看到,添加的2G已经添加到设备上了,无需重新挂载


缩减LV容量(缩减有风险,需要谨慎操作)

    1、umount /dev/VG_NAME/LV_NAME:卸载设备

[root@wlw ~]# umount /dev/myvg/mylv

    2、e2fsck -f /dev/VG_NAME/LV_NAME:强制检测文件系统

[root@wlw ~]# e2fsck -f /dev/myvg/mylv 
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
MYLV: 13/393216 files (0.0% non-contiguous), 87981/3145728 blocks

    3、resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]:缩减文件系统大小

[root@wlw ~]# resize2fs /dev/myvg/mylv 3G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/myvg/mylv to 1572864 (2k) blocks.
The filesystem on /dev/myvg/mylv is now 1572864 blocks long.
#缩减后文件系统的大小必须能容纳当前所有文件的大小,不然文件会损坏

    4、lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME

[root@wlw ~]# lvreduce -L 3G /dev/myvg/mylv 
  WARNING: Reducing active logical volume to 3.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv? [y/n]: y
  Size of logical volume myvg/mylv changed from 6.00 GiB (768 extents) to 3.00 GiB (384 extents).
  Logical volume mylv successfully resized


④、快照:snapshot

快照卷的原理:

    对原卷(逻辑卷)做快照就是某一刻立即创建对方的元数据的监视器,随时监视对方的元数据,而快照卷刚创建后是没有任何数据的,当我们把快照卷挂载后是可以看到原卷的所有文件的,因为快照卷是原卷的另一个访问路径而已,因为快照卷监视了所有的原卷的元数据,当原卷数据没有发生改变时,两个卷的数据是一样的,由于快照卷的监视器一直在监视原卷的所有文件,当监控原卷的某个文件要发生改变时,会先把原卷中即将修改的文件复制一份到快照卷中,当我们需要恢复快照的时候,没有变化的数据是在原卷中存放的,变化的数据才在目标卷中恢复,所以只有修改过的文件才会复制到快照卷中,所以快照卷体积是很小的。快照卷和原卷必须在同一卷组中。


    lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name:快照卷的创建

[root@wlw ~]# lvcreate -s -L 512M -p r -n mylv-snapshot /dev/myvg/mylv
  Logical volume "mylv-snapshot" created.
[root@wlw ~]# lvs
  LV            VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv          myvg owi-aos---   3.00g                                                    
  mylv-snapshot myvg swi-a-s--- 512.00m      mylv   0.00 
#-s指定此卷为快照卷,-p以只读的格式创建,-n指定快照卷名字。

    lvremove original_lv_name:快照卷的删除

[root@wlw /]# lvremove /dev/myvg/mylv-snapshot 
Do you really want to remove active logical volume mylv-snapshot? [y/n]: y
  Logical volume "mylv-snapshot" successfully removed


⑤、当确定逻辑卷中数据已经备份,打算删除LVM拆除磁盘时

    1、umount /dev/VG_NAME/LV_NAME:卸载设备

[root@wlw /]# umount /dev/myvg/mylv

    2、lvremove lv_name:删除 LV

[root@wlw /]# lvremove /dev/myvg/mylv 
Do you really want to remove active logical volume mylv? [y/n]: y
  Logical volume "mylv" successfully removed

    3、vgremove vg_name:删除 VG

[root@wlw /]# vgremove myvg
  Volume group "myvg" successfully removed

    4、pvremove pv_name:删除 PE

[root@wlw /]# pvremove /dev/sda{6,7,8}
  Labels on physical volume "/dev/sda6" successfully wiped
  Labels on physical volume "/dev/sda7" successfully wiped
  Labels on physical volume "/dev/sda8" successfully wiped

    5、拆除磁盘或用于其他用途