一、逻辑卷管理器LVM概述

前面我们在Linux系统上模拟软RAID,使用的是md模块,事实上,还有一个模块dm——device mapper,也可以实现软RAID的模拟。md模块的管理工具是mdadm,它专门用来管理RAID设备;dm模块则更为强大,它的管理工具不再是一个单一的工具,而是一组工具,根据不同的规则进行管理(如物理卷的创建、删除、修改;卷组的大小调整、扫描、显示等;逻辑卷的创建、删除和修改等),为dm提供设备映射法则;它支持将多个物理设备以多种不同的方式组合起来,其中包含但不仅限于RAID的机制(镜像、条带等),而它最主要的功能是LVM——逻辑卷管理器(Logical Volume Manager),目前常用的LVM指的是lvm2

LVM是将多个底层的物理卷(块设备)在更高层次上组合成逻辑卷组,然后将逻辑卷组进一步划分成多个逻辑卷。它能够动态的扩展其边界。一个逻辑卷可能跨越多个物理卷,也可能不足一个物理卷。

wKiom1PuHQLBzdq7AADagVc-sJc477.png


二、逻辑卷功能之动态调整大小

如果现在一个数据库为500G,预计在一年之内会再增加500G,一种方法是换一块1TB的磁盘,将现有的数据复制过去,但复制的时候需要停止数据库的服务,这在通常情况下是不被允许的,因此就需要动态的扩展现有的磁盘空间,以保证当前的服务不被停止。

逻辑卷的作用就在于此,它可以动态的扩展其大小(这个边界称为物理边界),而其中的文件系统的大小(其边界被称为逻辑边界/文件系统边界)也可以随之扩展到整个空间;逻辑卷也支持动态缩减,但缩减逻辑卷之前,要先缩减其中的文件系统的大小,不过这样的操作有风险,可能造成数据的丢失。

当逻辑卷扩展到卷组边界后,仍需要继续扩展,这时可以通过新增物理卷的方法来扩展卷组大小,然后将逻辑卷进一步扩大。逻辑卷底层所依赖的块设备可以是普通磁盘,也可以是RAID设备。

wKioL1PuHnagSr3rAAA41iM7Myw370.png

逻辑卷在创建之初需要为其指定物理盘区PEPhysical Extents)。比如某逻辑卷指定了PE8MB,那么以后逻辑卷的扩展都必须为8MB的整数倍,因此如果想创建一个50MB的逻辑卷,最后实际创建出来的逻辑卷大小可能是48MB或者56MB,但不会精确到50MB。物理盘区的大小通常为2n次方兆,如4MB8MB,32MB64MB等,扩展逻辑卷就是将更多的PE分配给逻辑卷。

卷组的空间一旦被分配给了某个逻辑卷,那么这块空间就变成了逻辑盘区LELogical Extents),缩减逻辑卷实际上就是将逻辑卷上没有使用的LE收回。

如果一个逻辑卷组原本由5个物理卷组成,现在想移走其中的一个(删除物理卷),那么在移动之前必须先检查该物理卷,看它上面是否存有数据,如果有,则应该将这些数据转移到另外的四个物理卷上(转移物理卷)。而删除了物理卷之后,逻辑卷组也会随之缩小,这个过程称之为缩减逻辑卷。

 

三、逻辑卷功能之快照

灵活的扩展其边界,是逻辑卷的优势之一,而它的另一个优势在于快照功能(snapshot,即保存某一时刻的状态),这个功能对数据备份极为有用。

试想,某个数据库需要进行备份,但在备份的同时,该数据库还在提供服务。如果开始备份的时间是上午10:00,备份时进行传输的数据流很小,因此需要10个小时才能完成备份,那么在备份的这10个小时里,数据库中的数据有可能已经被修改了,这样就会导致想要备份的数据和实际备份的数据不一致。快照的作用就体现在这里:在上午10:00的时候采用快照的功能,保存数据库的状态,备份只针对这一刻的状态进行;而后的10个小时,不论数据库做了哪些改动,新数据都不会备份。

