LVM

来自 ArchWiki

来自 Wikipedia:逻辑卷管理器 (Linux)

逻辑卷管理器 (LVM) 是一个 设备映射器 框架,为 逻辑卷管理 提供支持,用于 Linux 内核

背景

LVM 构建块

逻辑卷管理利用内核的 device-mapper 功能提供了一个独立于底层磁盘布局的 分区 系统。通过 LVM,您可以抽象化存储并拥有“虚拟分区”,从而更轻松地进行 扩展/缩小(受潜在的文件系统限制)。

虚拟分区允许添加和移除,而无需担心在特定磁盘上是否有足够的连续空间,无需陷入对正在使用的磁盘进行 fdisk 操作(并怀疑内核正在使用旧的还是新的分区表),或者必须移动其他分区让路。

LVM 的基本构建块

物理卷 (PV)
Unix 块设备节点,可供 LVM 用于存储。示例:硬盘、MBRGPT 分区、环回文件、设备映射器设备(例如 dm-crypt)。它托管 LVM 标头。
卷组 (VG)
PV 的组,充当 LV 的容器。PE 从 VG 中分配给 LV。
逻辑卷 (LV)
“虚拟/逻辑分区”,驻留在 VG 中,由 PE 组成。LV 是类似于物理分区的 Unix 块设备,例如,它们可以直接格式化为 文件系统
物理盘区 (PE)
PV 中可以分配给 LV 的最小连续盘区(默认 4 MiB)。将 PE 视为 PV 的一部分,可以分配给任何 LV。

示例

Physical disks

  Disk1 (/dev/sda):
    ┌──────────────────────────────────────┬─────────────────────────────────────┐
    │ Partition1  50 GiB (Physical volume) │ Partition2 80 GiB (Physical volume) │
    │ /dev/sda1                            │ /dev/sda2                           │
    └──────────────────────────────────────┴─────────────────────────────────────┘

  Disk2 (/dev/sdb):
    ┌──────────────────────────────────────┐
    │ Partition1 120 GiB (Physical volume) │
    │ /dev/sdb1                            │
    └──────────────────────────────────────┘
