LVM精简卷

LVM精简卷(Thinly-Provisioned Logical Volumes)

核心概念:像“云硬盘”一样按需分配

0aad7ec8fbd89dd27313dca21b88ebcc

一、Thin Pool(精简池的概念)

精简卷”通常指的是 “精简配置”(Thin Provisioning)的逻辑卷,这是LVM提供的一种高级存储管理功能。它允许你超额分配物理存储,创建出总容量大于实际物理空间的“虚拟”卷,从而大幅提高存储利用率。

举个例子:

  • 你有一个 100GB 的 thin pool。
  • 你可以在这个thin pool中创建多个精简卷(虚拟卷),这些精简卷的总“虚拟大小”可以超过 100GB。
  • 但实际占用的物理空间只会随着数据写入而增长,直到达到 100GB 的上限。
  • 可以把传统LVM卷比作“预付费手机套餐”:你买50G,运营商就立即为你保留50G的物理空间,即便你只用了5G。
    精简卷更像是“后付费的云硬盘”:你声明需要1TB,系统只在你真正写入数据时,才从共享的物理池中为你分配实际空间。

精简池(thin pool)是 LVM 中的一种特殊逻辑卷,它由两个部分组成:

  • 数据卷(data volume):用于存储实际数据。
  • 元数据卷(metadata volume):用于记录数据块的使用情况。

这两个卷组合起来形成一个 thin pool精简池本身不直接存储数据,而是作为一个“池子”,供精简卷(thin volume)使用。

二、精简卷的创建

在了解如何创建精简池和卷之前,我们必须创建一个卷组,并在其中填充至少一个物理卷。

1、创建LVM 物理卷

先使用一个 2048 GiB 的 /dev/sdb 分区作为 LVM 物理卷

$ sudo pvcreate /dev/sdb

要创建一个卷组(我将其命名为“vg0”),并同时向其中添加物理卷,我们执行以下命令:

$ sudo vgcreate vg0 /dev/sdb

我们可以使用 vgdisplay 命令来可视化当前设置。在本例中,它返回以下输出:

  --- Volume group ---
 VG Name               vg0
 System ID            
 Format                lvm2
 Metadata Areas        1
 Metadata Sequence No  8
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                3
 Open LV               0
 Max PV                0
 Cur PV                1
 Act PV                1
 VG Size               <2.00 TiB
 PE Size               4.00 MiB
 Total PE              524287
 Alloc PE / Size       0 / 0
 Free  PE / Size       524287 / <2.00 TiB
 VG UUID               X9NU2v-cFKA-zJFe-Jp3u-3nyt-ITKt-RFs0dd

2、创建 LVM 精简池

我们像创建其他逻辑卷一样创建 LVM 精简池;唯一的区别在于我们使用了 --thinpool 选项。假设我们要创建一个名为“lxcfgpool”的精简池;我们将运行以下命令:

$ sudo lvcreate --thinpool lxcfgpool -L 1024GiB vg0

可以看到,我们并没有使用卷组中的所有可用空间:这是一种安全措施,以确保池具有一定的扩展余地(稍后我们将讨论这一点)。要验证精简池是否已创建,我们可以使用 lvs 命令:

$ sudo lvs
LV        VG  Attr           LSize  Pool Origin     Data% Meta% Move Log Cpy%Sync Convert
lxcfgpool vg0  twi-aotz--    1.00t                  0.06   10.45

通过观察输出,可以看到池中目前没有使用任何数据,而 10.45% 的空间用于元数据。“Attr”列下报告的表示卷类型。其中, t 表示我们正在处理一个精简池。通过在命令中添加 -a 选项,我们可以收集更多信息:

$ sudo lvs -a
LV                VG  Attr       LSize  Pool Origin  Data% Meta%(元数据) Move Log Cpy%Sync Convert
[lvol0_pmspare]   vg0  ewi-------  128.00m                                                
lxcfgpool         vg0  twi-aotz--    1.00t           0.06   10.45               [lxcfgpool_tdata] vg0  Twi-ao----    1.00t                                     [lxcfgpool_tmeta] vg0  ewi-ao----  128.00m
 

