如何在 Linux 上使用 LVM 管理存储

使用 Linux LVM 实用程序根据需要创建、扩展和加密存储池。
283 位读者喜欢这篇文章。
Storage units side by side

Scott Meyers。由 Opensource.com 修改。CC BY-SA 2.0。

逻辑卷管理器(LVM)是一个基于软件的类 RAID 系统,可让您创建存储“池”,并根据需要向这些池添加硬盘空间。有很多理由使用它,尤其是在数据中心或任何存储需求随时间变化的地方。许多 Linux 发行版默认在桌面安装中使用它,因为用户发现其灵活性很方便,并且 LVM 结构简化了一些内置的加密功能。

但是,如果您不习惯在从 Live CD 启动以进行数据恢复或迁移时看到 LVM 卷,LVM 可能会令人困惑,因为 mount 命令无法挂载 LVM 卷。为此,您需要安装 LVM 工具。您的发行版很有可能已经提供了 LVM 实用程序——如果它们尚未安装。

本教程解释了如何创建和处理 LVM 卷。

创建 LVM 池

本文假设您已具备在 Linux 上与硬盘驱动器交互的工作知识。如果您在继续之前需要更多关于基础知识的信息,请阅读我的 Linux 硬盘驱动器入门

通常,您根本不必设置 LVM。当您安装 Linux 时,它通常默认创建虚拟的存储“池”,并将您机器的硬盘驱动器添加到该池中。但是,手动创建 LVM 存储池是学习幕后发生情况的好方法。

您可以使用任意大小的两个备用 U 盘、两个硬盘驱动器或定义了两个虚拟驱动器的虚拟机进行练习。

首先,格式化虚拟驱动器 /dev/sdx,以便您有一个全新的驱动器可以用于此演示。

# echo "warning, this ERASES everything on this drive."
warning, this ERASES everything on this drive.
# dd if=/dev/zero of=/dev/sdx count=8196
# parted /dev/sdx print | grep Disk
Disk /dev/sdx: 100GB
# parted /dev/sdx mklabel gpt
# parted /dev/sdx mkpart primary 1s 100%

此 LVM 命令创建一个存储池。一个池可以由一个或多个驱动器组成,现在它由一个驱动器组成。此示例存储池名为 billiards,但您可以将其命名为任何名称。

# vgcreate billiards /dev/sdx1

现在您有了一个大的、模糊的存储空间池。是时候分配它了。要创建两个逻辑卷(您可以将它们视为虚拟驱动器),一个名为 vol0,另一个名为 vol1,请输入以下内容

# lvcreate billiards 49G --name vol0
# lvcreate billiards 49G --name vol1

现在您已经从一个存储池中划分出两个卷,但它们都没有文件系统。要在每个卷上创建文件系统,您必须使 billiards 卷组联机。

# vgchange --activate y billiards

现在创建文件系统。-L 选项为驱动器提供标签,该标签在驱动器挂载到您的桌面时显示。卷的路径与您习惯的常用设备路径略有不同,因为这些是 LVM 存储池中的虚拟设备。

# mkfs.ext4 -L finance /dev/billiards/vol0
# mkfs.ext4 -L production /dev/billiards/vol1

您可以将这些新卷挂载到您的桌面或从终端挂载。

# mkdir -p /mnt/vol0 /mnt/vol1
# mount /dev/billiards/vol0 /mnt/vol0
# mount /dev/billiards/vol1 /mnt/vol1

向您的池添加空间

到目前为止,LVM 提供的功能与正常分区驱动器提供的功能没有什么不同:单个物理驱动器上的两个不同驱动器空间部分(在本例中,100GB 驱动器上的 49GB 和 49GB)。现在想象一下,财务部门需要更多空间。传统上,您必须进行重组。也许您会将财务部门的数据移动到新的专用物理驱动器,或者您可能会添加一个驱动器,然后使用难看的符号链接技巧来为用户提供对其额外存储空间的轻松访问。但是,使用 LVM,您只需扩展存储池即可。

