如何在 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 的救援光盘。

为了重复和清晰起见,以下是如何挂载 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

否则,这东西不错。

这就解释了为什么我一直丢失数据! ;-)

感谢您的阅读和评论,john-351。

回复 作者 john-351 (未验证)

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

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