1)什么是LVM

   LVM=(Logical Volume Mamager)逻辑卷管理器,它的最大作用是可以动态分配磁盘分区,并且 可以让多个分区或者物理硬盘作为一个逻辑卷(相当于一个逻辑硬盘)。这种机制可以让磁盘分区容量划分变得很灵活。

    我们先举个简单例子,比如我们有一个硬盘/dev/sda。分了3个主分区:sda1,sda2,sda3,后面磁盘空间没有划分,分别对应的挂载点是/boot,/,/home,如果我们的/home空间不够了,怎么办?传统的方法是在未划分的空间中分割一个分区,挂载到/home下,并且把sda3的内容复制到这个新分区上.或者把这个新分区挂载到另外的挂载点上,然后在/home下创建链接,链接到这个新挂载点。

   这两种方法都不大好,第一种方法浪费了sda3,并且如果后面的分区容量小于sda3怎么办?第二种方法不大浪费容量,但是每次要额外创建链接,比较麻烦.那么,如果用lvm呢?lvm的好处在于,可以动态放大一个逻辑卷(相当于一个逻辑分区),也就是说,sda3如果是一个逻辑分区,比如/dev/rootvg/lv3,那么lv3可以被动态放大.这样就解决了动态容量调整的问题。


2)lvm组成和概念

  PV(Physical Volume) 物理卷。可以是单独磁盘,也可以是硬盘分区

  VG(Volume Group) 卷组。是PV的组合,可以看成单独的逻辑磁盘

  LV(Logical Volume) 逻辑分区。相当于物理分区的/dev/hdaX

  PE(Physical Extent) 物理范围。VG单元,类似于RAID的条带大小。 

  当多个PV组成一个VG时,LVM会在所有PV上做类似格式化的动作,

将每个PV切成一块块的空间,这一块块的空间就称为PE, 通常是4MB。

 LE(Logical Extent) 逻辑范围。LV的组成单位。大小为PE的倍数(通常为1:1)


 那么,最常用的3个名词和意义列表如下:

 名词 意义 操作系统对应设备

 PV 物理卷/dev/hdaX

 VG 卷组 /dev/(通常是个目录)

 LV 逻辑卷/dev//

如果我们要使用lvm,顺序是pv->vg->lv。

图示:lvm结构

   wKiom1NOwF_habVVAAEUYy2J-84088.jpg

就是说,我们先创建一个物理卷(对应一个物理硬盘分区或者一个物理硬盘),然后把这些分区/硬盘加入一个卷组中(相当于一个逻辑上的大硬盘),然后我们在这个大硬盘上划分分区lv(逻辑上的分区,就是逻辑卷)这样,我们把lv逻辑卷格式化以后,就可以像使用一个传统分区那样,把它挂载到一个挂载点上,需要的时候,这个逻辑卷可以被动态缩放。

我们可以用一个长方蛋糕来说明这个对应关系。物理硬盘相当于一个长方蛋糕,我们把它切割成许多块每个小块相当于一个pv,然后我们把其中的某些pv重新放在一起,抹上奶油,那么这么些个pv的组合就是一个新的蛋糕,也就是vg。最后,我们切割这个新蛋糕vg,切出来的小蛋糕就叫做lv。

有一点需要注意,就是/boot区不可以是lvm,因为引导程序lilo/grub并不能识别lvm,就像/boot同样不可以是软raid设备一样。

3)如何使用lvm,创建逻辑卷的流程和实例

好了,我们来创建一个lv。

比如说,在一个物理硬盘/dev/sdb上,我们需要将/dev/sdb5,/dev/sdb6作为pv

1.fdisk划分sdb5,sdb6,并且将这两个分区的标志(键入t改)改为(0x)8e
然后用partprobe通知OS磁盘分区的变化

[root@vm02 ~]# partprobe 

2.用pvcreate命令创建pv sdb5,sdb6 (-s xxM可设定PE大小)

