跳转至内容

LVM

来自 ArchWiki

来自 Wikipedia:Logical Volume Manager (Linux)

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

背景

LVM 组成部分

逻辑卷管理利用内核的 设备映射器 功能,提供一个独立于底层磁盘布局的 分区 系统。使用 LVM,您可以抽象化存储并拥有“虚拟分区”,从而更轻松地 扩展/缩减(可能受限于文件系统限制)。

虚拟分区允许添加和移除,而无需担心某个特定磁盘上是否有足够的连续空间,也不会陷入使用 fdisk 处理正在使用的磁盘(并怀疑内核使用的是旧的还是新的分区表),或者不得不将其他分区移开。

LVM 的基本组成部分

物理卷 (PV)
可供 LVM 用于存储的 Unix 块设备节点。示例:硬盘、MBRGPT 分区、loopback 文件、设备映射器设备(例如 dm-crypt)。它托管一个 LVM 头。
卷组 (VG)
PV 的集合,用作 LV 的容器。PE 从 VG 分配给 LV。
逻辑卷 (LV)
位于 VG 中并由 PE 组成的“虚拟/逻辑分区”。LV 是类比物理分区的 Unix 块设备,例如,可以直接使用 文件系统 对其进行格式化。
物理 extent (PE)
PV 中可以分配给 LV 的最小连续 extent(默认为 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 上,丢失一个磁盘*可能*会丢失一个或多个逻辑卷,如果您将逻辑卷跨越(或扩展)多个非冗余磁盘。
  • 要缩小逻辑卷管理器使用的空间(即逻辑卷使用的物理卷)并不总是那么容易。如果物理 extents 分散在物理卷的末尾,您可能需要检查段并移动它们(可能移动到另一个物理设备)或使用自定义分配设置(例如 --alloc anywhere)移到同一个设备上。如果您想与其他操作系统(例如 Microsoft Windows)双启动,设备上留给 Microsoft Windows 的唯一空间是 LVM 未使用的空间/未用作物理卷的空间。
  • 潜在性能比使用纯分区差。 [3]
  • 可能不适用于所有文件系统,特别是那些设计为(多)设备感知的文件系统。例如,Btrfs 提供了一些相同的功能(多设备支持、((子)卷、快照和 RAID),这可能会发生冲突(进一步了解 LVM 快照与 Btrfs 的问题)。

安装

确保已安装 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 如果在其新结束位置之后分配了 extents,将拒绝缩小 PV。如果卷组中有足够的可用空间,则需要先运行 pvmove 来将这些 extents 移到其他位置。

移动物理 extents

在释放卷末尾的物理 extents 之前,必须运行 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 个空闲 extents。我们现在可以将此段号从最后一个物理 extent 移动到第一个 extent。因此,命令将是

# 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 以确保文件系统有效。
重调物理卷大小

将所有空闲物理段移到最后一个物理 extent 后,以 root 权限运行 vgdisplay 并查看空闲 PE。

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

# pvresize --setphysicalvolumesize size PhysicalVolume

查看结果

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

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

卷组

创建卷组

要创建一个名为 MyVolGroup 的 VG,并关联 PV /dev/sdb1,请运行

# 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

这当然会增加卷组中的物理 extent 总数,逻辑卷可以根据需要进行分配。

注意 建议在 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)(支持 *ext2*、ext3ext4、*ReiserFS* 和 XFS)一起调整文件系统大小。因此,直接使用 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)。

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

注意 仅支持 *ext2*、ext3ext4、*ReiserFS* 和 XFS 文件系统。对于其他类型的文件系统,请参阅 #单独调整逻辑卷和文件系统大小

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

要计算 *ext2*、ext3ext4 文件系统的确切逻辑卷大小,请使用一个简单公式: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
注意 文件系统块大小以字节为单位。确保对块大小和 extent 大小使用相同的单位。
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 中讨论)

加密