LVM logical volumes

  Volume Group1 (/dev/MyVolGroup/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
    ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐
    │ Logical volume1 15 GiB  │ Logical volume2 35 GiB  │ Logical volume3 200 GiB  │
    │ /dev/MyVolGroup/rootvol │ /dev/MyVolGroup/homevol │ /dev/MyVolGroup/mediavol │
    └─────────────────────────┴─────────────────────────┴──────────────────────────┘
注意: 逻辑卷可以通过 /dev/VolumeGroupName/LogicalVolumeName/dev/mapper/VolumeGroupName-LogicalVolumeName 访问。但是,lvm(8) § VALID NAMES 建议软件和脚本(例如 fstab)使用前一种格式,因为后一种格式旨在用于“内部使用”,并且可能在“版本和发行版之间发生更改”。

优点

LVM 比仅使用普通硬盘分区更灵活

  • 将任意数量的磁盘用作一个大磁盘。
  • 拥有跨越多个磁盘的逻辑卷(RAID、镜像、条带化,这些提供额外的弹性和性能等优点 [1])。
  • 创建小的逻辑卷,并在它们被填满时“动态”调整大小。
  • 调整逻辑卷大小,而无需考虑它们在磁盘上的顺序。它不依赖于 LV 在 VG 中的位置,无需确保周围有可用空间。
  • 在线调整大小/创建/删除逻辑卷和物理卷。它们上面的文件系统仍然需要调整大小,但有些文件系统(例如 Ext4Btrfs)支持在线调整大小。
  • 在线/实时迁移服务正在使用的 LV(或段)到不同的磁盘,而无需重启服务。
  • 快照允许您备份文件系统的冻结副本,同时最大限度地减少服务停机时间,并在以后轻松地将快照合并到原始卷中。
  • 支持解锁单独的卷,而无需在启动时多次输入密钥(在 LUKS 之上创建 LVM)。
  • 内置支持缓存常用数据 (lvmcache(7))。

缺点

  • 设置系统中的额外步骤(可能需要更改 mkinitcpio 配置),更复杂。需要(多个)守护进程持续运行。
  • 如果双启动,请注意 Windows 不支持 LVM;您将无法从 Windows 访问任何 LVM 分区。第三方软件可能允许挂载某些类型的 LVM 设置。[2]
  • 如果您的物理卷不在 RAID-1、RAID-5 或 RAID-6 上,则丢失一个磁盘可能会丢失一个或多个逻辑卷,如果您跨多个非冗余磁盘扩展(或扩展)逻辑卷。
  • 缩小逻辑卷管理器使用的空间(即用于逻辑卷的物理卷)并不总是容易的。如果物理盘区分散在物理卷中,直到末尾,您可能需要检查段并移动它们(可能移动到另一个物理设备),或者使用自定义分配设置(例如 --alloc anywhere)移动到同一设备。如果您想与其他操作系统(例如 Microsoft Windows)双启动,则设备上为 Microsoft Windows 留下的唯一空间是 LVM 未使用/未用作物理卷的空间。
  • 性能可能比使用普通分区更差。[3]
  • 可能无法与所有文件系统很好地配合使用,尤其是那些设计为(多)设备感知的文件系统。例如,Btrfs 提供了一些相同的功能(多设备支持(子)卷、快照和 RAID),这可能会发生冲突(进一步阅读关于使用 Btrfs 的 LVM 快照的问题)。

安装

确保 lvm2 软件包已安装

如果您有未通过 initramfs 激活的 LVM 卷,请启用 lvm2-monitor.service,它由 lvm2 软件包提供。

卷操作

物理卷

创建

要在 /dev/sda1 上创建 PV,请运行

# pvcreate /dev/sda1

您可以使用以下命令检查 PV 是否已创建

# pvs

扩容

在扩展或缩小具有物理卷的设备的大小之前,您需要使用 pvresize(8) 增长或缩小 PV。

要在扩大 分区 后扩展 /dev/sda1 上的 PV,请运行

# pvresize /dev/sda1

这将自动检测设备的新大小并将 PV 扩展到其最大值。

注意: 此命令可以在卷在线时完成。

缩减

要在缩减物理卷之前缩减其底层设备,请将 --setphysicalvolumesize size 参数添加到命令中,例如

# pvresize --setphysicalvolumesize 40G /dev/sda1

上述命令可能会使您遇到此错误

/dev/sda1: cannot resize to 25599 extents as later ones are allocated.
0 physical volume(s) resized / 1 physical volume(s) not resized

实际上,如果 pvresize 在其新结尾之后分配了盘区,它将拒绝缩小 PV。如果卷组中有足够的可用空间,则需要事先运行 pvmove 将这些盘区重新定位到卷组中的其他位置。

移动物理盘区

在释放卷末尾的物理盘区之前,必须运行 pvdisplay -v -m 才能看到它们。查看表格形式的段的另一种方法是 pvs --segments -v

在下面的示例中,在 /dev/sdd1 上有一个物理卷,一个卷组 vg1 和一个逻辑卷 backup

# pvdisplay -v -m
    Finding all volume groups.
    Using physical volume(s) on command line.
  --- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               vg1
  PV Size               1.52 TiB / not usable 1.97 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              399669
  Free PE               153600
  Allocated PE          246069
  PV UUID               MR9J0X-zQB4-wi3k-EnaV-5ksf-hN1P-Jkm5mW
   
  --- Physical Segments ---
  Physical extent 0 to 153600:
    FREE
  Physical extent 153601 to 307199:
    Logical volume	/dev/vg1/backup
    Logical extents	1 to 153599
  Physical extent 307200 to 307200:
    FREE
  Physical extent 307201 to 399668:
    Logical volume	/dev/vg1/backup
    Logical extents	153601 to 246068

可以观察到 FREE 空间分布在整个卷中。要缩小物理卷,我们必须首先将所有已使用的段移动到开头。

在这里,第一个空闲段是从 0 到 153600,给我们留下了 153601 个空闲盘区。我们现在可以将此段号从最后一个物理盘区移动到第一个盘区。因此,该命令将是

# pvmove --alloc anywhere /dev/sdd1:307201-399668 /dev/sdd1:0-92467
/dev/sdd1: Moved: 0.1 %
/dev/sdd1: Moved: 0.2 %
...
/dev/sdd1: Moved: 99.9 %
/dev/sdd1: Moved: 100.0 %
注意
  • 此命令将 399668 - 307201 + 1 = 92468 个 PE 最后一个段移动到第一个段。这是可能的,因为第一个段包含 153600 个空闲 PE,可以容纳 92467 - 0 + 1 = 92468 个移动的 PE。
  • --alloc anywhere 选项用于我们在同一分区内移动 PE 的情况。如果是不同的分区,命令将如下所示
    # pvmove /dev/sdb1:1000-1999 /dev/sdc1:0-999
  • 如果卷很大,则此命令可能需要很长时间(一到两个小时)。最好在 tmuxGNU Screen 会话中运行此命令。进程的任何意外停止都可能是致命的。
  • 操作完成后,运行 fsck 以确保您的文件系统有效。
调整物理卷大小

一旦所有空闲物理段都位于最后一个物理盘区上,请以 root 权限运行 vgdisplay 并查看您的空闲 PE。

然后您现在可以再次运行命令

# pvresize --setphysicalvolumesize size PhysicalVolume

查看结果

# pvs
  PV         VG   Fmt  Attr PSize    PFree 
  /dev/sdd1  vg1  lvm2 a--     1t     500g
调整分区大小

最后,您需要使用您喜欢的 分区工具 缩小分区。

卷组

创建卷组

要使用关联的 PV /dev/sdb1 创建 VG MyVolGroup,请运行

# vgcreate MyVolGroup /dev/sdb1

您可以使用以下命令检查是否已创建 VG MyVolGroup

# vgs

您可以在创建 VG 时绑定多个 PV,如下所示

# vgcreate MyVolGroup /dev/sdb1 /dev/sdb2

激活卷组

注意: 您可以通过在 /etc/lvm/lvm.conf 中设置 auto_activation_volume_list 来限制自动激活的卷。如果不确定,请将此选项注释掉。
# vgchange -a y MyVolGroup

默认情况下,这将在适用时重新激活卷组。例如,如果您在镜像中遇到驱动器故障,并且您更换了驱动器;并运行了 (1) pvcreate、(2) vgextend 和 (3) vgreduce --removemissing --force

修复卷组

要在此示例中启动降级镜像阵列的重建过程,您将运行

# lvconvert --repair /dev/MyVolGroup/mirror

您可以使用以下命令监视重建过程(Cpy%Sync 列输出)

# lvs -a -o +devices

停用卷组

只需调用

# vgchange -a n MyVolGroup

这将停用卷组,并允许您卸载其存储所在的容器。

重命名卷组

使用 vgrename(8) 命令重命名现有卷组。

以下任一命令都会将现有卷组 MyVolGroup 重命名为 my_volume_group

# vgrename /dev/MyVolGroup /dev/my_volume_group
# vgrename MyVolGroup my_volume_group

确保更新引用重命名的卷组的所有配置文件(例如 /etc/fstab/etc/crypttab)。

向卷组添加物理卷

首先在您要使用的块设备上创建一个新的物理卷,然后扩展您的卷组

# pvcreate /dev/sdb1
# vgextend MyVolGroup /dev/sdb1

当然,这将增加卷组上的物理盘区总数,逻辑卷可以根据您的需要分配这些盘区。

注意: 建议在 LVM 下方的存储介质上使用分区表。使用适当的分区类型:MBR 为 8e,GPT 分区为 E6D6D379-F507-44C2-A23C-238F2A3DF928gdisk 中的 8e00 类型代码,fdisk 中的 lvm 类型别名)。

