逻辑卷管理器(LVM)

一、什么是LVM?

LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。
LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上次服务的是以逻辑卷的方式。

二、LVM的优缺点

1.优点

①.可以在系统运行的状态下动态的扩展文件系统的大小。
在Linux操作系统中我们的磁盘管理机制和Windows上的都差不多,绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分区,然后再将该分区进行文件系统的格式化,在Linux系统中如果要使用该分区就将其挂载上去即可,windows的话其实底层也就是自动将所有的分区挂载好,然后我们就可以对该分区进行使用了。
可这样做的话会带来很多问题,比如我们使用的一个分区所剩空间大小已经不够使用了,这个时候我们没法对分区进行扩充,我们只能通过增加硬盘,然后在新的硬盘上创建分区,对分区进行格式化,然后将之前分区的所有东西都拷贝到新的分区里面才行。但是新增加的硬盘是作为独立的文件系统存在的,原有的文件系统并没有得到任何的扩充,上层应用只能访问到一个文件系统。这样的方式对个人的电脑来说可能还能接受,但是如果对于生产环境下的服务器来说,这是不可接受的。因为如果要把一个分区的内容都拷贝到另一个分区上去,势必要首先卸载掉之前的那个分区,然后再对整个分区进行拷贝,如果服务器上运行着一个重要的服务,要求是 7*24 小时运行正常的,那么卸载掉分区这是不可想象的,同时如果该分区保存的内容非常非常的多,那么在对分区进行转移时时间可能会耗费很久,所以,这个时候我们就会受到传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。因此,为了解决这个问题,LVM技术就诞生了!这也是LVM最大的优点。

②.文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制。
③.可以增加新的磁盘到LVM的存储池中。
④.可以以镜像的方式冗余重要的数据到多个物理磁盘。
⑤.可以方便的导出整个卷组到另外一台机器。
2.缺点

①.在从卷组中移除一个磁盘的时候必须使用reducevg命令(这个命令要求root权限,并且不允许在快照卷组中使用)。
②.当卷组中的一个磁盘损坏时,整个卷组都会受到影响。
③.因为加入了额外的操作,存贮性能受到影响。

三、LVM的用法

1.名词解释
PV(Physical Volume):物理卷,处于LVM最底层,可以是物理硬盘或者分区。
PP(Physical Extend):物理区域,PV中可以用于分配的最小存储单元,可以在创建PV的时候制定(默认为4MB),如1M, 2M, 4M, 8M, 32M, 64M…组成同一VG中所有PV的PE大小应该相同。
VG(Volume Group):卷组,建立在PV之上,可以含有一个到多个PV。
LV(Logical Volume):逻辑卷,建立在VG之上,相当于原来分区的概念。不过大小可以动态改变。
2.LVM的创建
①.首先我们要创建两个分区为接下来的LVM做准备,在这里我添加了一块空硬盘sdb,在上面创建了两个分区sdb1和sdb2各500M。
②.用pvcreate命令在新建的分区上创建PV
在这里是因为这两个分区之前被格式化为ext4系统了,所以这里要把它变为逻辑卷需要输入Y确认更改
创建完后我们可以用pvs查看或者pvdisplay查看详细信息
因为在这之前我做过一次LVM所以我这里有好几个PV卷组,而像上图中用pvs命令查看时我们发现我们新创的PV卷组和以前创建的有点不同,它们的Attr部分不一样,这是因为我们新创建的PV卷组还没有激活,a—表示已激活的pv卷组。VG那一栏是所属的VG组,因为我们还没有划分VG组,所以这一栏也是空。
③.使用vgcreate命令创建一个VG组,并将我们创建的两个PV加入VG组

同样我们也是用vgsvgdisplay命令查看卷组信息及详细信息

vgdisplay后跟卷组名可以只查看这个卷组的详细信息,不跟卷组名是查看所有卷组的详细信息。
这里我们看到我们创好的vg卷组PE大小为4MiB,这是PE的默认大小,PE是卷组的最小储存单位,我们也可以用-s参数来修改,不过这只能才创建卷组时使用,一旦卷组创建成功是没法再去修改PE大小的。
④.使用lvcreate命令从VG中创建一个逻辑卷