逻辑卷提供的快照功能,也是将某一时刻的数据保存起来:用户访问逻辑卷上的数据,会有两条通道:①逻辑卷原卷;②逻辑卷的快照卷。

如果为当前逻辑卷创建了快照,那么当逻辑卷原卷中的文件发生了改变时,会将原有数据备份一份到快照卷上,这时用户如果要访问快照时刻的文件,而该文件后来被改动过,则用户会进入快照卷的通道,查看备份数据;如果该文件没有被改动过,则会进入原卷的通道,查看原始数据。

wKioL1PuHrzgQ6Y9AAELMkdVlTQ933.png

快照卷的大小不需要和原卷一致,因为它只保存被修改过的文件。如果一个原卷有10G,而快照卷只有100MB,而被改动过的数据大小达到了1G,这些数据的大小已经超过了快照卷的大小,这种情况会造成快照卷的崩溃,因此要保证快照卷的大小能容纳所有变化的数据。快照卷的大小如果和原卷一样大,则快照卷一定不会崩溃,但这样做会浪费硬盘资源,因此设定快照卷的大小需根据实际情况而定。事实上快照主要用于备份,一旦备份完成,快照卷就可以删除了。后续的文章中将会介绍如何使用逻辑卷的快照卷来进行数据库备份。

 

四、创建逻辑卷

逻辑卷的创建过程分为三步:

①创建PVPhysical Volume)→②组合成VGVolume Group)→③划分成LVLogical Volume

 

第一步:创建一个2GPV

 

在创建PV之前,需要先准备两个分区,并将分区的id号调整为8e

[root@localhost ~]# fdisk/dev/sdc

WARNING: DOS-compatible mode isdeprecated. It's strongly recommended to
         switch off the mode (command 'c') andchange display units to
         sectors (command 'u').
Command (m for help): n
Command action
  e   extended
  p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (787-1305, default787):
Using default value 787
Last cylinder, +cylinders or+size{K,M,G} (787-1305, default 1305): +1G
 
Command (m for help): t
Partition number (1-7): 3
Hex code (type L to list codes):8e
Changed system type of partition3 to 8e (Linux LVM)
 
Command (m for help): w
The partition table has beenaltered!
Calling ioctl() to re-readpartition table.
WARNING: Re-reading the partitiontable failed with error 16: Device or resource busy.
The kernel still uses the oldtable. The new table will be used at
the next reboot or after you runpartprobe(8) or kpartx(8)
Syncing disks.

 

[root@localhost ~]# partx -a/dev/sdc

BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2

[root@localhost ~]# partx -a/dev/sdc3 /dev/sdc

# 创建一个1G的分区/dev/sdc3,类型调整为8eLVMid号为8e),并将其信息同步到内核中


接下来再创建一个分区/dev/sdd3,并调整其id号为8e,过程和上面一样,不加赘述。

 

现在将刚刚调整过的两个分区创建成物理卷,创建物理卷使用的命令组是pv,以pv开头的命令有很多:

[root@localhost ~]# pv

pvchange    pvck     pv.sh

pvcreate                       # 创建物理卷

pvscan              #扫描物理卷

pvresize             # 调整物理卷大小

pvmove             # 移动物理卷    

pvdisplay           # 显示物理卷,没有参数,则显示所有的PV,有参数则显示具体的PV 

pvs                # 以更简洁的方式显示物理卷

pvremove            # 删除物理卷上所有和逻辑卷有关的元数据

       

使用pvcreate命令来创建物理卷,其格式为:

pvcreate/dev/Device_Name

 

/dev/sdc3/dev/sdd3创建成PV的方法如下:

 

[root@localhost ~]# pvcreate/dev/sd{c,d}3

   Physical volume"/dev/sdc3" successfully created
   Physical volume"/dev/sdd3" successfully created
# 两个PV已经创建成功了