从卷组移除分区

如果您在分区上创建了逻辑卷,请先移除它。

该分区上的所有数据都需要移动到另一个分区。幸运的是,LVM 使这变得容易

# pvmove /dev/sdb1

如果您想将数据放在特定的物理卷上,请将其指定为 pvmove 的第二个参数

# pvmove /dev/sdb1 /dev/sdf1

然后需要从卷组中移除物理卷

# vgreduce MyVolGroup /dev/sdb1

或移除所有空的物理卷

# vgreduce --all MyVolGroup

例如:如果您的组中有一个坏盘,因为它已被移除或发生故障而无法找到

# vgreduce --removemissing --force MyVolGroup

最后,如果您想将分区用于其他用途,并希望避免 LVM 认为该分区是物理卷

# pvremove /dev/sdb1

逻辑卷

注意: lvresize(8) 提供的选项与专门的 lvextend(8)lvreduce(8) 命令大致相同,同时允许执行这两种类型的操作。尽管如此,所有这些实用程序都提供了一个 -r/--resizefs 选项,该选项允许使用 fsadm(8)(支持 ext2ext3ext4ReiserFSXFS)一起调整文件系统和 LV 的大小。因此,除非您有特定需求或想要完全控制该过程,否则可能更容易简单地使用 lvresize 进行两种操作,并使用 --resizefs 来简化操作。
警告: 虽然通常可以在线(在挂载时)扩大文件系统,即使对于根分区也是如此,但缩小几乎总是需要先卸载文件系统,以防止数据丢失。确保您的文件系统支持您尝试执行的操作。
提示: 如果逻辑卷将使用 ext4 格式化,请在卷组中至少保留 256 MiB 的可用空间,以便允许使用 e2scrub(8)。在使用 -l 100%FREE 创建最后一个卷后,可以通过使用 lvreduce -L -256M volume_group/logical_volume 减小其大小来完成此操作。

