CentOS6.9中创建thin pool时元数据占用双倍空间的原因是什么?
嘿,这个问题其实是对LVM Thin Pool空间分配逻辑的常见误解,我来结合你的操作一步步给你掰明白:
先搞懂核心:Thin Pool是“两部分组成”的
LVM的Thin Pool不是一个单一的逻辑卷,它是由两个独立的LV拼起来的:
- 数据LV:实打实存你业务数据的地方,你用
-L或者-l指定的大小就是给它的 - 元数据LV:专门用来记录瘦卷的分配、映射关系的“账本”,
--poolmetadatasize就是给这个账本的空间
这俩都会吃VG里的剩余空间,重点是:-L参数只管数据LV的大小,不管总空间——这就是你觉得“元数据占双倍”的根源。
对应你的三次操作逐一分析
1. 第一次创建失败:lvcreate -T vg/pool -L 30G --poolmetadatasize 2G
你的VG剩32G,算下来30G数据+2G元数据刚好32G,但为啥提示空间不够?
大概率是LVM的PE(物理扩展)对齐或者预留空间搞的鬼:
- 元数据LV的大小会自动向上对齐到最近的PE边界,比如如果你的PE是4M还好,但要是PE更大,或者VG里有一点点空间碎片,总需求就会超32G;
- 另外LVM默认会留一点点空间应急,也可能导致刚好差那么一点。
2. 第二次创建成功但占了31G:lvcreate -T vg/pool -L 30G --poolmetadatasize 512M
你指定元数据要512M,但最终总占用31G?这十有八九是元数据LV被自动对齐到PE大小的整数倍了。比如如果你的VG的PE大小是1G(有些环境会调大PE),512M不够一个PE,就会自动往上凑到1G,这样30G+1G=31G,刚好和你看到的一致。
你可以跑vgdisplay vg看PE大小,再用lvdisplay vg/pool_meta看实际分配的元数据LV大小,一查就明白。
3. 第三次创建成功但池只有28G:lvcreate -T vg/pool -l 100%FREE --poolmetadatasize 2G
这里-l 100%FREE的意思是:先把元数据需要的2G留出来,剩下的空间全给数据LV。但你的VG明明剩32G,为啥最后数据LV是28G?
这应该是LVM的默认预留空间在搞事——LVM会给VG预留5%的空间用来处理紧急情况,32G的5%大概是1.6G,近似2G,所以实际能用的空间是32G-2G(预留)=30G,再扣掉2G元数据,数据LV就剩28G了,28+2=30G刚好是可用空间。
你跑vgdisplay vg看VG Reserved PE / Size就能确认这个预留的大小。
总结:根本没有“双倍占用”,只是你理解错了参数逻辑
你觉得元数据占了双倍空间,其实是把“数据LV的大小”当成了“Thin Pool的总占用空间”。Thin Pool的总占用是数据LV大小 + 元数据LV大小,-L只控制数据部分。要是想让Thin Pool刚好占满VG剩余空间,可以用-l 100%FREE同时让LVM自动算元数据大小(或者先调整VG的预留空间)。
内容的提问来源于stack exchange,提问作者Sraw

