封面来源:https://i-blog.csdnimg.cn/blog_migrate/de332fd24eeab330cfbc616dc8c2ab98.png

一般而言,我们在日常生活中接触到的绝大多数带有桌面且对用户友好的 Linux 发行版几乎都是使用简单线性分区,即默认将系统安装在一整块硬盘上,按照“EFI - 根目录 - 交换分区”的顺序排布。这种方式非常的方便简单,便于用户维护,但缺点也很明显。根目录一般是一整个分区(或者根目录和用户主目录分开的两个分区),导致一旦分区容量耗尽,扩容就变得非常难,必须先删除分区,再重新分区,更糟的是,某些情况下我们无法再扩大分区的大小。那么,有什么办法可以解决这一问题呢?这就是我们今天要讲的 LVM.

什么是 LVM

LVM 的全称是 Logical Volume Manager(逻辑卷管理),它是 Linux 内核提供的一种卷管理功能,允许我们对任意一个逻辑卷(包括根目录所在的分区)进行扩容或缩减。

LVM 由以下 4 个部分组成(来自 Arch Wiki):

  • 物理卷 (Physical Volume, PV)
    Unix 块设备节点,可供 LVM 用于存储。示例:硬盘、MBR 或 GPT 分区、环回文件、设备映射器设备(例如 dm-crypt)。它托管 LVM 标头。

  • 卷组 (Volume Group, VG)
    PV 的组,充当 LV 的容器。PE 从 VG 中分配给 LV.

  • 逻辑卷 (Logical Volume, LV)
    “虚拟/逻辑分区”,驻留在 VG 中,由 PE 组成。LV 是类似于物理分区的 Unix 块设备,例如,它们可以直接格式化为文件系统。

  • 物理盘区 (Physical Extent, PE)
    PV 中可以分配给 LV 的最小连续盘区(默认 4 MiB)。将 PE 视为 PV 的一部分,可以分配给任何 LV.

多说无益,我们直接来看实战。

创建 LVM

提示:为保证最佳使用体验,你至少需要 2 块磁盘来组建 LVM.

这里,我们以下面的硬盘 /dev/sdb 为例创建 LVM.(也可以在某个分区上创建!)

我们先在 /dev/sdb 上创建一个 PV

sudo pvcreate /dev/sdb

用以下命令查看 PV 信息:

pvscan
pvs
pvdisplay

例如:

接下来,我们在 /dev/sdb 上面创建 VG:

vgcreate vg1 /dev/sdb

查看 VG 信息的命令和 PV 的几乎一样(就是把 pv 换成 vg),这里就不再赘述了。

然后,我们将 /dev/sdb 组成为一个 LV. 必须使用的命令是 lvcreate,用法如下:

lvcreate -L {LogicalVolumeSize} -n {LogicalVolumeName} {VolumeGroupName}
# Or: lvcreate --name {LogicalVolumeName} --size {VolumeSize} {VolumeGroupName}
# From Red Hat Document: https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/creating-logical-volumes_basic-logical-volume-management

例如:

检查一下是否成功创建:

最后,我们来创建文件系统并挂载这个逻辑卷。

对于文件系统的选择,一般最优解是使用传统的 ext4 或者 XFS. btrfs 和 ZFS 很少使用的原因是,对于 btrfs,尽管 ext4 的开发者 Theodore Tso 认为它在很多方面都要优于 ext4, 但多数情况下 btrfs 在单一卷上的表现最好,并且其侧重点(写时复制,快照恢复功能)与 LVM 大相径庭,而 ZFS 原生即支持 LVM 的功能,或者说它就是为了替代 LVM 而存在的。

格式化和挂载时,分区格式是“/dev/卷组名/逻辑卷名”,不是设备名!

这里以使用最为广泛的 ext4 文件系统为例:

mkfs.ext4 /dev/vg1/mylv

(加这么多 sudo 只是为了告诉你们,这些命令原则上只有 root 才能有权限运行

这样就大功告成了!

LVM 在线扩容

当某个逻辑卷的可用空间已经耗尽时,我们如果要继续使用,必须对它进行扩容。

为了更好地模拟实际情况,我们先将其用 0 填到几乎已满:

这边涉及到的 dd 命令是 Linux 中一个非常有用的命令,后面会单独开一篇文章讲解。

先查看 vg1 上未使用的 LVM 空间:

接下来,我们为 mylv 进行扩容:

lvextend -L +4G /dev/vg1/mylv

请注意:如果 -L 后面接的是具体容量(不带+号),就会将当前可用的逻辑卷容量调整至你指定的容量,而不是新增!

此时你可能会发现,扩容后逻辑卷的容量似乎并没有新增。这是因为虽然底层扩容了,但是操作系统还认为新增的分区属于“未分配”状态。因此我们必须手动刷新使得系统能够知道我们已经扩容了:

resize2fs /dev/vg1/mylv

这样一来,我们就成功地进行了逻辑卷的扩容。

上面的 resize2fs 是 Linux 系统中用于调整 ext2/ext3/ext4 文件系统大小的实用工具。它可以在不丢失数据的情况下扩大或缩小文件系统,通常与 LVM (逻辑卷管理) 或磁盘分区工具配合使用。(来源:https://www.runoob.com/linux/linux-comm-resize2fs.html

VG 扩容

上面的情况只是适用于逻辑卷扩容。要是卷组也没有空间了呢?

此时就需要对卷组进行扩容。

还记得之前一同列出的 /dev/sdc 吗?现在就用到了!

具体来说,扩容卷组一共有 2 个步骤:

  • 新增 PV(是物理卷,不是物理卷子,也不是角色预告!)

  • 扩展 VG(卷组)

第一步,新增物理卷:

pvcreate /dev/sdc

第二步,扩展已有卷组。需要用到的是 vgextend {VolumeGroupName} {DeviceOrPartitionName} 命令:

vgextend vg1 /dev/sdc

图片-xNAL.png

检查 vg1 卷组,发现已经成功扩容:

图片-iVlv.png

LVM 设置交换分区

在 LVM 上设置交换分区的步骤和之前讲的在非 LVM 卷上的几乎雷同,但不同的是,你首先需要创建一个逻辑卷,而不是分区。

这些其实前面都能找到答案。

删除 LVM

首先我们需要卸载已经挂载的 LVM. 就拿之前我们用的 /dev/sdb 举例:

下面,我们依次删除所有的逻辑卷、卷组和物理卷(顺序不能错!):

lvremove /dev/vg1/mylv
vgremove vg1
pvremove /dev/sdb

再检查一下是否删除干净:

这样就可以了。

总结

这三节我们先回顾了什么是硬盘,如何创建分区表并格式化分区,然后是临时挂载和永久挂载的几种方式,以及交换空间。最后我们详细讲了 LVM 逻辑卷管理和它的整个生命周期,这是整个 Linux 磁盘管理里面最难的部分。这些内容是管理服务器的重要基础,尤其是使用 RHEL/CentOS/AlmaLinux/Rocky Linux 时,是必须要掌握的,很多时候并不会提供一个桌面环境(因为都是 SSH 连接到命令行),因此学会在命令行内管理磁盘是非常重要的。

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维