lvcreate是创建逻辑卷的唯一入口命令,但直接执行lvcreate -l 10g -n mylv myvg可能失败,原因包括卷组无足够连续pe、名称冲突、pe碎片化或分配策略限制;-l按字节指定(自动向上取整到pe边界),-l按pe数量指定(精确可控),二者不可混用;创建后需确认设备路径就绪(推荐用lvs -o +lv_path获取)、格式化后再挂载,且须注意文件系统最小容量要求及lv名称中下划线在/dev/mapper/下的转义规则。

lvcreate 是创建逻辑卷的唯一入口命令,但直接敲 lvcreate -L 10G -n mylv myvg 很可能失败——不是语法错,而是卷组里没空间、名字冲突、或 PE 不够用。
为什么 lvcreate 报 “No space left” 却 vgs 显示有空闲?
常见假象:卷组总空间充足,但实际可分配的 PE(Physical Extent)被碎片化或预留策略卡住。
-
vgs显示的Free PE / Size是理论值,不等于能一次性分配出连续 PE 块 - 如果卷组启用了
allocation policy(如cling或normal),且已有 LV 分布在多个 PV 上,新 LV 可能因“必须和某 PV 对齐”而无法创建 - 某些旧版 LVM 默认禁用
mirror或raid相关元数据区域,也会悄悄吃掉几 MB 空间
验证真实可用性:运行 vgdisplay -v myvg | grep "Free PE",再加 grep -A5 "Allocatable" 看是否为 yes。
lvcreate 的两种大小指定方式:-L 和 -l,别混用
用 -L 指定字节单位(如 -L 5G)最直观,但 LVM 实际按 PE 对齐——最终大小会向上取整到最近的 PE 边界(默认 4MiB)。比如你写 -L 10M,结果可能是 12MiB。
用 -l 指定 PE 数量(如 -l 2560)则完全可控,适合需要精确容量或做自动化脚本时使用。
- 查当前卷组 PE 大小:
vgdisplay myvg | grep "PE Size" - 查剩余可用 PE 数:
vgdisplay myvg | grep "Free PE" - 强制按 PE 创建:
lvcreate -l 2560 -n mylv myvg
注意:-L 和 -l 不能同时出现,否则报错 Cannot use both -L and -l。
创建后立即格式化前,必须确认设备路径是否就绪
lvcreate 返回成功,不代表 /dev/myvg/mylv 或 /dev/mapper/myvg-mylv 已出现在文件系统中。内核有时延迟加载设备节点,尤其在较老内核(如 RHEL 7.6 之前)或 multipath 环境下。
- 等 1–2 秒后执行
ls /dev/myvg/或ls /dev/mapper/ | grep mylv - 若仍无设备,手动触发:
vgscan --cache+lvscan - 更稳妥做法:用
lvs -o +lv_path myvg/mylv获取准确路径,它始终返回已就绪的设备名
跳过这步直接 mkfs,可能误格式化错设备(比如写到 /dev/sdb 而非 /dev/myvg/mylv),数据全丢。
挂载前漏掉的一步:检查文件系统兼容性
LV 本身只是块设备,不带文件系统。但不同文件系统对 LV 大小有隐含要求:
-
ext4在 LV 小于 ~100MiB 时可能拒绝格式化(提示size too small for filesystem) -
xfs要求 LV 至少 4MiB,但若小于 1GiB,建议加-d agcount=1避免默认分 4 个 allocation group 导致浪费 - 若后续要支持快照,
ext4必须启用filetype和has_journal特性(mkfs.ext4 -O filetype,has_journal)
最易被忽略的是:LV 名称含下划线(_)时,/dev/mapper/ 下对应设备名会把 _ 替换为 --(如 my_lv → my--lv),脚本里硬写路径极易出错。











