Linux 磁盘管理之 LVM

传统的磁盘管理

传统的磁盘管理过程:首先对一个磁盘进行分区,然后将该分区进行文件系统格式化,接着将文件系统挂载即可使用。但是传统的磁盘管理灵活性较差。假设一个场景:初始我们对磁盘进行分区,随着用户的使用,分区空间不够使用。传统的做法是,再加一块硬盘,重新分区,格式化,挂载。然后将原分区的数据复制过来,接着将原分区卸载再重新挂载。如果数据很大,数据转移的时间将会很久,这对于需要7*24运行的服务器来说是不可接受的,为了能够对磁盘空间进行动态管理,催生出 LVM 技术。

LVM 的磁盘管理

LVM(Logical volume Manager)是逻辑卷管理的缩写。它可以动态调整磁盘空间的容量。通过将底层的磁盘抽象封装起来,屏蔽了底层硬盘的细节,然后以 LV(Logical Volume)逻辑卷的方式呈给上层。在传统的磁盘管理机制中,上层直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对分区进行操作,上层所有的操作都是针对 LV,因此上层感觉不到底层的变化。比如说增加一个物理硬盘,这个时候上层是感觉不到的,因为呈现给上层的是 LV 的方式。

LVM 原理

首先给出 LVM 的逻辑图

LVM逻辑图

  • PE:physical Extend,物理扩展。LVM 最小存储单元,默认容量为 4M ,类似文件系统中的 data block。LVM 的动态调整磁盘容量,本质上就是调整 PE 的个数。
  • PV:Physical Volume,物理卷。可以将 PV 看作 LVM 下的磁盘格式。将磁盘格式化 PV 的过程就是把磁盘划分为一个个 PE 块的过程。
  • VG:Volume Group,卷组。卷组可以看作一个 PE 池,里面有多个 PV 或者 PE。LVM 动态调整磁盘空间就是增减 LV 中 PE 个数。增加的 PE 由 VG 提供,减去的 PE 则放回到 VG 中。
  • LV:Logical Volume,逻辑卷。PE,PV,VG都是底层的东西,我们不能直接使用,我们最终使用的是 LV。

创建过程

  1. 将硬盘格式化为 PV

由图中我们可以看到两块硬盘:hda5,hda6(暂时忽略hda7)。首先利用 pvcreat 命令将两块硬盘格式化为 PV。此时 PV由多个 PE组成 。注意,这时的 PV 中 PE size为 0,可由 pvdisplay 查看。

  1. 创建VG

使用 vgcreat 创建 VG,此时可以指定 PE 的大小和 VG 的名称。PE 默认为 4M。在这里,我们将 VG 抽象为一个 PE 池。我们可以把一个或者多个 PV 加到 VG 当中,因为在第一步操作时就已经将该硬盘划分成了多个PE,所以将多个PV加到VG里面后,VG里面就存放了许许多多来自不同PV中的PE,我们通过上面的图片就可以看到,我们格式化了两块硬盘,每个硬盘分别格式化成了3个PE,然后将两块硬盘的PE都加到了我们的VG当中,那么我们的VG当中就包含了6个PE,这6个PE就是两个硬盘的PE之和。通常创建一个卷组的时候我们会为其取一个名字,也就是该VG的名字。

  1. 基于VG创建LV

使用lvcreat 命令创建 LV。这个时候我们创建LV其实就是从VG中拿出我们指定数量的PE。VG中的PE可以来自不同的PV,我们可以创建的LV的大小取决于VG当中PE存在的数量,并且我们创建的LV大小一定是PE的整数倍。

  1. 将创建好的LV进行文件系统格式化

此时的LV和传统磁盘管理中的分区类似。后面就是文件系统格式化,挂载即可使用。创建好LV以后,会在 /dev 目录下看到LV信息,例如 /dev/vgname/lvname, 每创建一个VG,会在/dev目录下创建一个以该VG名字命名的文件夹,在该VG的基础上创建好LV以后,则在这个VG目录下多出一个以LV名字命名的逻辑卷。

LV的扩充

假如LV的空间不够使用,需要扩充,此时VG中的PE也已使用完毕,这时应该怎么做呢?首先插入一个硬盘hda7,如上图。然后将硬盘格式化为PV,接着将使用vgextend 将PV加入VG中,最后在LV利用lvextend命令中扩充容量。如果VG中的PE还有剩余,可以直接使用lvextend 扩充。

LV的收缩

与LV可以在线扩充不同,LV的缩小操作必须离线执行,要先卸载掉LV才可以。

  1. umount 卸载LV
  2. resize2fs 缩小文件系统
  3. lvreduce 缩小LV

参考资料

赞赏是对作者最大的支持!
0%