创建逻辑卷

要在 VG MyVolGroup 中创建容量为 300 GiB 的 LV homevol,请运行

# lvcreate -L 300G MyVolGroup -n homevol

或者,要在 VG MyVolGroup 中创建具有剩余容量的 LV homevol,请运行

# lvcreate -l 100%FREE MyVolGroup -n homevol

要在创建 LV 时将其限制为 VG 内的特定 PV,请将它们附加到命令

# lvcreate -L 300G MyVolGroup -n homevol /dev/sda1

新的 LV 将显示为 /dev/MyVolGroup/homevol。现在您可以使用适当的文件系统格式化 LV。

您可以使用以下命令检查是否已创建 LV

# lvs

重命名逻辑卷

要重命名现有逻辑卷,请使用 lvrename(8) 命令。

以下任一命令都会将卷组 MyVolGroup 中的逻辑卷 old_vol 重命名为 new_vol

# lvrename /dev/MyVolGroup/old_vol /dev/MyVolGroup/new_vol
# lvrename MyVolGroup old_vol new_vol

确保更新引用重命名的逻辑卷的所有配置文件(例如 /etc/fstab/etc/crypttab)。

一次性调整逻辑卷和文件系统大小

注意: 仅支持 ext2ext3ext4ReiserFSXFS 文件系统。对于不同类型的文件系统,请参阅#分别调整逻辑卷和文件系统大小

MyVolGroup 中的逻辑卷 mediavol 扩展 10 GiB,并一次性调整其文件系统大小

# lvresize -L +10G --resizefs MyVolGroup/mediavol

MyVolGroup 中的逻辑卷 mediavol 的大小设置为 15 GiB,并一次性调整其文件系统大小

# lvresize -L 15G --resizefs MyVolGroup/mediavol

如果要填充卷组上的所有可用空间,请使用以下命令

# lvresize -l +100%FREE --resizefs MyVolGroup/mediavol

有关更多详细选项,请参阅 lvresize(8)

分别调整逻辑卷和文件系统大小

对于 fsadm(8) 不支持的文件系统,在缩小逻辑卷之前或扩展逻辑卷之后,将需要使用适当的实用程序来调整文件系统大小。

要将卷组 MyVolGroup 中的逻辑卷 mediavol 扩展 2 GiB,而不触及其文件系统

# lvresize -L +2G MyVolGroup/mediavol

现在将文件系统(本例中为 ext4)扩展到底层逻辑卷的最大大小

# resize2fs /dev/MyVolGroup/mediavol

对于 Btrfsbtrfs-filesystem(8) 期望挂载点而不是设备,等效命令是

# btrfs filesystem resize max /mnt/my-mountpoint

要将 MyVolGroup 中的逻辑卷 mediavol 的大小缩小 500 MiB,请首先计算生成的文件系统大小,并将文件系统(本例中为 Ext4)缩小到新大小

# resize2fs /dev/MyVolGroup/mediavol NewSize

与 Ext4 不同,Btrfs 支持在线缩小(同样,应指定挂载点),例如

# btrfs filesystem resize -500M /mnt/my-mountpoint

当文件系统缩小后,减小逻辑卷的大小

# lvresize -L -500M MyVolGroup/mediavol

要计算 ext2ext3ext4 文件系统的精确逻辑卷大小,请使用一个简单的公式:LVM_EXTENTS = FS_BLOCKS × FS_BLOCKSIZE ÷ LVM_EXTENTSIZE

# tune2fs -l /dev/MyVolGroup/mediavol | grep Block
Block count:              102400000
Block size:               4096
Blocks per group:         32768
# vgdisplay MyVolGroup | grep "PE Size"
PE Size               4.00 MiB
注意: 文件系统块大小以字节为单位。确保块大小和盘区大小使用相同的单位。
102400000 blocks × 4096 bytes/block ÷ 4 MiB/extent = 100000 extents

传递 --resizefs 将确认正确性。

# lvreduce -l 100000 --resizefs /dev/MyVolGroup/mediavol
...
The filesystem is already 102400000 (4k) blocks long.  Nothing to do!
...
Logical volume sysvg/root successfully resized.

有关更多详细选项,请参阅 lvresize(8)

移除逻辑卷

警告: 在移除逻辑卷之前,请确保将您要保留的所有数据移动到其他位置;否则,这些数据将丢失!

首先,找出您要移除的逻辑卷的名称。您可以使用以下命令获取所有逻辑卷的列表

# lvs

接下来,查找所选逻辑卷的挂载点