这里我们使用-L参数后跟的是你要设定的逻辑卷大小,这个大小必须是是你设定的PE值的整数倍,如果不是它会给你分一个比你设定的大一点的空间也就是向上去整数倍空间。也可以使用-l但后面跟的就是PE数量像上个步骤中我们划分的卷组PE值为4MiB,数量为254,我们也可以使用-l跟数量,那划分的逻辑卷大小就为4x你划分的数量MiB。
一般用大L 指定大小,弊端就是有可能用不完vg里面的空间
用小 l,-l 127, 127 个PE ,弊端是需要计算,比如一个PE 4M 127x4M=508M 但是不会出现用不完vg的空间的情况
-n参数后跟逻辑卷名字,是对创建的卷组命名,最后跟的是卷组名。
逻辑卷的查看命令也是lvslvsdisplay

这里lvdisplay后跟卷组是查看这个卷组的详细信息,只输入lvdisplay是显示所有逻辑卷的详细信息
⑤.我们使用mkfs命令对创建的卷组进行格式化

⑥.Linux下的文件系统需要被挂载后才能使用,我们创建一个空目录,再把创建好的逻辑卷挂载上就可以使用了。

要想实现开机自动挂载可以写在fstab表里
3.LVM的扩容与缩小
①.逻辑卷的扩容
LVM的强大之处不只是它可以扩容压缩,更重要的是它可以支持在线扩容,但我们首先要保证VG中有足够的空闲空间。
我们使用lvextend命令来对逻辑卷进行扩容

我们先使用vgs查看VG所剩空间是否充足,接着再对lv1进行扩容。-L参数和创建卷组的-L参数一个性质,后面都是直接跟大小,不过这里要注意+100M是增加100M空间,如果不跟+是扩容到指定的大小,同理如果使用-l参数后,后面跟的就是要增加多少PE值。最后跟的是想要扩容的逻辑卷。
扩容后我们查看一下逻辑卷的大小,确实变成了300M

但这个时候我们用df-h命令查看一下发现挂载的文件系统并没有增大,这就需要我们使用resize2fs命令手动同步一下文件系统,其实我们有更简单的操作,就是在扩容的同时加上-r参数他会自动扩展文件系统大小,像这样

②.卷组的扩容
如果我们发现卷组所剩空间已将不能满足需求了,这时候我们就需要使用vgextend命令对卷组进行扩容
我们先添加一块硬盘sdc

在虚拟机中这个时候我们通常需要重启,这里我们可以使用echo “- – -” > /sys/class/scsi_host/host0/scan命令让系统重新扫描SCSI总线来添加设备,因为添加的是SCSI磁盘,所以扫描的是SCSI总线

首先将要添加的硬盘格式化为PV

再将新的PV添加到指定的卷组中去

我们可以看到vg卷组大小已经改变了。
②.逻辑卷的缩减
逻辑卷扩容可以在线操作但是缩减必须是离线执行,需要先卸载已挂载的逻辑卷。
[root@localhost ~]# umount /disk1/
扩容逻辑卷我们是先扩大逻辑卷再扩大文件系统,而缩小逻辑卷就需要我们反着来,我们要先缩小文件系统,再去缩小逻辑卷

缩小文件系统前我们要先对文件系统做个扫描检测,如果我们直接使用resize2fs系统会提示让你先对文件系统进行检测,这是为了保护缩减文件系统时不对数据损害。
接着我们再来缩减逻辑卷

注意:文件系统大小和逻辑卷大小一定要保持一致才行。如果逻辑卷大于文件系统,由于部分区域未格式化成文件系统会造成空间的浪费。
我们可以看到逻辑卷已经缩小了,接着我们再来挂载看看文件系统大小

我们可以看到文件系统也变小了
缩小卷组
我们可以用vgreduce去缩小VG卷组的大小

缩小VG卷组也就是把一个PV从卷组中移除,但我们要先肯定PV中没有数据,不然就会造成数据的丢失

接着我们可以使用pvremove命令移除PV,这样就让分区又重新变成了普通分区。

四、总结

下面我们就对整个LVM的工作原理进行个总结:
1.物理磁盘被格式化为PV,空间被划分为一个个的PE
2.不同的PV加入到同一个VG中,不同PV的PE全部进入到了VG的PE池内
3.LV基于PE创建,大小为PE的整数倍,组成LV的PE可能来自不同的物理磁盘
4.LV现在就直接可以格式化后挂载使用了
5.LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,如果操作正确其过程不会丢失原始数据
PS:我们实际生产操作中很少用到逻辑卷的缩减,因为缩减很容易就会造成数据损坏,这是得不偿失的,所以我们不推荐对逻辑卷进行缩减。