一、简述

    什么是逻辑卷?LVM(Logical Volume Manager)利用Linux内核device-mapper实现存储系统的虚

拟化。通过LVM,把底层存储硬件抽象化成存储逻辑块,再将这些逻辑块集合构成存储池,从存储池空间划分分区,可以简单地扩大或缩小分区,而不用担心硬盘没有足够的连续空间。

使用逻辑卷分区有什么用?使用逻辑卷分区重点在于可以弹性地调整文件系统的容量。在实际环境中我们经常会遇一个文件系统空间不足,想要扩展却又十分麻烦,一开始划分空间偏大,想要缩减也是同样不方便。而LVM可以很好地解决这些问题。

逻辑卷的缺点:由于LVM的原理,导致一个文件数据可能分布在多个硬件设备上,这些设备中只要有一个损坏,数据便有丢失。而且存储效率上也有所下降。通常LVM结合RAID使用,提升读写效能或数据可靠性。




二、LVM原理

    首先理解四个逻辑卷基本概念:

    1、PV(Physical Volume)物理卷:LVM的基本存储逻辑块,可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file)。物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)。

    2、VG(Volume Group)卷组:一个或多个物理卷组成卷组,即构成一个存储池。可以在卷组上创建“LVM分区”(逻辑卷)

    3、LV(Logical Volume)逻辑卷:由若干物理区域组成的虚拟分区,类似于硬盘分区

    4、PE(Physical Extent)物理区域:硬盘可供指派给逻辑卷的最小单位。

    5、LE(Logical Extent)逻辑区域:物理区域被指派给逻辑卷后变为逻辑区域,组成逻辑卷的最小单位。

简单来讲,我们先将块设备初始化为PV,将若干个PV划分为一个VG卷组并命名,卷组被创建时,将PV划分为若干个PE,默认PE大小为4M,即这些PE构成了卷组,最后我们从卷组中拿出若干个PE组成逻辑卷并命名,相当于划分出一块硬盘分区,逻辑卷创建后就可以正常使用它了,比如进行格式化操作,然后挂载到目录树上。


lvm介绍与使用_第1张图片


三、LVM创建演示

以下操作环境为Centos6.5
准备工作:我划分了三个分区/dev/vdb{1,2,3},并设置分区类型为 Linux LVM

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1               1        6243     3146440+  8e  Linux LVM
/dev/vdb2            6244       12486     3146472   8e  Linux LVM
/dev/vdb3           12487       16648     2097648   8e  Linux LVM

1.PV初始化
[root@localhost /]# pvcreate /dev/vdb{1,2,3}
  Physical volume "/dev/vdb1" successfully created
  Physical volume "/dev/vdb2" successfully created
  Physical volume "/dev/vdb3" successfully created
  
2.查看创建的PV信息
[root@localhost /]#  pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/vdb1       lvm2 ---- 3.00g 3.00g
  /dev/vdb2       lvm2 ---- 3.00g 3.00g
  /dev/vdb3       lvm2 ---- 2.00g 2.00g
  
详细查看PV信息
[root@localhost /]# pvdisplay
  "/dev/vdb1" is a new physical volume of "3.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb1
  VG Name               
  PV Size               3.00 GiB
  Allocatable           NO
  PE Size               0                       #在未被加入卷组前,未划分PE
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               3ZEbcc-3S6o-jwfD-0Nxq-C038-uHVv-q50cKZ
   
  "/dev/vdb2" is a new physical volume of "3.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb2
  VG Name               
  PV Size               3.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               cnhxZf-t5bM-FCca-Yp36-QfR2-1Ydd-aHTiqa
   
  "/dev/vdb3" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb3
  VG Name               
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               Dk932c-o5oW-BGz8-3z05-rYTn-i4mu-XEwv1F
  
3.创建VG
[root@localhost /]# vgcreate test /dev/vdb{1,2}
  Volume group "test" successfully created
  
4.查看vg信息
[root@localhost /]# vgs
  VG   #PV #LV #SN Attr   VSize VFree
  test   2   0   0 wz--n- 5.99g 5.99g
  