$ lsblk

然后卸载逻辑卷上的文件系统

# umount /mountpoint

最后,移除逻辑卷

# lvremove volume_group/logical_volume

例如

# lvremove MyVolGroup/homevol

输入 y 以确认。

确保更新引用已移除的逻辑卷的所有配置文件(例如 /etc/fstab/etc/crypttab)。

您可以通过再次以 root 身份键入 lvs 来验证逻辑卷的移除(请参阅本节的第一步)。

快照

LVM 支持 CoW(写入时复制)快照。CoW 快照最初指向原始数据。当数据块被覆盖时,原始副本保持不变,新块被写入磁盘上的其他位置。这具有几个理想的属性

  • 创建快照速度很快,因为它不复制数据(仅复制指向磁盘位置的短得多的指针列表)。
  • 快照只需要足够的可用空间来保存新数据块(加上可忽略不计的指向新块的指针量)。例如,对于 35 GiB 数据的快照,您仅写入 2 GiB(在原始数据和快照上),则仅需要 2 GiB 的可用空间。

LVM 快照位于块级别。它们创建了一个新的块设备,除了在使用 LVM 工具时,与原始设备没有明显的关联。因此,删除原始副本中的文件不会释放快照中的空间。如果您需要文件系统级别的快照,则更需要 btrfsZFSbcachefs

警告
  • CoW 快照不是备份,因为它不会创建原始数据的第二个副本。例如,影响原始数据的损坏磁盘扇区也会影响快照。也就是说,在使用其他工具进行备份时,快照可能会有所帮助,如下文备份中所述。
  • Btrfs 期望不同的文件系统具有不同的 UUID。如果您快照包含 btrfs 文件系统的 LVM 卷,请确保在挂载原始文件系统和副本之前(或在内核可见之前,例如,如果无关的守护进程触发 btrfs device scan),更改原始文件系统或副本的 UUID。有关详细信息,请参阅 btrfs wiki Gotcha's

配置

您创建快照逻辑卷的方式与创建普通逻辑卷的方式相同。

# lvcreate --size 100M --snapshot --name snap01vol /dev/MyVolGroup/lvol

有了该卷,您可以在快照卷填满之前修改少于 100 MiB 的数据。

要将修改后的 lvol 逻辑卷恢复到拍摄 snap01vol 快照时的状态,可以使用以下命令:

# lvconvert --merge /dev/MyVolGroup/snap01vol

如果源逻辑卷处于活动状态,合并将在下次重启时发生(即使从 LiveCD 也可以进行合并)。

注意: 合并后,快照将不再存在。

也可以拍摄多个快照,并且每个快照都可以随意与源逻辑卷合并。

备份

快照提供了文件系统的冻结副本以进行备份。例如,耗时两小时的备份比直接备份分区提供更一致的文件系统映像。

快照可以被挂载并使用 ddtar 进行备份。使用 dd 完成的备份文件大小将是快照卷上文件的大小。要恢复,只需创建一个快照,挂载它,并将备份写入或解压到其中。然后将其与源卷合并。

请参阅 使用 LVM 创建根文件系统快照,了解如何在系统启动期间自动创建干净的根文件系统快照,以便进行备份和回滚。

此文章或章节需要扩充。

原因: 展示用于自动化更新前根快照的脚本,以进行回滚... 更新 menu.lst 以引导快照(也许在单独的文章中?) (在 Talk:LVM 中讨论)

加密

请参阅 dm-crypt/加密整个系统#LUKS on LVMdm-crypt/加密整个系统#LVM on LUKS,了解 LUKS 与 LVM 结合的可能方案。

缓存

此文章或章节需要扩充。

原因: LVM 也支持 --type writecache,它使用 dm-writecache。(在 Talk:LVM 中讨论)

来自 lvmcache(7)

缓存逻辑卷类型使用小型快速 LV 来提高大型慢速 LV 的性能。它通过将常用块存储在更快的 LV 上来实现这一点。LVM 将小型快速 LV 称为缓存池 LV。大型慢速 LV 称为源 LV。由于 dm-cache(内核驱动程序)的要求,LVM 进一步将缓存池 LV 分割为两个设备 - 缓存数据 LV 和缓存元数据 LV。缓存数据 LV 是保存来自源 LV 的数据块副本以提高速度的地方。缓存元数据 LV 保存指定数据块存储位置(例如,在源 LV 上或在缓存数据 LV 上)的记账信息。如果用户希望创建最佳和最强大的缓存逻辑卷,则应熟悉这些 LV。所有这些关联的 LV 必须在同一个 VG 中。

创建缓存