[root@vm02 ~]# pvcreate /dev/sdb5 /dev/sdb6

 [root@vm02 ~]# pvscan   //pvscan可查看系统的PV

PS:与PV有关的几个命令:

pvcreate:将物理分区新建成为PV;

pvscan:查询目前系统里面任何具有PV的磁盘;

pcdisplay:显示出目前系统上面的PV状态;

pvremove:将PV属性删除,让该分区不具有PV属性。

3 .将sdb5,sdb6加入逻辑卷组rootvg中

[root@vm02 ~]# vgcreaterootvg /dev/sdb5 /dev/sdb6

[root@vm02 ~]# vgscan //查看系统的vg

PS:与vg有关的几个命令

vgcreate :新建vg;

vgscan:查找系统上面是否有VG存在;

vgdisplay:显示目前系统上面的VGzhaungt;

vgextend:在VG内额为添加PV;

vgreduce:在VG内删除PV;

vgchange:设置VG是否启动;

vgremove:删除一个VG。

4.从我们的rootvg中,创建一个100M的逻辑卷lv1

[root@vm02 ~]# lvcreate -L 100M -n lv1 rootvg

5.格式化我们的lv1,文件系统用ext3

命令:

  mkfs.ext3/dev/rootvg/lv1

PS:LV相关命令

lvcreate:新建lv;

lvscan:查看系统上面的lv;

lvdisplay:显示系统上面的LV状态;

lvextend:在lv里面增加容量;

lvreduce:在LV里面减少容量;

lvremove:删除一个LV;

lvresize:对LV容量大小调整

6.将lv1挂载到/mnt/lvm下

命令:

[root@vm02 ~]# mkdir /mnt/lvm

[root@vm02~]# mount /dev/rootvg/lv1 /mnt/lvm

好了,这样一个创建lv的例子完成

4) 如何动态放大/缩小一个逻辑卷/逻辑卷组

我们如何放大lv?比如上面的lv1?流程:
1.将lv1增加200M

命令:

[root@vm02 ~]# lvextend-L+200M /dev/rootvg/lv1

使用display查看

看到出增加200M了

减小lv,如果我们需要减少50M:
1. 
这里,需要先卸载分区

命令:

[root@vm02 ~]# umount/mnt/lvm

2计算lv1的block数

命令:

[root@vm02 ~]# mke2fs -n/dev/rootvg/lv1

这里一定要加-n参数,这是计算lv1的block数,而不是格式化分区,注意。
并且注意,从MB->KB这些的计算,都是乘1024,不是1000,这是个细节问题

wKiom1NOwg3hq0vgAAH35pyDMGc271.jpg

计算减少50M后的block数。从mke2fs -n /dev/rootvg/lv1,我们可以得出2个需要的信息:
Block size和blocks,这两个数的乘积就是分区大小A(单位字节),

我们把需要减小的容量50M换算成字节B,然后A-B的结果除以Block size,就是剩余的block数

4 resize2fs -f /dev/rootvg/lv1 剩余的block数
调整文件系统大小

5.调整lv分区大小,减小50M

命令:

[root@vm02 ~]# lvreduce -L-50M /dev/rootvg/lv1
重新mount,df察看一下容量的减小

[root@vm02 ~]# mount /dev/mapper/rootvg-lv1/mnt/lvm/

 [root@vm02~]# df -m

减小了

7 .动态加大VG:
这里我们新增一个PV并加入VG

(1) fdisk增加一个(0x)8e标志的分区/dev/sdb7


(2)vgextend rootvg /dev/sdb7

[root@vm02~]# vgextend rootvg /dev/sdb7
好了,vg增大了(可以用vgdisplay查看)


5) 如何删除逻辑卷/逻辑卷组
删除VG流程:
1 .umount /挂接点
2 .lvremove /dev/rootvg/lv1
移除逻辑卷,这里是lv1
3 .vgchange -a n rootvg(关闭rootvg)
4 . 移除rootv

vgremoverootvg