由于我们使用了 -a 选项,现有的“内部”逻辑卷会包含在输出中:用户无法直接访问这些卷。它们是用来做什么的?一个精简池由两个“标准”逻辑卷组合而成:一个用于保存数据(Attr位中的“T”代表精简池数据 ),另一个用于保存元数据(“e”)。此外,还会创建一个额外的 pmspare(元数据池备用)逻辑卷,其大小与元数据 LV 相同:用于修复/恢复操作。

下图是一个例子:

image-20251015164351970

(1)、列头含义

LV 逻辑卷名字 VG 所属卷组 Attr 属性标志(见下方拆解) LSize 对外暴露的“虚拟/逻辑”大小(thin LV 就是虚拟大小) Pool 该 thin LV 隶属于哪个 thin-pool Origin 快照起源卷(无快照则为空) Data% thin-pool 实际物理块已使用比例(仅 thin-pool 行有意义) Meta% thin-pool 元数据区已使用比例(仅 thin-pool 行有意义) Move/Log/Cpy%… 镜像迁移、日志、同步进度,平时多为空

(2)、属性标志 8 位字母逐位解释(以 Vwi-aotz-- 为例)

1 V → 这是 thin 卷(Virtual) 2 w → 可写 3 i → 继承分配策略(inherit) 4 – → 非镜像/非快照起源 5 a → 活动并可见(active) 6 o → 打开(mounted 或正在使用)未挂载则是- 7 t → thin 卷 专属标记

(3)、各行速读

home / root / usr / var

├─ 都是 thin LV(首位属性 V),虚拟大小分别为 717G / 50G / 50G / 100G

├─ 它们共用 pool00 作为物理池

└─ Data% 列空 → 要看 pool00 那一行的 Data% 才知道整个池子实际写满多少

pool00

├─ thin-pool 本体(属性首位 t)

├─ LSize 917G → 这是 真正从 VG 划走的物理空间

├─ Data% 1.79 → 已写 1.79% ≈ 16.4G 实际数据

└─ Meta% 2.72 → 元数据区用了 2.72%(仍很健康)

[pool00_tdata] / [pool00_tmeta]

├─ 带方括号 → 子组件(内部 LV),一般不用手动操作

├─ _tdata 917G → 池子的 数据区

└─ _tmeta 920M → 池子的 元数据区

[lvol0_pmspare]

└─ 备用 metadata 盘,默认 1 份,防止元数据区损坏时无法修复(自动创建,可忽略)

swap

└─ 普通LV,非 精简卷,直接占走 4G 物理空间,所以属性里没有 V/t

3、创建精简卷

有了精简池后,我们就可以创建精简逻辑卷了。创建精简卷非常简单。我们仍然使用 lvcreate 命令;不过,这次我们不再指定卷的“静态”大小,而是使用 -V 选项来指定它的“虚拟”大小,即它可以占用的最大空间量。在下面的示例中,我们创建了一个名为“thinvolume0”的精简逻辑卷,其虚拟大小为 10 GiB:

$ sudo lvcreate -V 500GiB -T vg0/lxcfgpool -n thinvolume0

我们的第一个精简卷已准备就绪。现在,让我们尝试创建另一个相同大小的精简卷:

$ sudo lvcreate -V 700GiB -T vg0/lxcfgpool -n thinvolume1
WARNING: Sum of all thin volume sizes (1.17 TiB) exceeds the size of thin pool vg0/lxcfgpool and the amount of free space in volume group (<1023.75 GiB).
 WARNING: You have not turned on protection against thin pools running out of space.
 WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
Logical volume "thinvolume1" created.

命令执行成功,但是这次我们收到如上一系列警告:大致意思是说,所有精简卷大小之和(1.17 TiB)超过了精简池 vg0/lxcfgpool 的大小和整个卷组的大小(<1023.75 GiB)。但是,我们尚未打开针对精简池空间不足的保护。可以将 activation/thin_pool_autoextend_threshold 设置为低于 100,以在精简池变满之前触发自动扩展。

第一条消息非常清晰:两个精简卷的虚拟大小之和(1.17 TiB)大于精简池的大小。这仍然是一个有效的场景,因为正如我之前已经说过的,只有在使用时才会分配空间。

