在正式介绍LVM技术前,先来说说磁盘分区。对于磁盘分区,相信都不陌生。像Windows系统,会把磁盘分为C盘、D盘等。对于Linux系统,会把磁盘sda分成sda1、sda2等等。下图是一个CentOS系统,可以看到磁盘总大小为21.5GB, 被划分为/dev/sda1、/dev/sda2和/dev/sda3一个3个分区,还剩余7个多G空间。

LVM是 Logical Volume Manager英文缩写,翻译成中文是 逻辑卷管理器。它是linux系统中磁盘管理工具,其思想是将物理磁盘和分区进行虚拟化,创建虚拟的磁盘空间,从虚拟的磁盘空间中按需分配,使用起来更灵活,更易于管理。
如下图,LVM通过3层抽象来管理存储空间,分别是物理卷PV(physical volume)、卷组VG(volume group)、逻辑卷LV(logical volume)。

PV指物理卷,初始的物理存储设备,例如机械硬盘(HDD)、固态硬盘(SSD),需要创建物理卷,才能添加到LVM中的卷组中。通俗理解,物理磁盘就像是砖头水泥等原始建筑材料,创建物理卷相当于对这些原始材料进行标准化处理,把它们做成统一的乐高积木,变成可以随意拼接的标准化模块。
VG即卷组,它处于LVM中的核心位置,将多个物理卷组合成一个统一的存储结构,总容量大小为各个物理卷对应物理设备容量之和。卷组把多个物理磁盘虚拟成一个虚拟盘,可以灵活对该虚拟盘进行划分,分成多个逻辑卷。
例如,我们的设备有2块1TB的硬盘,想创建一个2TB的分区,采用标准的磁盘划分方法是无法实现的。采用LVM技术,把2块1TB的磁盘做成PV,然后将它们加入到一个VG,该VG的容量即为2TB。采用LVM,我们可以不受到单盘大小限制,可以轻松创建一个大的虚拟空间。
LV指逻辑卷,即对上面的VG进行划分,分配出来的虚拟的、灵活的逻辑空间,供操作系统使用。
通过前面介绍,我们已了解LVM通过3层抽象(PV、VG和LV)来管理存储空间,为啥要采用3层呢?其中的关键是卷组层VG,将资源池化,对LV层屏蔽了底层物理设备的类型、数量等细节,实现了底层解耦。LV直接基于VG构建的虚拟的空间划分,非常灵活。而PV将物理磁盘进行标准化,从而构建VG。通俗来说,3层抽象构成了一个单向的依赖,每层只为上层服务,每层都是上层的基石,都有着不可替代作用。
LVM相比传统标准磁盘划分,具有特有的优点,这是我们要使用LVM的原因。主要有以下两个优点:
下面我们基于物理磁盘,看看如何创建逻辑卷。基本步骤如下:
现有的设备磁盘划分情况如下,只有一块磁盘/dev/sda,大小为21.5G。目前已划分sda1、sda2和sda3一共三个分区,它们总大小是13G,还剩余大概7G空间。

现在将剩余的空间划分到/dev/sda4中。

通过lsblk命令可以看到,磁盘划分成功,现在多了sda4分区,大小为7G。

将分区sda4标记为LVM类型,默认是Linux类型,Id是83,如下图所示。

执行fdisk /dev/sda命令,然后输入t,选择分区4, 输入8e,把sda4类型设置为Linux LVM。

为啥要将类型设置为Linux LVM,主要为了安全性。标记为LVM类型,告诉管理工具该分区不在是普通的分区,例如执行mkfs命令,会发出警告,而对于普通分区执行格式化操作,会毫不犹豫进行格式化。
对sda4创建物理卷,执行命令 pvcreate /dev/sda4,注意,如果提示 pvcreate命令找不到,先执行 yum install lvm2 进行安装(如果非centos系统,请找对应的命令)。

可以使用 pvdisplay 命令进一步验证pv是否创建成功,如下图。

执行 vgcreate 命令来创建卷组, 如下创建了一个名称为 vg-data 的卷组,并将物理卷/dev/sda4加入其中。

查看系统已创建的卷组信息

通过 lvcreate 命令创建逻辑卷,如下图所示。 -l 参数表示从卷组中分配多大的空间,本次我们将vg-data全部空间分配给逻辑卷 lv-data,所以-l参数值为 100%Free。

通过 lvdisplay命令检查系统中创建的逻辑卷信息

前面我们已经创建了一个逻辑卷lv-data,在使用前需要进行格式化。采用 mkfs.xfs命令格式lv-data,将其格式化为xfs文件系统,当然我们可以用 mkfs.ext4命令将其格式化为ext4文件系统。被格式化的逻辑卷完整名称是 /dev/{VG}/{LV},{VG}即卷组名,{LV}即逻辑卷名。

采用mount命令将已经格式化后的逻辑卷挂载到文件系统/data,如下图。

通过 df 命令检查挂载情况,如下图所示,这里参数 -T 显示文件系统信息,可以看到,的确是我们刚创建的xfs文件系统。

前面一节详细介绍了如何使用LVM,在实际使用的时候,我们会遇到一种高频的场景:为了存储更多的数据,需要对已有的LV进行扩容,本节从这个角度详细介绍。
假设我们设备现在新添加了一块磁盘,需要加入到已有的LV中。整个处理顺序大致如下:
新添加了一块磁盘sdb,如下图所示,大小为5G。

对磁盘sdb进行分区,这里将整块盘划分到一个分区sdb1中,并把系统类型设置为Linux LVM。

通过fdisk -l 命令可以看到,sdb现在已经分区成功,并且类型为Linux LVM。

对/dev/sdb1创建物理卷。

使用 vgextend 命令将上面的物理卷添加到 vg-data中。

执行 vgs 命令可以看到,vg-data现在有12G空间(之前有7G,这次添加了5G),其中VFree显示有5G的空闲空间就是本次扩展的。

在准备扩展逻辑卷前先来看下当前的逻辑卷情况,可以看到大小为7G。

现在执行 lvextend -l +100%FREE /dev/vg-data/lv-data, 对lv-data进行扩容,-l +100%FREE 表示将卷组中剩余的空间全部添加到lv-data中。如果不想将剩余全部空间添加,可以设置具体值,像 lvextend -l +5G /dev/vg-data/lv-data表示添加5G空间到lv-data。

注意,最后还要调整文件系统大小,使新增的存储空间可用,这一步很容遗漏。即使前面对lv-data进行了扩容,在调整前,如下图可使用的空间还是只有7G。

通过 xfs_growfs 命令调整文件系统大小。

调整后,再次查看可使用空间,现在显示有12G,相比之前增加了5G。

没有 umount /data 我们成功将/data空间扩大了5G,如果使用传统的方法是无法做到这一点的,这正是采用LVM技术带给我们很大的便利性。