LVM精简卷(Thinly-Provisioned Logical Volumes)
核心概念:像“云硬盘”一样按需分配

一、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 相同:用于修复/恢复操作。
下图是一个例子:

(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 可以自动重组
发表回复