您可以通过格式化另一个驱动器并使用它来创建更多额外的空间来向您的池添加空间。

首先,在新添加到池中的驱动器上创建一个分区。

# part /dev/sdy mkpart primary 1s 100%

然后使用 vgextend 命令将新驱动器标记为池的一部分。

# vgextend billiards /dev/sdy1

最后,将新可用存储池的某些部分分配给适当的逻辑卷。

# lvextend -L +49G /dev/billiards/vol0

当然,扩展不必如此线性。想象一下,生产部门突然需要 100TB 的额外空间。使用 LVM,您可以根据需要添加任意数量的物理驱动器,添加每个驱动器并使用 vgextend 创建 100TB 的存储池,然后使用 lvextend 将生产部门的存储空间“拉伸”到 100TB 的可用空间。

使用实用程序了解您的存储结构

一旦您开始认真使用 LVM,存储环境可能会变得令人难以承受。有两个命令可以收集有关存储基础设施结构的信息。

首先,是 vgdisplay,它显示有关您的卷组的信息(您可以将这些卷组视为 LVM 的大型、高级虚拟驱动器)。

# vgdisplay
  --- Volume group ---
  VG Name               billiards
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <237.47 GiB
  PE Size               4.00 MiB
  Total PE              60792
  Alloc PE / Size       60792 / <237.47 GiB
  Free  PE / Size       0 / 0   
  VG UUID               j5RlhN-Co4Q-7d99-eM3K-G77R-eDJO-nMR9Yg

第二个是 lvdisplay,它显示有关您的逻辑卷的信息(您可以将这些逻辑卷视为面向用户的驱动器)。

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/billiards/finance
  LV Name                finance
  VG Name                billiards
  LV UUID                qPgRhr-s0rS-YJHK-0Cl3-5MME-87OJ-vjjYRT
  LV Write Access        read/write
  LV Creation host, time localhost, 2018-12-16 07:31:01 +1300
  LV Status              available
  # open                 1
  LV Size                149.68 GiB
  Current LE             46511
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3

[...]

在救援环境中使用 LVM

LVM 的“问题”在于它以一种许多习惯于传统驱动器分区的管理用户不熟悉的方式包装分区。在正常情况下,LVM 驱动器在启动过程或桌面 LVM 集成期间以相当隐蔽的方式激活和挂载。这通常不是您需要考虑的事情。只有当您在系统出现问题后发现自己处于恢复模式时,它才会变得有问题。

如果您需要挂载“隐藏”在 LVM 结构中的卷,则必须确保已安装 LVM 工具链。如果您可以访问您的 /usr/sbin 目录,您可能可以访问所有常用的 LVM 命令。但是,如果您已启动到最小 shell 或救援环境,您可能没有这些工具。一个好的救援环境安装了 LVM,因此如果您处于最小 shell 中,请查找一个安装了 LVM 的救援系统。如果您正在使用救援光盘并且它没有安装 LVM,则手动安装它或找到一个已经安装了它的救援光盘。

为了重复和清晰起见,以下是如何挂载 LVM 卷。

# vgchange --activate y
2 logical volume(s) in volume group "billiards" now active
# mkdir /mnt/finance
# mount /dev/billiards/finance /mnt/finance

将 LVM 与 LUKS 加密集成

许多 Linux 发行版在安装操作系统时默认使用 LVM。这允许稍后进行存储扩展,而且它还与 Linux 统一密钥设置(LUKS)加密工具链提供的磁盘加密很好地集成。

加密非常重要,有两种加密方法:您可以使用像 GnuPG 这样的工具按文件加密,或者您可以加密整个分区。在 Linux 上,使用 LUKS 加密分区很容易,LUKS 通过内核模块完全集成到 Linux 中,允许挂载驱动器以进行无缝读写。

