LVM,解密
我担任系统管理员已经很长时间了,而作为系统管理员的一部分,就是要做超出人类能力范围的事情。有时这意味着编写非常酷的脚本,有时意味着工作到很晚,有时意味着学会说不。不幸的是,有时也意味着偷工减料。我承认,我不止一次成为“那个人”。SELinux 就是一个很好的例子。在不止几次(几百次!)的情况下,我只是禁用了 SELinux,因为让事情正常运行通常真的令人沮丧且耗时。LVM(逻辑卷管理器)也是如此。我不明白它。我认为它增加了一个不必要的复杂性层。我认为这意味着另一个潜在的故障点。我认为它很愚蠢。
我错了。
LVM 是一个非常灵活、非常有用且使用起来并不太复杂的系统。它让生活更轻松。它使未来的存储升级和迁移变得简单。简而言之,我喜欢它。因此,在本文中,我将介绍 LVM 的概念和用法。当我完成时,希望您也会像我一样喜欢它!
什么是 LVM我能想到的解释 LVM 的最佳类比是 SAN。如果您曾在服务器环境中使用过 SAN(存储区域网络),您就会知道它抽象了单个硬盘驱动器的概念,并允许您划分出“块”空间用作驱动器。SAN 不必担心您的硬盘驱动器有多大,它让您可以将所有硬盘驱动器放入一个大型机箱中,然后将空间分配给各个客户端,而无需关心正在使用多少物理驱动器。LVM 有点像那样,但用于单个系统而不是整个网络。
图 1 显示了我拙劣地尝试绘制 LVM 系统概念的图。乍一看,使用 LVM 似乎很傻。为什么要将一堆驱动器组合在一起,只是为了将它们划分成虚拟驱动器,对吧?幸运的是,这个简单的概念为未来的发展提供了令人难以置信的灵活性。需要一个很大的分区,但只有一堆较小的磁盘?没问题。现在只有几个磁盘,但以后想添加更多磁盘而无需重新格式化?没问题。需要像虚拟服务器一样进行快照,但您使用的是实际的裸机?没问题。LVM 使存储处理比分区驱动器或使用简单的 RAID 设置(顺便说一句,这引出了下一个问题)要好得多。