将您的快速磁盘 (/dev/fastdisk) 转换为 PV 并添加到您现有的 VG (MyVolGroup)

# vgextend MyVolGroup /dev/fastdisk

/dev/fastdisk 上创建具有自动元数据的缓存池,并将现有的 LV MyVolGroup/rootvol 转换为缓存卷,所有操作一步完成

# lvcreate --type cache --cachemode writethrough -l 100%FREE -n root_cachepool MyVolGroup/rootvol /dev/fastdisk
提示: 您可以使用 -L 20G 代替 -l 100%FREE 来仅为缓存池分配 20 GiB,而不是从 PV /dev/fastdisk 分配 100% 的可用空间。

Cachemode 有两个可能的选项

  • writethrough 确保任何写入的数据都将存储在缓存池 LV 和源 LV 中。在这种情况下,与缓存池 LV 关联的设备的丢失不会意味着任何数据丢失;
  • writeback 确保更好的性能,但以更高的数据丢失风险为代价,如果用于缓存的驱动器发生故障。

如果未指明特定的 --cachemode,系统将默认假定为 writethrough

提示: 可以使用 lvdisplay 或来自 libblockdev-lvmlvm-cache-stats 查看缓存命中和未命中计数,后者还以百分比形式显示它们。

移除缓存

如果您需要撤消上面的一步创建操作

# lvconvert --uncache MyVolGroup/rootvol

这将提交缓存中任何待处理的写入操作到源 LV,然后删除缓存。其他选项可用,并在 lvmcache(7) 中描述。

RAID

LVM 可以用于创建 软件 RAID。如果用户没有硬件 RAID 并且计划使用 LVM,这是一个不错的选择。来自 lvmraid(7)

lvm(8) RAID 是一种创建逻辑卷 (LV) 的方法,该逻辑卷使用多个物理设备来提高性能或容忍设备故障。在 LVM 中,物理设备是单个卷组 (VG) 中的物理卷 (PV)。

LVM RAID 支持 RAID 0、RAID 1、RAID 4、RAID 5、RAID 6 和 RAID 10。有关每个级别的详细信息,请参阅 Wikipedia:标准 RAID 级别

提示: mdadm 也可用于创建软件 RAID。可以说它更简单、更流行且更易于设置。

设置 RAID

创建物理卷

# pvcreate /dev/sda2 /dev/sdb2

在物理卷上创建卷组

# vgcreate MyVolGroup /dev/sda2 /dev/sdb2

新卷

使用 lvcreate --type raidlevel 创建逻辑卷,请参阅 lvmraid(7)lvcreate(8) 以获取更多选项。

# lvcreate --type RaidLevel [OPTIONS] -n Name -L Size VG [PVs]
RAID 0

例如

# lvcreate -n myraid1vol -i 2 -I 64 -L 70G VolGroup00 /dev/nvme1n1p1 /dev/nvme0n1p1

将在 VolGroup00 中创建一个名为 "myraid1vol" 的 70 GiB 条带化 (raid0) 逻辑卷。条带将分布在 /dev/nvme1n1p1/dev/nvme0n1p1 上。条带大小设置为 64K。

RAID 1

例如

# lvcreate --type raid1 --mirrors 1 -L 20G -n myraid1vol MyVolGroup /dev/sda2 /dev/sdb2

将在 /dev/sda2/dev/sdb2 上的 VolGroup00 中创建一个名为 "myraid1vol" 的 20 GiB 镜像逻辑卷。

RAID 10

例如

# lvcreate -n myraid1vol -L 100G --type raid10 -m 1 -i 2 MyVolGroup /dev/sdd1 /dev/sdc1 /dev/sdb1 /dev/sda5

将在 /dev/sdd1/dev/sdc1/dev/sdb1/dev/sda5 上的 VolGroup00 中创建一个名为 "myraid1vol" 的 100 GiB RAID10 逻辑卷。

现有卷

您可以轻松地将非 RAID(例如线性)卷转换为几乎任何其他 raid 配置,前提是您有足够的物理设备来满足 RAID 要求。其中一些将需要您执行中间步骤,lvconvert 将告知您并提示您同意。下面的 raid10 可以替换为 raid0raid1raid5 等。

# lvconvert --type raid10 /dev/vg01/lv01

使用特定的 PV

# lvconvert --type raid10 /dev/vg01/lv01 /dev/sda1 /dev/sdb2 /dev/nvme0n1p1 ...

您可以使用以下命令跟踪转换进度

# watch lvs -o name,vg_name,copy_percent

精简配置

