我们在使用Linux的时候,有的时候会发现系统盘不够用的情况。如果系统盘或者其它盘能够做到弹性就好了。也就是需要更多空间的时候可以动态扩容,而不需要的时候可以缩容。
有一种方法就是通过SAN存储,因为存储系统天然具有扩容和缩容的功能特性。但是SAN存储需要一个独立的设备,而且价格也很高,不太现实。其实在Linux中我们可以通过软件实现,这就是Linux强大的地方。今天我们就介绍一下这方面的内容
LVM的整体架构
在Linux实现动态扩容和缩容特性的软件称为LVM,其全称是Logical Volume Manager,也就是逻辑卷管理。LVM不仅仅可以实现动态扩容和缩容,还可以实现其它一些特性,比如条带化卷,镜像卷等等。LVM的整体架构如图所示。
通过上图可以看到,LVM包含3个基本的概念,分别是Physical Volume(PV),Volume Group(VG)和Logical Volume (LV)。我们分别介绍一下这个三个概念。
物理卷(Physical Volume)
物理卷对应着一个块设备,可以是整个磁盘,或者是磁盘分区。物理卷通过pvcreate创建,本质上是想块设备写入一些元数据。
卷组(Volume Group)
卷组是多个物理卷的集合,当我们创建一个卷组的时候需要指定包含的物理卷。此时,实际上是构建了一个物理卷的资源池。当后面创建逻辑卷的时候会从该资源池分配资源。
逻辑卷(Logical Volume)
逻辑卷本身是一个块设备,是用户看到的部分,我们可以将逻辑卷理解为一个硬盘。但是逻辑卷实际上是由底层的若干个物理卷构成。但是一个逻辑卷并非使用物理卷的所有空间,通常是部分空间。
LVM的操作
前文我们对LVM的基本概念和架构进行了介绍,接下来我们就实际操作一下。具体如下图所示,每个概念对应着一个操作命令,分别是pvcreate,vgcreate和lvcreate。这些是创建的命令,从名称上也可以很容易地明白其作用。
我们从下往上看看如何创建需要的资源,比如我们要创建一个1G的逻辑卷。
创建PV
首先是要创建PV,也就是准备物理的资源。在本文中我们假设有两个物理磁盘,并且在整个磁盘上创建物理卷,而不是在分区上。
除了创建命令外,还有查询命令,具体包括pvdisplay和pvs,分别显示详细信息和概要信息。
创建VG
完成PV的创建后,我们就可以创建卷组了。卷组的创建命令如下所示。
vgcreate vg-01 /dev/sdb /dev/sdc
创建完成后可以看一下信息:
创建LV
最后,我们就可以创建逻辑卷了。假设我们这里创建一个线性的逻辑卷,大小为1GB,具体命令如下所示。
lvcreate -L 1G -n lv_linear vg-01
Logical volume "lv_linear" created
通过lvdispaly命令可以看一下详细信息。
除了线性卷之外,我们还可以创建条带卷。关于具体什么是线性卷,什么是条带卷,本文不做解释,我们后面在介绍LVM的原理的时候再详细介绍。
# lvcreate -L 1G -i2 -I64 -n lv_stripe vg-01
Logical volume "lv_stripe" created
创建完成后照例可以看一下详细的信息。
LV创建成功后,我们就可以当做硬盘来使用了,用法跟普通硬盘没有差别。
扩容操作
有了前面的知识,我们回归主题,如何进行扩容呢?其实就比较简单了。前文我们创建的VG的大小35G,而LV只用了1GB的空间。因此,我们可以直接对LV进行扩容,比如我们增加10GB的容量,可以执行如下命令。
lvextend -L+10G /dev/vg_01/lv_linear
是不是很简单!
如果上面已经有文件系统了,只需要执行如下命令即可。
resize2fs /dev/vg_01/lv_linear
还有一种情况是VG的容量使用完了。也没有关系,我们可以添加新的硬盘到VG,然后执行上面介绍的命令。
今天的内容就介绍到这里,相信大家对如何实现一个弹性容量的存储有了清晰的认识了。我们在后续会逐步深入,介绍LVM的实现原理,并结合内核代码介绍其代码实现。