第二条消息警告我们尚未启用针对精简池空间耗尽的保护措施。精简池不应耗尽空间,否则可能会导致文件系统损坏。通过在 /etc/lvm/lvm.conf 配置文件中将 thin_pool_autoextend_threshold 选项设置为百分比值 < 100,我们可以使精简池在达到指定阈值时自动扩展。当然,卷组中必须有可用空间才能成功执行此操作。自动扩展池时添加到池中的空间量可以通过 thin_pool_autoextend_percent 选项进行配置,默认情况下,该选项通常设置为池空间的 20%。

4、配置thin pool自动扩容

查看配置文件/etc/lvm/lvm.conf,找到thin_pool_autoextend_threshold,此配置项表明当精简池的使用率超过此百分比时会自动扩展。默认情况下,自动扩展名设置为100,表示禁用自动扩展,默认设置为100,表示该功能已被禁用。要启用自动扩展,请同时更改lvm.conf两个参数:

thin_pool_autoextend_threshold = 70
thin_pool_autoextend_percent = 20

这意味着,只要精简池使用率超过70%,它就会再扩展20%。

要确保vg池的空间是足够的

5、使用 fstrim释放精简卷的数据块

在精简配置设置中,定期使用 fstrim 之类的实用程序非常重要,以确保精简卷中释放的块作为可用空间返回到池中。fstrim“垃圾回收” 的触发器,用于释放已删除文件占用的物理空间,对 SSD 和精简配置(thin provisioning)特别重要。

工作原理如下:

(1)、文件系统里你删除了一个文件。

(2)、文件系统只是标记“这块空间可用”,并不会立即告诉磁盘

(3)、运行 fstrim 后,它会扫描未使用的块,并通过 TRIM / DISCARD 命令告诉磁盘:“这些块我不用了,你可以擦除/回收。”

(4)、磁盘收到通知后,内部回收空间,提升性能、延长寿命。

接下来,我演示一下这个过程,有了精简卷,现在让我在其上创建文件系统:

$ sudo mkfs.xfs /dev/vg0/thinvolume0
$ sudo mkfs.xfs /dev/vg0/thinvolume1
$ sudo mkdir /data1
$ sudo mkdir /data2

现在,开始挂载“thinvolume0”逻辑卷,并使用 dd 模拟创建 1 GiB 文件:

$ sudo mount /dev/vg0/thinvolume0 /data1
$ sudo mount /dev/vg0/thinvolume1 /data2
$ sudo dd if=/dev/zero of=/data1/test bs=1M count=1024

下面是创建文件后,精简池的状态:

$ sudo lvs
LV          VG  Attr       LSize  Pool     Origin Data%  Meta%  Move Log Cpy%Sync Convert
lxcfgpool   vg0  twi-aotz--  1.00t                 0.30   10.52                      
thinvolume0 vg0  Vwi-aotz--  500.00g lxcfgpool     0.47                              
thinvolume1 vg0  Vwi-aotz--  700.00g lxcfgpool     0.05
 

如上所见,池空间现在已使用 0.30%。那么,如果我删除刚刚创建的文件会发生什么:

$ sudo rm /data1/test

再次检查池状态:

$ sudo lvs
LV          VG  Attr       LSize  Pool     Origin Data%  Meta%  Move Log Cpy%Sync Convert
lxcfgpool   vg0  twi-aotz--  1.00t                 0.30   10.52                      
thinvolume0 vg0  Vwi-aotz--  500.00g lxcfgpool     0.47                              
thinvolume1 vg0  Vwi-aotz--  700.00g lxcfgpool     0.05
 

看起来没什么变化。现在我在已挂载的文件系统上运行 fstrim:

$ sudo fstrim /data1

或者加上-v选项:

$ sudo fstrim -v /data1
/data1:1.1 TiB (1179777966080 字节) 已修剪

再次检查池的状态:

$ sudo lvs
LV          VG  Attr       LSize  Pool      Origin  Data% Meta% Move Log Cpy%Sync Convert
lxcfgpool   vg0  twi-aotz--  1.00t                  0.06  10.45                      
thinvolume0 vg0  Vwi-aotz--  500.00g lxcfgpool      0.05                              
thinvolume1 vg0  Vwi-aotz--  700.00g lxcfgpool      0.05

可以发现,修剪的空间已返回到池中。fstrim 就是 “告诉磁盘哪些块已失效,可以回收空间” 的命令,对精简卷是必备保养工具

精简池主要看那个大的实际vg data%

扩容加个-r 可以自动重组

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注