图 1. 将我的图纸视为艺术品很重要——可能是二年级水平的艺术品。
LVM 不是什么凭借我在上一段中提到的所有灵活性和可扩展性,LVM 似乎是硬件或软件 RAID 的完美替代品。毕竟,RAID 的一大优势是可以将多个较小的驱动器用作单个较大的驱动器。对于这个特定功能,LVM 确实是理想的选择。但不幸的是,LVM 不提供任何冗余或奇偶校验选项。这意味着如果您在 LVM 中发生驱动器故障,您将丢失数据。没有所谓的条带化 LVM 或镜像 LVM;它根本不是设计来做这个的。
LVM 也不是设计用来通过跨多个磁盘条带化读取和写入来提高速度的。随着卷组中的块设备被填满,可能会发生这种同步读/写,但这不是设计使然,当然也不是为了提高速度。希望这很清楚:LVM 非常酷,但它绝不是 RAID 的替代品。幸运的是,它不需要成为替代品。
(注意:最近版本的 LVM 实际上确实提供了条带化和镜像功能。在某些情况下,它可以完全取代 RAID。我仍然认为将它们理解为单独的概念很重要。如果您想了解更多关于 LVM 并利用 RAID 功能的信息,我将把它作为您的练习。)
一丘之貉如果您查看我的图纸(图 1)中的第一个“阶段”,您会注意到我没有将 10GB 的块称为“驱动器”;我称它们为物理卷。这是因为,虽然肯定可以在 LVM 中使用物理驱动器作为物理卷,但这并不是必需的。事实上,这甚至不是最常见的场景。在大多数生产环境中,LVM 与 RAID 结合使用。无论是基于硬件的 RAID 还是基于软件的 RAID,让您的底层物理卷作为 RAID 设备存在都是理想的。
作为一个曾经遇到过基于硬件的 RAID 阵列问题的人,我倾向于在我的系统中使用基于软件的 RAID。这当然是个人偏好的问题,但很高兴知道,由于基于软件的 RAID 和 LVM 都在内核级别运行,因此两者都非常高效。基于软件的 RAID 确实会占用一些 CPU,尤其是在重建阵列时,但 LVM 占用的非常少。如果 I/O 性能对您的用途至关重要,那么在致力于任何解决方案之前,值得进行一些研究和可能的测试。
开始入门虽然在 Linux 已经安装后过渡到 LVM 系统当然是可能的,但在初始设置期间这样做要好得多。大多数发行版都允许在安装过程中进行 LVM 设置,对于 CentOS 和 RHEL,默认情况下使用 LVM。即使您仅安装到单个非 RAID 硬盘驱动器上,设置 LVM 也可以为您提供灵活性和以后的扩展机会。嘿,以后可以在服务器上添加 RAID,然后只需将数据从原始物理卷迁移到 RAID 物理卷即可。这比使用 dd
容易得多,尤其是在您希望服务器保持运行时!
因为这是一个介绍,所以让我从一个简单的设置开始。假设您有两个硬盘驱动器,/dev/sdb 和 /dev/sdc。使用 LVM,任何块设备都可以用作物理卷 (PV),这意味着您可以使用分区或整个驱动器。如果您需要有一个“传统”分区(在某些情况下,/boot 分区可能需要位于常规的非 LVM 设备上),请务必在将物理卷添加到卷组之前对驱动器进行分区。在本例中,让我们使用原始磁盘本身。
步骤 1:创建物理卷一旦您拥有要添加到卷组的块设备(同样,如果术语变得令人困惑,请继续参考我的图纸),您需要将它们建立为 LVM 物理卷。为此,请使用 pvcreate
命令
pvcreate /dev/sdb
pvcreate /dev/sdc
这些命令将驱动器配置为可以添加到卷组的潜在候选对象。如果您想确保它工作正常,可以键入 pvdisplay
或 pvscan
以显示任何现有 LVM 物理卷的状态
$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 10.4 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4994
Free PE 4994
Allocated PE 0
PV UUID SRKAXh-EpYr-r2td-g0gA-31RA-fnfz-3qqGrO
--- Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 10.4 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4994
Free PE 4994
Allocated PE 0
PV UUID t2cKru-IwMy-I8re-ADp2-vzFF-Tvh5-O4zMhI
以及更简单的 pvscan
$ sudo pvscan
PV /dev/sdb lvm2 [10.4 GiB]
PV /dev/sdc lvm2 [10.4 GiB]
Total: 2 [20.8 GiB] / in use: 0 [0 ] / in no VG: 2 [20.8 GiB]
创建卷组和逻辑卷后,继续再次运行这些命令,看看信息是如何变化的。差异应该是显而易见的,并且应该是有意义的。
步骤 2:卷组您目前没有任何卷组,因此请使用您刚刚创建的两个物理卷创建一个
vgcreate my_volume_group /dev/sdb /dev/sdc
希望该命令很清楚。您已经使用物理卷 /dev/sdb 和 /dev/sdc 创建了一个名为 my_volume_group 的卷组。与物理卷一样,如果您想检查系统上 LVM 卷组的当前状态,请键入 vgdisplay
以获取列表
$ sudo vgdisplay
--- Volume group ---
VG Name my_volume_group
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 20.8 GiB
PE Size 4.00 MiB
Total PE 9988
Alloc PE / Size 0 / 0 GiB
Free PE / Size 9988 / 20.8 GiB
VG UUID oVYiY6-bQp9-4CVO-QgrN-LGgB-1umR-ebJQo4
正如您在输出中看到的那样,您已将两个物理卷(每个 10.4GB)的可用空间合并到一个 20.8GB 的总池中。您可以向卷组添加更多驱动器,或者将整个驱动器与来自其他驱动器的分区混合和匹配。LVM 非常灵活。然而,在您创建逻辑卷以充当可用磁盘之前,大型可用数据池没有任何好处。
步骤 3:逻辑卷当您向系统添加硬盘驱动器时,您实际上无法选择其名称。您会得到 /dev/sda、/dev/sdb 等等。但是,当您创建逻辑卷时,您可以决定希望将设备称为什么。您还可以决定每个“驱动器”的大小,因为您是从更大的卷组中划分出来的。这里需要注意的是,如果您将逻辑卷做得太小,以后很容易扩展它们,因此不必太担心为长期的潜在需求进行规划。如果您以后需要更多空间,您可以随时添加它。要创建逻辑卷,请键入
$ sudo lvcreate -L 5G -n 5gig my_volume_group
Logical volume "5gig" created
然后要查看幕后发生的事情,请键入
$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/my_volume_group/5gig
LV Name 5gig
VG Name my_volume_group
LV UUID 3MxOB0-ce5o-yvBD-YORT-52qV-j8HJ-oDru2G
LV Write Access read/write
LV Status available
# open 0
LV Size 5.0 GiB
Current LE 5753
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
请注意 LVM 的设备命名系统是多么简洁明了。然而,运行 lvdisplay
命令以确保您知道映射的设备名称非常重要。许多系统使用符号链接来尝试使设备的虚拟位置更容易找到,但我认为这为试图理解真正发生的事情的人们增加了一层混乱。
成功创建逻辑卷后,只需将它们用作块设备即可。如果您需要一个文件系统来挂载为您的 /home 目录,只需这样做
$ sudo mkfs.ext4 /dev/my_volume_group/5gig
$ sudo mount -t ext4 /dev/my_volume_group/5gig /home
并且,您的 /home 目录将是惊人的 5GB 大小,但由于 LVM,它是完全可扩展的。(显然,如果您真的想将逻辑卷挂载为您的主目录,您应该在 /etc/fstab 中添加一个条目,以便它在启动时挂载。)然而,从您的 Linux 系统的角度来看,/dev/my_volume/5gig 是一个类似于您可能插入的任何硬盘驱动器的块设备。您可以将其用作交换空间,像上面那样格式化它,甚至可以加密它并将其作为加密分区挂载在某个地方。
这做了很多工作,为什么还要这样做?我知道,在这个小例子中,您除了创建一个 JBOD(Just a Bunch Of Disks,仅一组磁盘)类型的系统之外什么也没做,如果您丢失一个驱动器,该系统将完全失败。LVM 的强大功能只有在将来您想要在不迁移数据的情况下扩展逻辑卷时才能充分体现出来。或者,当您想要获取驱动器的 LVM 快照,以便在升级失败时可以回滚到即时备份时。或者,当您用快速 RAID 阵列替换小驱动器并希望将数据静默迁移到新的 PV 时。
逻辑卷管理器是一个抽象存储设备的系统。我不会撒谎,它确实为您的系统增加了一层复杂性,但权衡是巨大的。它可能会使您的系统稍微复杂一些,但当您将来必须处理存储时,它也大大简化了您的工作。
你一直在谈论未来...希望在这一点上,您会明白 LVM 并不是完全浪费时间。当时间到来时,LVM 将提供哪些优势?以下是您可能想要查看的快速即兴列表
-
将逻辑卷从旧的、慢速的 PV 移动到新的、快速的 PV,动态进行。
-
调整逻辑卷的大小,填充卷组中更多的空间。
-
在 VG 中的 PV 上条带化数据以提高性能。
-
通过添加或减少物理卷来调整卷组的大小。
-
拍摄任何逻辑卷的快照,以后可以恢复。
我在生产环境中使用 LVM 最喜欢的方式之一是在升级之前拍摄 LVM 快照。如果出现问题,我可以直接恢复到快照。一旦您开始考虑 LVM 提供的所有可能性,您就会想知道为什么您等待了这么久!