跳转至内容

LVM

来自 ArchWiki

来自 维基百科:逻辑卷管理器 (Linux)

逻辑卷管理器 (LVM) 是一个 device mapper 框架,为 Linux 内核提供 逻辑卷管理 功能。

背景

LVM 构建组件

逻辑卷管理利用内核的 device-mapper 特性来提供一套独立于底层磁盘布局的 分区 系统。通过 LVM,您可以抽象化存储并拥有“虚拟分区”,使得 扩展/缩小 更加容易(取决于文件系统的潜在限制)。

虚拟分区允许您添加和移除卷,而无需担心特定磁盘上是否有足够的连续空间,也不必在磁盘使用中被 fdisk 困扰(或怀疑内核是否在使用旧的或新的分区表),或者被迫移动其他分区来腾出空间。

LVM 的基本构建组件

物理卷 (PV)
Unix 块设备节点,可供 LVM 用于存储。示例:硬盘、MBRGPT 分区、环回文件、device mapper 设备(如 dm-crypt)。它包含 LVM 标头。
卷组 (VG)
PV 的组合,作为 LV 的容器。PE 从卷组中分配给逻辑卷。
逻辑卷 (LV)
位于卷组中并由 PE 组成的“虚拟/逻辑分区”。逻辑卷是类似于物理分区的 Unix 块设备,例如,它们可以直接用 文件系统 格式化。
物理范围 (PE)
物理卷中可分配给逻辑卷的最小连续范围(默认为 4 MiB)。可以将 PE 视为可以分配给任何逻辑卷的物理卷片段。

示例

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/卷组名/逻辑卷名/dev/mapper/卷组名-逻辑卷名 访问。但是,lvm(8) § VALID NAMES 建议“软件和脚本”使用前一种格式(例如 fstab),因为后一种格式旨在用于“内部使用”,并且可能会在“版本和发行版之间发生变化”。

优点

LVM 相比于普通硬盘分区具有更高的灵活性

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

缺点

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

安装

确保已安装 lvm2 软件包。

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

卷操作

物理卷

创建

要在 /dev/sda1 上创建物理卷,请运行

# pvcreate /dev/sda1

您可以使用以下命令检查物理卷是否已创建

# pvs

扩展

在扩展物理卷所在的设备大小之后,或在减小其大小之前,您需要使用 pvresize(8) 扩展或缩小物理卷。

要在扩大 分区 之后扩展 /dev/sda1 上的物理卷,请运行

# pvresize /dev/sda1

这将自动检测设备的新大小并将物理卷扩展至最大值。

注意 此命令可以在卷联机时执行。

缩小

要在缩小底层设备之前缩小物理卷,请在命令中添加 --setphysicalvolumesize 大小 参数,例如:

# 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 将拒绝缩小该物理卷。如果有足够的可用空间,需要事先运行 pvmove 将这些范围重新分配到卷组中的其他位置。

移动物理范围 (PE)

在释放卷末尾的物理范围之前,必须运行 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,足以容纳移动过来的 92468 个 PE。
  • 由于我们在同一分区内移动 PE,因此使用了 --alloc anywhere 选项。如果是不同的分区,命令可能如下所示:
    # 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
调整分区大小

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

卷组

创建卷组

要创建一个名为 MyVolGroup 且关联 PV /dev/sdb1 的卷组,请运行

# vgcreate MyVolGroup /dev/sdb1

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

# vgs

创建卷组时可以绑定多个 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)。因此,除非您有特定需求或希望完全控制流程,否则简单地对两类操作都使用 lvresize 并辅以 --resizefs 以简化操作可能会更容易。
警告 虽然扩大文件系统通常可以联机(即在挂载状态下)完成,即使对于根分区也是如此,但缩小几乎总是需要先卸载文件系统,以防止数据丢失。请确保您的文件系统支持您尝试执行的操作。
提示 如果逻辑卷将格式化为 ext4,请在卷组中至少留出 256 MiB 的空闲空间以允许使用 e2scrub(8)。在使用 -l 100%FREE 创建最后一个卷之后,可以通过使用 lvreduce -L -256M 卷组/逻辑卷 减小其大小来实现这一点。

创建逻辑卷

要在卷组 MyVolGroup 中创建一个容量为 300 GiB 的逻辑卷 homevol,请运行:

# lvcreate -L 300G MyVolGroup -n homevol

或者,使用剩余全部容量在卷组 MyVolGroup 中创建逻辑卷 homevol,请运行:

# lvcreate -l 100%FREE MyVolGroup -n homevol

在创建逻辑卷时,若要将其限制在卷组内的特定物理卷,请将其附加到命令中:

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

新的逻辑卷将显示为 /dev/MyVolGroup/homevol。现在您可以用合适的文件系统 格式化 逻辑卷了。