注意: 挂载精简 LV 文件系统时,请务必记住使用 discard 选项或定期使用 fstrim,以允许精简 LV 在文件删除时收缩。

来自 lvmthin(7)

标准 lvm(8) 逻辑卷 (LV) 中的块在创建 LV 时分配,但精简配置 LV 中的块在写入时分配。因此,精简配置 LV 被赋予虚拟大小,并且可能比物理可用存储空间大得多。可以稍后根据需要增加为精简配置 LV 提供的物理存储量。

示例:实施虚拟专用服务器

这是典型的用例。假设您想启动自己的 VPS 服务,最初在一台具有 930 GiB 硬盘的 PC 上托管大约 100 个 VPS。几乎没有 VPS 会实际使用分配给它们的所有存储空间,因此与其为每个 VPS 分配 9 GiB,不如允许每个 VPS 最大 30 GiB,并使用精简配置仅为每个 VPS 分配它们实际使用的硬盘空间。假设 930 GiB 硬盘是 /dev/sdb。以下是设置。

准备卷组 MyVolGroup

# vgcreate MyVolGroup /dev/sdb

创建精简池 LV MyThinPool。此 LV 提供存储块。

# lvcreate --type thin-pool -n MyThinPool -l 95%FREE MyVolGroup

精简池由两个子卷组成,数据 LV 和元数据 LV。此命令自动创建两者。但是,如果其中任何一个完全填满,精简池将停止工作,并且 LVM 当前不支持收缩这些卷中的任何一个。这就是为什么上面的命令允许 5% 的额外空间,以防您需要扩展精简池的数据或元数据子卷。

对于每个 VPS,创建一个精简 LV。这是暴露给用户的块设备,用于他们的根分区。

# lvcreate -n SomeClientsRoot -V 30G --thinpool MyThinPool MyVolGroup

块设备 /dev/MyVolGroup/SomeClientsRoot 然后可以被 VirtualBox 实例用作根分区。

使用精简快照以节省更多空间

精简快照比常规快照强大得多,因为它们本身就是精简 LV。有关精简快照的完整优势列表,请参阅 Red Hat 指南 [4]

与其每次创建 VPS 时都从头开始安装 Linux,不如从仅包含 Linux 基本安装的精简 LV 开始,这样更节省空间

# lvcreate -n GenericRoot -V 30G --thinpool MyThinPool MyVolGroup
*** install Linux at /dev/MyVolGroup/GenericRoot ***

然后为其每个 VPS 创建快照

# lvcreate -s MyVolGroup/GenericRoot -n SomeClientsRoot

这样,在精简池中,至少最初只有一份所有 VPS 共有的数据副本。额外的好处是,新 VPS 的创建是瞬间完成的。

由于这些是精简快照,因此对 GenericRoot 的写入操作只会导致总共一次 COW 操作,而不是每个快照一次 COW 操作。这使您可以比每个 VPS 都是常规快照的情况下更有效地更新 GenericRoot

示例:零停机时间存储升级

精简配置在 VPS 托管之外还有应用。以下是如何使用它来扩展已挂载文件系统的有效容量,而无需卸载它。再次假设服务器只有一个 930 GiB 硬盘。设置与 VPS 托管相同,只是只有一个精简 LV,并且 LV 的大小远大于精简池的大小。

# lvcreate -n MyThinLV -V 16T --thinpool MyThinPool MyVolGroup

额外的虚拟空间可以在以后通过扩展精简池来用实际存储空间填充。

假设一段时间后,需要进行存储升级,并且将新的硬盘 /dev/sdc 插入服务器。要升级精简池的容量,请将新硬盘添加到 VG

# vgextend MyVolGroup /dev/sdc

现在,扩展精简池

# lvextend -l +95%FREE MyVolGroup/MyThinPool

由于此精简 LV 的大小为 16 TiB,因此您可以在最终必须卸载和调整文件系统大小之前添加另外 15.09 TiB 的硬盘空间。

注意: 您可能需要使用 保留块磁盘配额,以防止应用程序尝试使用超过实际物理存储空间的存储空间。

自定义

通过编辑 /etc/lvm/lvm.conf 可以进行一些自定义。您可能会发现自定义 lvspvs 的输出很有用,默认情况下,它们不包括 % sync(用于查看例如线性和 raid 类型之间转换的进度)和逻辑卷类型

/etc/lvm/lvm.conf
report {
 	lvs_cols = "lv_name,lv_attr,lv_active,vg_name,lv_size,lv_layout,lv_allocation_policy,copy_percent,chunk_size"
	pvs_cols = "pv_name,vg_name,pv_size,pv_free,pv_used,dev_size"
}

故障排除