有关将 LUKS 与 LVM 结合使用的可能方案,请参阅 dm-crypt/加密整个系统#LUKS on LVMdm-crypt/加密整个系统#LVM on LUKS

缓存

本文章或章节需要扩充。

原因: 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 转换为缓存 LV,所有操作一步完成

# lvcreate --type cache --cachemode writethrough -l 100%FREE -n root_cachevol MyVolGroup/rootvol /dev/fastdisk
提示 不要使用 -l 100%FREE 从 PV /dev/fastdisk 分配 100% 的可用空间,而是可以使用 -L 20G 来只为 cachevol 分配 20 GiB。

使用缓存池

使用缓存逻辑卷,LVM 会自动管理缓存的元数据和数据。但您也可以手动创建元数据和缓存 LV,并创建一个缓存池

# lvcreate -n cache_meta -l 1%FREE MyVolGroup /dev/fastdisk
# lvcreate -n cache_data -l 100%FREE MyVolGroup /dev/fastdisk
# lvconvert --type cache-pool --cachemode writeback --poolmetadata MyVolGroup/cache_meta MyVolGroup/cache_data
# lvconvert --type cache --cachepool MyVolGroup/cache_data MyVolGroup/rootvol

Cachemode 选项

Cachemode 有两个可选选项

  • writethrough 确保任何写入的数据都会同时存储在缓存 LV 和原始 LV 中。在这种情况下,缓存 LV 相关设备的丢失不会导致任何数据丢失;
  • writeback 确保更好的性能,但会以缓存驱动器故障时数据丢失风险增加为代价。

如果未指定特定的 --cachemode,系统将默认使用 writethrough

提示 可以使用 lvdisplaylibblockdev-lvm 中的 lvm-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:Standard RAID levels

提示 也可以使用 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]

请注意下面的示例如何分别指定物理卷。在某些情况下,让 LVM 为新逻辑卷使用特定的设备子集是有意义的。但总的来说,这并非必需。

RAID 0

例如:

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

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

RAID 1

例如:

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

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

RAID 5

RAID5 需要至少三个驱动器(--stripes 的数量加上一个奇偶校验设备)。数据和奇偶校验块存储在每个设备上,通常以旋转模式。

例如:

# lvcreate --type raid5 --stripes 2 -L 40G -n myraid5vol MyVolGroup /dev/sda2 /dev/sdb2 /dev/sdc2

将在 VolGroup00 中,在 /dev/sda2/dev/sdb2/dev/sdc2 上创建一个 40 GiB 的条带化逻辑卷,名为“myraid5vol”。在每个磁盘上,RAID5 将占用约 20 GiB。

RAID 6

RAID6 需要至少五个驱动器(--stripes 的数量加上两个奇偶校验设备)。与 RAID5 一样,数据和奇偶校验块存储在每个设备上,通常以旋转模式。

例如:

# lvcreate --type raid6 --stripes 3 -L 60G -n myraid6vol MyVolGroup /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2

将在 VolGroup00 中,在 /dev/sda2/dev/sdb2/dev/sdc2/dev/sdd2 上创建一个 60 GiB 的条带化逻辑卷,名为“myraid6vol”。在每个磁盘上,RAID6 将占用约 20 GiB。

RAID 10

例如:

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

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

现有卷

您可以轻松地将非 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 激活卷组,并且收到输入/输出错误

# vgchange -an volume_group_name

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

# vgscan
# vgchange -ay volume_group_name

使用 LVM 和可移动介质进行暂停/恢复

本文或本章节的准确性存在争议。

原因: 在更复杂的设置(如 LUKS on LVM)中,提供的解决方案将不起作用。(在 Talk:LVM#LVM on removable media 中讨论)

为了使 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)下创建的,并且没有进一步相邻的连续 extent 可用。[5][已失效链接 2025-11-17—SSL 错误]

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

命令“grub-mkconfig”报告“未知文件系统”错误

生成 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

休眠到精简配置的交换卷

请参阅 Power management/Suspend and hibernate#Hibernation into a thinly-provisioned LVM volume

参见