您可以使用以下命令检查逻辑卷是否已创建:

# 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 卷进行快照,请确保在同时挂载两者之前更改原始文件系统或其副本的 UUID(或使其对内核可见,例如如果无关的守护进程触发了 btrfs device scan)。详见 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 还支持使用 dm-writecache 的 --type 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)转换为物理卷并添加到现有的卷组(MyVolGroup)中:

# vgextend MyVolGroup /dev/fastdisk

使用逻辑卷缓存 (cache LV)

/dev/fastdisk 上创建一个具有自动元数据的缓存逻辑卷,并将现有的逻辑卷 MyVolGroup/rootvol 转换为缓存逻辑卷,一步到位:

# 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 会自动管理缓存的元数据和数据。但您也可以手动创建元数据和缓存逻辑卷,并创建一个缓存池:

# 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

缓存模式选项

缓存模式有两种可能的选项:

  • writethrough(直写式)确保写入的任何数据都将同时存储在缓存逻辑卷和原始逻辑卷中。在这种情况下,与缓存逻辑卷关联的设备丢失并不意味着任何数据丢失;
  • writeback(回写式)能提供更好的性能,但代价是:一旦用于缓存的驱动器发生故障,数据丢失的风险更高。

如果没有指明特定的 --cachemode,系统将默认采用 writethrough

提示 缓存命中和缺失次数可以通过 lvdisplay 查看,也可以使用来自 libblockdev-lvmlvm-cache-stats 查看,后者还会显示百分比。

移除缓存

如果您需要撤消上述一步到位创建的操作:

# lvconvert --uncache MyVolGroup/rootvol

这会将仍在缓存中待处理的所有写入操作提交回原始逻辑卷,然后删除缓存。其他可用选项在 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。有关各级别的详细信息,请参阅 维基百科:标准 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]

请留意下方各示例是如何指定物理卷的。在某些情况下,让 LVM 为新的逻辑卷使用特定的子设备集是有意义的。但一般来说,这并不是必须的。

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

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

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 上创建一个名为 "myraid5vol" 的 40 GiB 条带化逻辑卷。在每个磁盘上,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 上创建一个名为 "myraid6vol" 的 60 GiB 条带化逻辑卷。在每个磁盘上,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 上创建一个名为 "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

精简置备 (Thin provisioning)

注意 挂载精简逻辑卷文件系统时,请务必记住使用 discard 选项或定期运行 fstrim,以便在删除文件时减小精简逻辑卷的大小。

摘自 lvmthin(7)

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

示例:部署虚拟专用服务器 (VPS)

这里有一个经典用例。假设您想启动自己的 VPS 服务,最初在一台配备 930 GiB 硬盘的单机上托管约 100 个 VPS。几乎没有 VPS 会真正用完分配的所有存储空间,因此您可以允许每个 VPS 最多使用 30 GiB,并使用精简置备根据每个 VPS 的实际使用量来分配硬盘空间,而不是给每个 VPS 固定分配 9 GiB。假设 930 GiB 的硬盘是 /dev/sdb。下面是设置过程。

准备卷组 MyVolGroup

# vgcreate MyVolGroup /dev/sdb

创建精简池逻辑卷 MyThinPool。该逻辑卷为存储提供块。

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

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

为每个 VPS 创建一个精简逻辑卷。这是暴露给用户用于其根分区的块设备。

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

块设备 /dev/MyVolGroup/SomeClientsRoot 随后可供 VirtualBox 实例作为根分区使用。

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

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

与其每次创建 VPS 时都从头安装 Linux,不如先建立一个包含 Linux 基础安装的精简逻辑卷,这样更节省空间:

# 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 托管相同,只是只有一个精简逻辑卷,且该逻辑卷的虚拟大小远大于精简池的大小。

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

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

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

# vgextend MyVolGroup /dev/sdc

现在,扩展精简池:

# lvextend -l +95%FREE MyVolGroup/MyThinPool

由于这个精简逻辑卷的虚拟大小是 16 TiB,您可以在最终被迫卸载并调整文件系统大小之前,再添加 15.09 TiB 的硬盘空间。

注意 您可能希望使用 保留块磁盘配额 来防止应用程序尝试使用超出实际存在的物理存储。

自定义

通过编辑 /etc/lvm/lvm.conf 可以进行一些自定义设置。您可能会发现自定义 lvspvs 的输出很有用,默认输出不包含同步百分比(这有助于查看如线性到 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 与可移动介质的待机/恢复

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

理由: 提供的方案在更复杂的设置(如 LVM 上的 LUKS)中不起作用。(在 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),且其周围已没有相邻的连续范围可用。[5][失效链接 2025-11-17—SSL 错误]

要解决此问题,在扩展逻辑卷之前,使用 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 卷

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.