[root@localhost ~]# pvs

   PV         VG  Fmt  Attr PSize PFree
  /dev/sdc3       lvm2 a-- 1.01g 1.01g
  /dev/sdd3       lvm2 a-- 1.01g 1.01g
# 简单查看当前系统上的PV


[root@localhost ~]# pvdisplay

# 查看当前系统上的PV详细信息
  --- Physical volume---
  PV Name               /dev/sda2
  VG Name               VolGroup
  PV Size               24.51 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              6274
  Free PE               0
  Allocated PE          6274
  PV UUID              4xIMsz-FjmJ-KS9S-r5b8-QFVq-6Vdp-nREmnf
  
 "/dev/sdc3" is a new physical volume of "1.01 GiB"
  --- NEW Physicalvolume ---
  PV Name               /dev/sdc3
  VG Name              
  PV Size               1.01 GiB
  Allocatable           NO
  PE Size               0  
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               o530uK-hBsV-huUH-M5ag-IaFT-4VPC-aWhxM8
  
 "/dev/sdd3" is a new physical volume of "1.01 GiB"
  --- NEW Physicalvolume ---
  PV Name               /dev/sdd3
  VG Name              
  PV Size               1.01 GiB
  Allocatable           NO
  PE Size               0   
# 由于还没有创建逻辑卷,所以PE的大小为0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID              zJ7eym-BQVb-7t4S-x3IM-Rmlh-eJia-bQqGsw

 

第二步:创建VG

 

创建完物理卷组后,可以开始创建逻辑卷组VG了。创建逻辑卷组的命令组是vg,以vg开头的命令有:

[root@localhost ~]# vg

vgcfgbackup   vgconvert      vgexport       vgmerge        vgrename      
vgcfgrestore  vgcreate       vgextend       vgmknodes      vgs           
vgchange      vgdb           vgimport       vgreduce       vgscan        
vgck          vgdisplay      vgimportclone  vgremove      vgsplit

 

使用vgcreate命令来创建逻辑卷组,其格式为:

VgcreateVG_NAME /dev/Device_Name

在创建VG时,可以使用-s选项来指定PE的大小,PE的可选范围从8KB16GB不等,如果不指定,默认的PE大小是4MB

通常情况下,安装操作系统使会默认安装一个VG,根文件系统就是安装在这个VG上的。


[root@localhost ~]# vgs

 VG       #PV #LV #SN Attr   VSize VFree

  VolGroup   1  2   0 wz--n- 24.51g    0
# 简单查看当前VG,可以看到已经存在一个VG了

 

现在新建一个VG,起名为testvg

 

[root@localhost ~]# vgcreatetestvg /dev/sd{c,d}3

  Volume group"testvg" successfully created
# 提示创建成功


[root@localhost ~]# vgs

  VG       #PV #LV #SN Attr   VSize VFree
  VolGroup   1  2   0 wz--n- 24.51g    0
  testvg     2  0   0 wz--n-  2.02g 2.02g
# 可以看到已经有两个VG了


[root@localhost ~]# vgdisplaytestvg

# 显示testvg这个VG的详细信息
  --- Volume group ---
  VG Name               testvg
  System ID            
  Format                lvm2
  Metadata Areas        2
  Metadata SequenceNo  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               2.02 GiB
  PE Size               4.00 MiB
  Total PE              516
  Alloc PE / Size       0 / 0  
  Free  PE / Size       516 / 2.02 GiB
  VG UUID               RdwIdn-Pnax-qhjT-eJHY-kKkQ-XIEp-fc7rpf

 

第三步:创建LV

 

创建逻辑卷LV使用的命令组是lv,以lv开头的命令有:


[root@localhost ~]# lv

lvchange   lvdisplay   lvmchange  lvmdump   lvmsar   lvrename   lvscan
lvconvert   lvextend   lvmconf    lvmetad   lvreduce  lvresize    
lvcreate     lvm         lvmdiskscan  lvmsadc    lvremove     lvs