详细查看vg信息
[root@localhost /]# vgdisplay 
  --- Volume group ---
  VG Name               test
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               5.99 GiB                 #卷组容量为两个PV容量总
  PE Size               4.00 MiB                 #默认PE大小为4M
  Total PE              1534                     #PE的总数
  Alloc PE / Size       0 / 0                    #PE分配的情况
  Free  PE / Size       1534 / 5.99 GiB
  VG UUID               7KC6at-C49L-2kao-rtHA-6SyU-UHb9-NcZiWF
  
5.创建LV
[root@localhost /]# lvcreate -L 2G -n test1 test
  Logical volume "test1" created.

6.查看lv信息
[root@localhost /]# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  test1 test -wi-a----- 2.00g   
  
详细查看lv信息
[root@localhost /]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/test/test1             #逻辑卷设备地址
  LV Name                test1
  VG Name                test
  LV UUID                QQkAgi-LkCY-eRhg-MNW0-L128-t7gr-e5P3HK
  LV Write Access        read/write
  LV Creation host, time localhost, 2016-09-06 16:30:38 +0800
  LV Status              available                   #新创建的LV默认激活可用
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0
  

7.格式化逻辑卷,并挂载
[root@localhost /]# mkfs.ext4 /dev/test/test1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912

正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@localhost /]# mount /dev/test/test1 /mnt
[root@localhost /]# cp /etc/redhat-release /mnt
[root@localhost /]# cat /mnt/redhat-release 
CentOS release 6.5 (Final)
尝试向逻辑卷挂载点拷贝一些数据,完全正常,至此逻辑卷创建成功。

四、在线扩展LV

命令工具:lvextend
格式:
-l|–extents [+]LogicalExtentsNumber[%{VG|LV|PVS|FREE|ORIGIN}]
    此选项可以指定逻辑卷新的LE数量,或增加的数量,也可指定百分比形式扩展
-L|–size [+]LogicalVolumeSize[bBsSkKmMgGtTpPeE]}
    此选项指定大小来扩展
    
使用方法:
[root@localhost /]# -l +100%FREE /dev/test/test1                   #将test卷组的所有剩余PE分配给test1
[root@localhost /]# -L 5G        /dev/test/test1                 #将test1扩展至5G大小
[root@localhost /]# -L +1G       /dev/test/test1                    #增加1G的容量


开始扩展test1
[root@localhost /]# lvextend -L +2G /dev/test/test1
  Size of logical volume test/test1 changed from 2.00 GiB (512 extents) to 4.00 GiB (1024 extents).
  Logical volume test1 successfully resized.
  
再对文件系统调整大小
[root@localhost /]# fsadm resize /dev/test/test1
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/test-test1 is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/test-test1 to 1048576 (4k) blocks.
The filesystem on /dev/mapper/test-test1 is now 1048576 blocks long.

查看扩展后的容量
[root@localhost /]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/vda2                48G   28G   18G  62% /
tmpfs                   3.9G     0  3.9G   0% /dev/shm
/dev/mapper/test-test1  4.0G   68M  3.7G   2% /mnt
[root@localhost /]# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  test1 test -wi-ao---- 4.00g

五、缩减LV

缩减操作较为危险,谨慎操作。缩减LV之前确保已对文件系统重新调整大小。
1、卸载逻辑卷
[root@localhost /]# umount /mnt/

2、强制检测文件系统
[root@localhost /]# e2fsck -f /dev/test/test1
e2fsck 1.41.12 (17-May-2010)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/test/test1: 12/262144 files (0.0% non-contiguous), 33871/1048576 blocks

3、resize文件系统
[root@localhost /]# fsadm resize /dev/test/test1 3G 
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/test-test1 to 786432 (4k) blocks.
The filesystem on /dev/mapper/test-test1 is now 786432 blocks long.

4、缩减LV
[root@localhost ~]# lvchange -an /dev/test/test1     #停止test1逻辑卷
[root@localhost ~]# lvreduce -L 3G /dev/test/test1  #缩减至3G
Size of logical volume test/test1 changed from 4.00 GiB (1024 extents) to 3.00 GiB (768 extents).
  Logical volume test1 successfully resized.
  
