很多人收藏过各种“LVM命令大全”,但真正上手干活,光有命令列表根本不够。我做服务器运维这些年,被人问得最多的不是“怎么把LVM装上”,而是“我明明给磁盘扩容了,lvextend 也执行了,怎么 df -h 一点变化都没有”。问题基本都出在没搞清楚 LVM 的层级,以及忽略了“扩逻辑卷”和“扩文件系统”这两步必须分开做。
这篇文章不打算把所有命令都罗列一遍,而是顺着实际使用场景,把最常用的 LVM 命令按“查空间、扩磁盘、建卷、删卷、做快照、故障排查”串起来,每个命令说清楚为什么要这样执行、执行完要验证什么。适合刚接触 Linux 逻辑卷管理的运维新手,也适合已经会敲 lvextend 但偶尔被莫名其妙报错卡住的人。
1. 空间明明加给逻辑卷了,df -h 为什么还是老样子
1.1 用三层结构理解 PV、VG、LV,而不是硬背命令
先说 LVM 的体系,因为命令再多,最后都会落到这三层关系上:
- PV(Physical Volume):物理卷,通俗说就是一块真实磁盘或者磁盘分区,也可以是一个 RAID 设备、云硬盘。
- VG(Volume Group):卷组,相当于把多块 PV 放进一个“存储池”,不直接给用户用,只是中间容器。
- LV(Logical Volume):逻辑卷,从 VG 里切出来的“虚拟分区”,格式化后挂载给系统用。
文件系统跑在 LV 上面,LV 从 VG 里分空间,VG 又建立在 PV 之上。这个结构有点像你想扩充小区的停车位:LV 是划给你家楼下的车位,VG 是整个地库,PV 是真正浇筑出来的混凝土空间。你在 lvextend 时只是把“停车位”划得更大了一点,但如果不告诉物业把画线重新刷一下,外面的标识还是老样子,系统自然认为空间没变。
所以“df -h 没变化”这件事,绝大多数情况下不是操作失败,而是缺少了最后一步:文件系统扩容。命令按照数据方向拆分,应该是:
- 先把新磁盘加入系统,让内核能看到设备。
- 用 pvcreate 把磁盘变成 PV。
- 用 vgextend 把 PV 加入 VG,VG 的空闲空间变多。
- 用 lvextend 把 VG 空闲空间分配给某个 LV。
- 执行 xfs_growfs 或 resize2fs,让文件系统识别到新的容量。
1.2 pvs、vgs、lvs 三个简写命令,现场读法要练熟
LVM 自带两套查询命令:一套是简短版 pvs、vgs、lvs,输出一行一条,适合快速看状态;另一套是详细版 pvdisplay、vgdisplay、lvdisplay,会输出 PE 大小、VG UUID、LV 路径等完整信息。日常排查先敲简短版,需要看细节再敲 display。
vgs 是我敲得最多的命令,因为它直接展示当前卷组剩余空间:
bash复制vgs
输出里 VFree 这一列最有用,表示卷组里还有多少可用空间。如果我想给 root 逻辑卷扩容,但 vgs 显示 VFree 为 0,说明卷组里已经没有空间了,这时候要先加磁盘进 VG,而不是直接 lvextend。
快速查询时的常用组合:
- vgs 看卷组剩余空间,判断是否需要加盘。
- lvs 看逻辑卷当前容量和路径。
- pvs 看物理卷对应哪块设备,确认系统识别到的磁盘有没有被加入 LVM。
详细信息的命令一般用在故障排查和迁移场景:
bash复制pvdisplay
vgdisplay
lvdisplay
注意 display 输出的信息量和包含的字段更多,比如 vgdisplay 会显示 PE Size、Total PE、Free PE,这些在做精确扩容时非常关键。vgdisplay 也是网络热词里频繁出现的命令,很多人在 CentOS 上做 LVM 扩容时都要通过它确认卷组名和剩余 PE。
如果你觉得 pvs/vgs/lvs 简写输出看不懂,一个实用技巧是把每列对应关系记下来:
| 命令 | 关键列 | 现场判断逻辑 |
|---|---|---|
| pvs | PV、VG、PSize、PFree | PV 是否已经被加入 VG,该 PV 上还有多少空间没用 |
| vgs | VG、#PV、#LV、VFree | VG 还剩多少空间,能不能直接扩 LV |
| lvs | LV、VG、LSize | LV 当前多大,路径是否正确 |
把这三个命令当成日常工具而不是“出现问题才查”,你会发现后续所有扩容、删除、迁移操作都会少踩很多坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整的扩容链路:从新磁盘到文件系统认账
2.1 先让系统识别到新磁盘,再谈 pvcreate
很多人跑到 pvcreate 这一步才发现系统里根本没有 /dev/sdb。物理机或虚拟化平台加了一块新硬盘,不会像 U 盘那样每次都能自动刷新出来。如果 fdisk -l 或 lsblk 看不到新盘,可以先扫描 SCSI 总线:
bash复制echo "- - -" > /sys/class/