使用lvcreate 来创建逻辑卷,可配合选项-L-n来使用,其中 -L用来指定逻辑卷的大小,-n用来指定逻辑卷的名称,其格式如下:

lvcreate    -L SIZE -n LV_NAME VG_NAME

Lvcreate还可以使用-l选项来指定PE的个数,这个个数根据需要而定,比如PE的大小为4MB,现在要创建4GLV,那么PE的个数就为1024个;除此以外,还可以使用百分比来设定,指的是整个VGPE个数的百分比。

由于卷组大小为2G,因此逻辑卷的大小不能超过2G,所以创建一个1G的逻辑卷:


[root@localhost ~]# lvcreate -L1G -n mylv testvg

  Logical volume"mylv" created
# 提示逻辑卷mylv已经创建成功了


[root@localhost ~]# lvs

 LV   VG   Attr    LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
 lv_root VolGroup-wi-ao---- 22.54g                             
 lv_swap VolGroup-wi-ao----  1.97g      
# 前两个LV是系统自带的                                     
  mylv    testvg  -wi-a-----  1.00g
# 这个是新创建的逻辑卷


 

使用lvdisplay命令来查看一下当前的LV信息:

[root@localhost ~]# lvdisplay

# 这里显示的是所有逻辑卷的信息
  --- Logical volume---
  LV Path                /dev/testvg/mylv
  LV Name                mylv
  VG Name                testvg
  LV UUID               sfw6EW-0syj-v5w0-KM5T-Kao1-JwJ5-WndWQA
  LV Write Access        read/write
  LV Creation host,time localhost.localdomain, 2014-08-14 21:11:52 -0400
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read aheadsectors     auto
  - currently setto     256
  Block device           253:2
  
  --- Logical volume---
  LV Path                /dev/VolGroup/lv_root
  LV Name                lv_root
  VG Name                VolGroup
  LV UUID               4qxnP4-h1Rf-CItA-ddhr-MQQC-cIDh-zJkfXV
  LV Write Access        read/write
  LV Creation host,time localhost.localdomain, 2014-07-09 21:18:50 -0400
  LV Status              available
  # open                 1
  LV Size                22.54 GiB
  Current LE             5770
  Segments               1
  Allocation             inherit
  Read aheadsectors     auto
  - currently setto     256
  Block device           253:0
  
  --- Logical volume---
  LV Path                /dev/VolGroup/lv_swap
  LV Name                lv_swap
  VG Name                VolGroup
  LV UUID               Vsrdyz-Sf3q-7JQl-fxZI-vu4H-pCJO-LIwcRi
  LV Write Access        read/write
  LV Creation host,time localhost.localdomain, 2014-07-09 21:19:16 -0400
  LV Status              available
  # open                 1
  LV Size                1.97 GiB
  Current LE             504
  Segments               1
  Allocation             inherit
  Read aheadsectors     auto
  - currently setto     256
  Block device           253:1

 

如果只想查看刚才创建的LV,先使用lvdisplay /dev/DEVICE_NAME试一下:

[root@localhost ~]# lvdisplaymylv

  Volume group"mylv" not found
  Skipping volumegroup mylv
# 发现无法查看,和卷组只需要名称来引用不同,逻辑卷需要靠设备文件来引用

 

逻辑卷的设备文件在/dev/VG_NAME/LV_NAME,;

[root@localhost ~]# ls -l/dev/testvg/mylv

lrwxrwxrwx. 1 root root 7 Aug 14 21:11 /dev/testvg/mylv-> ../dm-2
# 此时会发现这是个链接文件,指向的是父目录/dev下的dm-2


[root@localhost ~]# lvdisplay/dev/testvg/mylv

  --- Logical volume ---
  LV Path                /dev/testvg/mylv
  LV Name                mylv
  VG Name                testvg
  LV UUID               sfw6EW-0syj-v5w0-KM5T-Kao1-JwJ5-WndWQA
  LV Write Access        read/write
  LV Creation host,time localhost.localdomain, 2014-08-14 21:11:52 -0400
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read aheadsectors     auto
  - currently setto     256
  Block device           253:2

 