LVM 命令不起作用

  • 加载正确的模块
# modprobe dm_mod

dm_mod 模块应自动加载。如果未自动加载,请显式在启动时加载模块

  • 尝试在命令前加上 lvm,如下所示
# lvm pvdisplay

逻辑卷未显示

如果您正在尝试挂载现有的逻辑卷,但它们未在 lvscan 中显示,则可以使用以下命令激活它们

# vgscan
# vgchange -ay

可移动介质上的 LVM

症状

# vgscan
  Reading all physical volumes.  This may take a while...
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836585984: Input/output error
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836643328: Input/output error
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 0: Input/output error
  /dev/backupdrive1/backup: read failed after 0 of 4096 at 4096: Input/output error
  Found volume group "backupdrive1" using metadata type lvm2
  Found volume group "networkdrive" using metadata type lvm2

原因:在未先停用卷组的情况下移除外部 LVM 驱动器。在断开连接之前,请确保

# vgchange -an volume_group_name

修复:假设您已经尝试使用 vgchange -ay vg 激活卷组,并且收到 Input/output errors 错误

# vgchange -an volume_group_name

拔下外部驱动器并等待几分钟

# vgscan
# vgchange -ay volume_group_name

使用 LVM 和可移动介质挂起/恢复

此文章或章节的真实性存在争议。

原因: 提供的解决方案在更复杂的设置(如 LUKS on LVM)中将不起作用。(在 Talk:LVM#可移动介质上的 LVM 中讨论)

为了使 LVM 与可移动介质(如外部 USB 驱动器)正常工作,外部驱动器的卷组需要在挂起之前停用。如果未这样做,您可能会在 dm 设备上收到缓冲区 I/O 错误(恢复后)。因此,不建议在同一卷组中混合使用外部和内部驱动器。

要自动停用带有外部 USB 驱动器的卷组,请按以下方式标记每个卷组 sleep_umount 标签

# vgchange --addtag sleep_umount vg_external

设置标签后,使用以下 systemd 单元文件在挂起之前正确停用卷。恢复时,它们将由 LVM 自动激活。

/etc/systemd/system/ext_usb_vg_deactivate.service
[Unit]
Description=Deactivate external USB volume groups on suspend
Before=sleep.target

[Service]
Type=oneshot
ExecStart=-/etc/systemd/system/deactivate_sleep_vgs.sh

[Install]
WantedBy=sleep.target

和这个脚本

/etc/systemd/system/deactivate_sleep_vgs.sh
#!/bin/sh

TAG=@sleep_umount
vgs=$(vgs --noheadings -o vg_name $TAG)

echo "Deactivating volume groups with $TAG tag: $vgs"

# Unmount logical volumes belonging to all the volume groups with tag $TAG
for vg in $vgs; do
    for lv_dev_path in $(lvs --noheadings  -o lv_path -S lv_active=active,vg_name=$vg); do
        echo "Unmounting logical volume $lv_dev_path"
        umount $lv_dev_path
    done
done

# Deactivate volume groups tagged with sleep_umount
for vg in $vgs; do
    echo "Deactivating volume group $vg"
    vgchange -an $vg
done

最后,启用该单元。

调整连续逻辑卷大小失败

如果尝试扩展逻辑卷时出现错误

" Insufficient suitable contiguous allocatable extents for logical volume "

原因是逻辑卷是使用显式连续分配策略(选项 -C y--alloc contiguous)创建的,并且没有更多的相邻连续扩展区可用。[5]

要解决此问题,在扩展逻辑卷之前,请使用 lvchange --alloc inherit logical_volume 更改其分配策略。如果您需要保持连续分配策略,另一种方法是将卷移动到具有足够可用扩展区的磁盘区域。请参阅 [6]

命令 "grub-mkconfig" 报告 "unknown filesystem" 错误

生成 grub.cfg 之前,请确保删除快照卷。

精简配置的根卷设备超时

对于大量快照,thin_check 运行的时间足够长,以至于等待根设备超时。为了补偿,请将 rootdelay=60 内核启动参数添加到您的引导加载程序配置中。或者,使 thin_check 跳过检查块映射(请参阅 [7])并重新生成 initramfs

/etc/lvm/lvm.conf
thin_check_options = [ "-q", "--clear-needs-check-flag", "--skip-mappings" ]

关机延迟

如果您使用 RAID、快照或精简配置并遇到关机延迟,请确保 lvm2-monitor.service启动。请参阅 FS#50420

休眠到精简配置的交换卷

请参阅 电源管理/挂起和休眠#休眠到精简配置的 LVM 卷

另请参阅