加密您的整个主驱动器通常在安装期间作为一个选项出现。当提示时,您选择加密您的整个驱动器或仅加密您的主分区,从那时起您就一直在使用 LUKS。除了启动期间的密码提示外,它对您来说基本上是不可见的。

如果您的发行版在安装期间不提供此选项,或者您只是想手动加密驱动器或分区,您可以这样做。

您可以使用备用驱动器来遵循此示例;我使用了一个小的 4GB U 盘。

首先,将驱动器插入您的计算机。确保可以安全地擦除驱动器,并使用 lsblk 在您的系统上找到该驱动器。

如果驱动器尚未分区,请立即对其进行分区。如果您不知道如何分区驱动器,请查看上面的链接以获取说明。

现在您可以设置加密了。首先,使用 cryptsetup 命令格式化分区。

# cryptsetup luksFormat /dev/sdx1

请注意,您正在加密分区,而不是物理驱动器本身。您将看到一个警告,提示 LUKS 将要擦除您的驱动器;您必须接受它才能继续。系统将提示您创建密码,请执行此操作。不要忘记该密码。没有它,您将永远无法再次进入该驱动器!

您已经加密了 U 盘的分区,但驱动器上还没有文件系统。当然,在您被锁定在驱动器之外时,您无法将文件系统写入驱动器,因此请先使用 LUKS 打开驱动器。您可以为您的驱动器提供一个人类友好的名称;在本例中,我使用了 mySafeDrive

# cryptsetup luksOpen /dev/sdx1 mySafeDrive

输入您的密码以打开驱动器。

查看 /dev/mapper,您会看到您已经挂载了卷以及您可能拥有的任何其他 LVM 卷,这意味着您现在可以访问该驱动器。自定义名称(例如,mySafeDrive)是 /dev/mapper 中自动生成的指示符的符号链接。在操作此驱动器时,您可以使用任一路径。

# ls -l /dev/mapper/mySafeDrive
lrwxrwxrwx. 1 root root 7 Oct 24 03:58 /dev/mapper/mySafeDrive -> ../dm-4

创建您的文件系统。

# mkfs.ext4 -o Linux -L mySafeExt4Drive /dev/mapper/mySafeDrive

现在在 /dev/mapper 上执行 ls -lh,您会看到 mySafeDrive 实际上是到某个其他 dev 的符号链接;可能是 /dev/dm0 或类似的。那是您可以挂载的文件系统

# mount /dev/mapper/mySafeExt4Drive /mnt/hd

现在加密驱动器上的文件系统已挂载。您可以像使用任何驱动器一样读取和写入文件。

在桌面上使用加密驱动器

LUKS 内置于内核中,因此您的 Linux 系统完全了解如何处理它。分离驱动器,重新插入,然后从您的桌面挂载它。在 KDE 的 Dolphin 文件管理器中,在驱动器解密和挂载之前,系统会提示您输入密码。

LUKS password prompt

使用 LVM 和 LUKS 非常容易,它为您作为用户和管理员提供了灵活性。由于与 Linux 本身紧密集成,它得到了很好的支持,并且是为您的数据添加一层安全性的好方法。今天就试试吧!

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算行业工作,并且经常同时进行。

4 条评论

“您可以使用任意大小的两个备用 U 盘、两个硬盘驱动器或定义了两个虚拟驱动器的虚拟机进行练习”

我试过使用虚拟驱动器,但它们根本不防水。:p

除此之外,这很棒。

很棒的文章,但与该部分的名称“将 LVM 与 LUKS 加密集成”所暗示的不同,它实际上并未涵盖如何在 LVM 的上下文中使用 LUKS。
我的意思是您将 LUKS 与 LVM 分开处理(您从新分区开始)。一篇后续文章描述如何同时使用两者(LUKS 加密的 LVM 分区)将很棒。无论如何,再次感谢这篇出色的文章。
作者关于“如何在 Linux 上分区和格式化驱动器”的文章也值得一读。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© 2025 open-source.net.cn. All rights reserved.