事实上,在/dev下还有一个目录,叫做mapper,也包含了这个链接文件

[root@localhost ~]# ls -l/dev/mapper

total 0
crw-rw----. 1 root root 10, 58 Aug 14 20:11 control
lrwxrwxrwx. 1 root root     7 Aug 14 21:11 testvg-mylv -> ../dm-2
lrwxrwxrwx. 1 root root     7 Aug 14 20:12 VolGroup-lv_root -> ../dm-0
lrwxrwxrwx. 1 root root     7 Aug 14 20:11 VolGroup-lv_swap -> ../dm-1

 

因此还可以通过/dev/mapper/VG_NAME-LV_NAME来查看:

[root@localhost ~]# lvdisplay/dev/mapper/testvg-mylv

 

--- Logical volume---
  LV Path                /dev/testvg/mylv
  LV Name                mylv
  VG Name                testvg
  LV UUID               sfw6EW-0syj-v5w0-KM5T-Kao1-JwJ5-WndWQA
  LV Write Access        read/write
  LV Creation host,time localhost.localdomain, 2014-08-14 21:11:52 -0400
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read aheadsectors     auto
  - currently setto     256
  Block device           253:2

 

至此,整个逻辑卷的创建过程就完成了

 

下面再来使用pvdisplay命令查看一下物理卷的情况:

[root@localhost ~]# pvdisplay

 

--- Physical volume---
  PV Name               /dev/sdc3
  VG Name               testvg
  PV Size               1.01 GiB / not usable 3.44 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              258
  Free PE               2
  Allocated PE          256
  PV UUID              o530uK-hBsV-huUH-M5ag-IaFT-4VPC-aWhxM8
  
  --- Physical volume---
  PV Name               /dev/sdd3
  VG Name               testvg
  PV Size               1.01 GiB / not usable 3.44 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              258
  Free PE               258
# 对比创建逻辑卷之前的物理卷信息,现在PE相关的信息都显示出来了
  Allocated PE          0
  PV UUID               zJ7eym-BQVb-7t4S-x3IM-Rmlh-eJia-bQqGsw
  
  --- Physical volume---
  PV Name               /dev/sda2
  VG Name               VolGroup
  PV Size               24.51 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              6274
  Free PE               0
  Allocated PE          6274
  PV UUID              4xIMsz-FjmJ-KS9S-r5b8-QFVq-6Vdp-nREmnf

 

第四步格式化逻辑卷

格式化逻辑卷使用的命令还是mke2fs

[root@localhost ~]# mke2fs -text4 /dev/testvg/mylv

mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304,163840, 229376
 
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information:done
 
This filesystem will be automatically checked every 35mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

 

格式化成功后,这个逻辑卷就可以挂载使用了:

[root@localhost ~]# mount/dev/testvg/mylv /mnt

[root@localhost ~]# cd /mnt

[root@localhost mnt]# ls

lost+found

[root@localhost mnt]# cp/etc/fstab ./

[root@localhost mnt]# cat fstab

 
#
# /etc/fstab
# Created by anaconda on Wed Jul  9 21:21:40 2014
#
# Accessible filesystems, by reference, are maintained under'/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/orblkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /              ext4    defaults        1 1
UUID=d9512fb3-8dd6-4613-ae55-8e99ba0ef627 /boot  ext4  defaults     1 2
/dev/mapper/VolGroup-lv_swap swap          swap    defaults        0 0
tmpfs                  /dev/shm              tmpfs   defaults      0 0
devpts                 /dev/pts          devpts  gid=5,mode=620   0 0
sysfs                  /sys              sysfs   defaults         0 0
proc                   /proc             proc    defaults         0 0
/dev/sdb3              /mydata           ext4    defaults,noatime 0 0
LABEL="NEWSWAP"         swap             swap    defaults         0 0