LVM
背景
LVM 构建块
逻辑卷管理利用内核的 device-mapper 功能提供了一个独立于底层磁盘布局的 分区 系统。通过 LVM,您可以抽象化存储并拥有“虚拟分区”,从而更轻松地进行 扩展/缩小(受潜在的文件系统限制)。
虚拟分区允许添加和移除,而无需担心在特定磁盘上是否有足够的连续空间,无需陷入对正在使用的磁盘进行 fdisk 操作(并怀疑内核正在使用旧的还是新的分区表),或者必须移动其他分区让路。
LVM 的基本构建块
- 物理卷 (PV)
- Unix 块设备节点,可供 LVM 用于存储。示例:硬盘、MBR 或 GPT 分区、环回文件、设备映射器设备(例如 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 中的位置,无需确保周围有可用空间。
- 在线调整大小/创建/删除逻辑卷和物理卷。它们上面的文件系统仍然需要调整大小,但有些文件系统(例如 Ext4 和 Btrfs)支持在线调整大小。
- 在线/实时迁移服务正在使用的 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 快照的问题)。
安装
如果您有未通过 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
- 如果卷很大,则此命令可能需要很长时间(一到两个小时)。最好在 tmux 或 GNU 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
当然,这将增加卷组上的物理盘区总数,逻辑卷可以根据您的需要分配这些盘区。
8e
,GPT 分区为 E6D6D379-F507-44C2-A23C-238F2A3DF928
(gdisk 中的 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
逻辑卷
-r
/--resizefs
选项,该选项允许使用 fsadm(8)(支持 ext2、ext3、ext4、ReiserFS 和 XFS)一起调整文件系统和 LV 的大小。因此,除非您有特定需求或想要完全控制该过程,否则可能更容易简单地使用 lvresize
进行两种操作,并使用 --resizefs
来简化操作。-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
)。
一次性调整逻辑卷和文件系统大小
将 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
对于 Btrfs,btrfs-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、ext3、ext4 文件系统的精确逻辑卷大小,请使用一个简单的公式: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 工具时,与原始设备没有明显的关联。因此,删除原始副本中的文件不会释放快照中的空间。如果您需要文件系统级别的快照,则更需要 btrfs、ZFS 或 bcachefs。
- 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 也可以进行合并)。
也可以拍摄多个快照,并且每个快照都可以随意与源逻辑卷合并。
备份
快照提供了文件系统的冻结副本以进行备份。例如,耗时两小时的备份比直接备份分区提供更一致的文件系统映像。
快照可以被挂载并使用 dd 或 tar 进行备份。使用 dd 完成的备份文件大小将是快照卷上文件的大小。要恢复,只需创建一个快照,挂载它,并将备份写入或解压到其中。然后将其与源卷合并。
请参阅 使用 LVM 创建根文件系统快照,了解如何在系统启动期间自动创建干净的根文件系统快照,以便进行备份和回滚。
加密
请参阅 dm-crypt/加密整个系统#LUKS on LVM 和 dm-crypt/加密整个系统#LVM on LUKS,了解 LUKS 与 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
。
移除缓存
如果您需要撤消上面的一步创建操作
# 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 级别。
设置 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
可以替换为 raid0
、raid1
、raid5
等。
# 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
精简配置
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
可以进行一些自定义。您可能会发现自定义 lvs
和 pvs
的输出很有用,默认情况下,它们不包括 % 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 和可移动介质挂起/恢复
为了使 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 卷。