5、激活,挂载
[root@localhost ~]# lvchange -ay /dev/test/test1  #激活test1逻辑卷
[root@localhost ~]# mount /dev/test/test1 /mnt   #挂载

6、查看
[root@localhost /]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/vda2                48G   28G   18G  62% /
tmpfs                   3.9G     0  3.9G   0% /dev/shm
/dev/mapper/test-test1  3.0G   68M  2.8G   3% /mnt
[root@localhost /]# lvs
  LV    VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  test1 test -wi-ao---- 3.00g                                                    
[root@localhost /]# cat /mnt/redhat-release 
CentOS release 6.5 (Final)

 六、移除PV

[root@localhost ~]# pvmove /dev/vdb1  #转移pv上的pe到其他pv上,注意其余pv上的剩余pe要能够够容纳现有的pe
  /dev/vdb1: Moved: 0.1%
  /dev/vdb1: Moved: 88.9%
  /dev/vdb1: Moved: 99.9%
  /dev/vdb1: Moved: 100.0%
  
[root@localhost ~]# vgreduce test /dev/vdb1  #踢出卷组
  Removed "/dev/vdb1" from volume group "test
  "
[root@localhost ~]# pvremove /dev/vdb1  #踢出pv
  Labels on physical volume "/dev/vdb1" successfully wiped

七、LVM快照功能

      快照是一种特殊的逻辑卷,是复制原始卷的元数据而建立的逻辑卷,因此它创建速度很快,而且与原始卷在同一卷组。LVM 快照利用一种称为“写时复制(COW – Copy-On-Write)”的技术来跟踪和维持其数据的一致性。当原始卷的数据块(指原始卷所包含的所有数据块,即是空白数据块)第一次写入新数据时,会将旧数据块内容拷贝至快照空间中,也就是说如果只是删掉原始卷某一文件,但是其占用的数据块内容没有改变,删除文件只是不再占有这些数据块,COW认为数据块内容没发生改变,所以不会占用快照空间;还有如果数据块已经重写过一次数据,COW不会再跟踪。

分配给快照的空间,要依据写入的数据量多大和写入的频率,不一定要指派原始卷一样大的空间。快照空间可以扩展或缩减。

利用快照可以记录一个正在使用中的逻辑卷,然后制作一份拍照时刻的备份,由于这个备份是具有一致性的,因此非常的适合于用来备份实时系统。例如,您的运行中的数据库可能即使在备份时刻也是不允许暂停服务的,那么就可以考虑使用LVM的快照模式,然后再针对此快照来进行文件系统级别或者块设备级别的数据备份。

创建快照


为test1创建一个快照,大小为128M
[root@localhost ~]# lvcreate -s /dev/test/test1  -n snap_test1 -L 128M
  Logical volume "snap_test1" created.
  
查看LV信息,已经有快照相关信息生成
[root@localhost /]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/test/test1
  LV Name                test1
  VG Name                test
  LV UUID                QQkAgi-LkCY-eRhg-MNW0-L128-t7gr-e5P3HK
  LV Write Access        read/write
  LV Creation host, time localhost, 2016-09-06 16:30:38 +0800
  LV snapshot status     source of
                         snap_test1 [active]
  LV Status              available
  # open                 1
  LV Size                3.00 GiB
  Current LE             768
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0
   
  --- Logical volume ---
  LV Path                /dev/test/snap_test1
  LV Name                snap_test1
  VG Name                test
  LV UUID                63oKDT-Mii7-6jTF-KBt7-Pj6k-IavE-y1G3zq
  LV Write Access        read/write
  LV Creation host, time localhost, 2016-09-06 16:42:22 +0800
  LV snapshot status     active destination for test1
  LV Status              available
  # open                 0
  LV Size                3.00 GiB
  Current LE             768
  COW-table size         128.00 MiB
  COW-table LE           32
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3
  
快照逻辑卷创建时带有文件系统,可以直接挂载,建议只读挂载
[root@localhost /]# mount -r  /dev/test/snap_test1 /media/

删除原卷上的文件,对比快照卷
[root@localhost /]# rm -f /mnt/redhat-release 
[root@localhost /]# cat /media/
lost+found/     redhat-release  
[root@localhost /]# cat /media/redhat-release 
CentOS release 6.5 (Final)