LVM thin pool 是什么
LVM thin pool 用一个精简池为多个卷按需分配空间,很适合承载虚机磁盘:逻辑容量可以超配,实际占用随写入增长,配合 virtio-scsi 的 discard 还能回收空间。代价是必须监控数据与元数据两个水位——池写满会导致所有使用该池的虚机同时出现 I/O 错误。
基本信息
| 建池 | lvcreate --type thin-pool --size 500G --poolmetadatasize 4G -n thinpool vg_data |
|---|---|
| 建卷 | lvcreate -V 100G --thin -n vm1_lv vg_data/thinpool |
| 观察 | lvs -a -o +lv_size,data_percent,metadata_percent |
| 超配风险 | Data% 与 Meta% 任一接近上限都会引发故障 |
| 扩容 | lvextend 扩池;元数据与数据可分别扩 |
典型使用场景
- 单机虚拟化宿主上用精简置备承载多台虚机磁盘
- 希望按实际占用而非申请容量消耗物理空间
- 搭配 discard 让删除数据的空间真正释放回池
- 做磁盘模板时快速从精简卷克隆出多份实例
- 容量紧张时用超配提高装机密度
从物理盘到精简卷
从物理盘到精简卷
pvcreate /dev/sdb1 # 初始化物理卷
vgcreate vg_data /dev/sdb1 # 建卷组
lvcreate --type thin-pool --size 500G --poolmetadatasize 4G -n thinpool vg_data
lvcreate -V 100G --thin -n vm1_lv vg_data/thinpool # 建 100G 的精简卷(暂不占满)
lvs -a -o +data_percent,metadata_percent vg_data # 观察两个水位水位观察
| 观察项 | 字段 | 关注点 |
|---|---|---|
| 数据占用 | data_percent | 接近 100% 时池写满,相关虚机 I/O 报错 |
| 元数据占用 | metadata_percent | 同样要盯,写满后池直接不可写 |
| 池容量 | lv_size(thinpool 行) | 物理容量决定超配倍数上限 |
| 精简卷 | lv_size(各卷行) | 虚拟容量,与实际占用不同 |
| 超配倍数 | 虚拟容量总和 / 池容量 | 倍数过高时同时写入会迅速打满 |
精简池超配后必须监控水位:池写满会导致使用该池的虚机 I/O 报错,且恢复需要扩容并处理已有损坏的文件系统。
扩容时的顺序与方式要注意:池的元数据区不能事后无损缩小,扩容元数据用 lvextend --poolmetadatasize,数据区用 lvextend --size,扩容后再跑一次 lvs 确认水位下降。
运维要点
- 把 data_percent 与 metadata_percent 都接入监控并按阈值告警,不要只看其中一项
- 超配倍数要留出冗余,按最坏情况下多台虚机同时写入来估算
- 扩容优先在池接近阈值前完成,池写满后的恢复会涉及文件系统修复
- 定期执行 fstrim 或确保 discard 生效,让删除的数据真正归还池
- 池上承载的虚机不要都在同一时间段做批量写入与备份,避免瞬时打满