如果你刚接触 LVM,别怕——把它想象成 “存储乐高”。
硬盘是散装的积木,LVM 能让你随时把它们拼在一起、切出任意大小的空间,还能不停机扩容。
一、先搞懂 3 个核心部件(配乐高类比)
| 部件 | 全称 | 乐高类比 | 作用 |
|---|---|---|---|
| PV | 物理卷 | 单块积木 | 把一块硬盘或分区变成 LVM 可用的“原材料” |
| VG | 卷组 | 积木池(大箱子) | 把多块 PV 积木扔进一个大箱子,变成共享仓库 |
| LV | 逻辑卷 | 从箱子里取出的积木块 | 从 VG 仓库里划分出一块空间,格式化后就能挂载使用 |
它们的层级关系: 物理硬盘 → PV → VG → LV → 格式化(ext4/xfs) → 挂载到目录
一个具体例子:
硬盘 /dev/sda + 硬盘 /dev/sdb
↓ ↓
PV(/dev/sda) PV(/dev/sdb)
└──────┬──────────┘
↓
VG (名为 myvg)
┌──────┴──────┐
↓ ↓
LV(root) LV(home)
10GB 20GB
↓ ↓
格式化ext4 格式化xfs
↓ ↓
挂载到 / 挂载到 /home关键理解:
- 你不能直接使用 PV 存文件,它只是半成品。
- VG 只是一个“容量池”,不直接占用空间,空间存在 PV 里。
- LV 才是你最终能读写文件的“虚拟分区”。
二、新手必须掌握的查询命令(看一眼就懂)
1. 查看所有硬盘和分区(包括新加的硬盘)
lsblk # 树形显示,LVM 卷会用 lvm 标记示例输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
└─vg0-root 253:0 0 30G 0 lvm /
sdb 8:16 0 20G 0 disk ← 新加的硬盘,还没有使用2. 查看 PV、VG、LV 的简洁信息(最常用)
pvs # 列出所有物理卷
vgs # 列出所有卷组(重点看 VFree 空闲空间)
lvs # 列出所有逻辑卷3. 查看详细信息(调试时用)
pvdisplay
vgdisplay
lvdisplay4. 查看文件系统类型和挂载点
df -hT # 显示所有挂载的文件系统及其类型(ext4/xfs)💡 习惯养成:任何操作前,先执行vgs看 VG 有无空闲空间;执行df -hT看目标 LV 的文件系统类型。
三、扩容(重点:不停机,在线完成)
扩容分为两种情况:
- 情况A:VG 里还有空闲空间 → 直接扩 LV 和文件系统(最简单)。
- 情况B:VG 空间不够了 → 先加新硬盘 → 扩展 VG → 再扩 LV(本文重点)。
情况A:VG 已有空闲空间(直接扩容)
示例:把 /dev/myvg/data 从 10G 扩大到 15G。
# 1. 确认当前 VG 有空闲空间
vgs
# 输出示例: VG #PV #LV #SN Attr VSize VFree
# myvg 2 2 0 wz--n- 29.99g 5.00g ← 空闲 5GB,足够
# 2. 扩展逻辑卷(增加 5GB)
lvextend -L +5G /dev/myvg/data
# 3. 扩展文件系统(关键!很多人忘记这步)
# 先检查文件系统类型
df -hT /dev/myvg/data
# 如果是 ext4:
resize2fs /dev/myvg/data
# 如果是 xfs:
xfs_growfs /mount/point # 注意:xfs 后面必须跟挂载点,如 /mnt/data
# 4. 验证
df -h /dev/myvg/data情况B:新加一块硬盘来扩容(详细步骤)
场景:原来的 VG myvg 已经满了(VFree 为 0),你给虚拟机/物理机加了一块 20GB 的新硬盘 /dev/sdb。
步骤1:确认新硬盘被系统识别
lsblk
# 你应该能看到 sdb,大小 20G,没有分区,没有挂载点步骤2:将新硬盘初始化为 PV(物理卷)
# 方式一:使用整个硬盘(推荐新手,简单)
pvcreate /dev/sdb
# 方式二:先分区再创建 PV(用于需要多个分区时,新手先跳过)
# fdisk /dev/sdb 创建一个分区 /dev/sdb1,然后 pvcreate /dev/sdb1执行后可以用 pvs 查看,应该能看到新的 PV /dev/sdb。
步骤3:把新 PV 加入现有的 VG
vgextend myvg /dev/sdb
# 执行后,myvg 的 VFree 就会增加 20GB(可用 vgs 确认)步骤4:扩展逻辑卷(比如想给 /dev/myvg/data 增加 15GB)
lvextend -L +15G /dev/myvg/data
# 或者直接指定最终大小: lvextend -L 35G /dev/myvg/data步骤5:扩展文件系统(与情况A相同)
# 查看文件系统类型
df -hT /dev/myvg/data
# ext4:
resize2fs /dev/myvg/data
# xfs:
xfs_growfs /mount/point # 替换为实际挂载点步骤6:验证
df -h /dev/myvg/data # 容量已经增加
lsblk # 查看关联关系🎉 至此,新硬盘的容量已经无缝加入并使用,全程不需要重启,不需要卸载目录。
四、缩容(高风险,慎入)
⚠️ 缩容很容易造成数据损坏,除非你非常清楚后果,否则不要在生产环境操作。
xfs 文件系统完全不能缩容! 以下仅适用于 ext4。
完整缩容步骤(以从 15G 缩回 10G 为例)
# 0. 备份数据!!!(这是救命稻草)
rsync -av /mnt/data/ /backup/data/
# 1. 卸载逻辑卷(缩容必须卸载)
umount /mnt/data
# 2. 强制检查文件系统(必须做,否则可能损坏)
e2fsck -f /dev/myvg/data
# 3. 先缩小文件系统到目标大小(10G)
resize2fs /dev/myvg/data 10G
# 4. 再缩小逻辑卷到相同大小(顺序不可颠倒)
lvreduce -L 10G /dev/myvg/data
# 5. 重新挂载并检查
mount /dev/myvg/data /mnt/data
df -h /mnt/data为什么顺序不能错?
- 如果先缩 LV,文件系统不知道尾部空间已被收回,再去读写就可能截断数据 → 文件系统损坏。
- 所以必须 先通知文件系统缩小(resize2fs),再缩小 LV。
五、新手最容易踩的 5 个坑(避坑指南)
| 坑 | 现象 | 解决办法 |
|---|---|---|
| 只扩 LV,忘了扩文件系统 | lvextend 成功了,df 看容量没变 | 执行 resize2fs 或 xfs_growfs |
| xfs 缩容 | 执行 lvreduce 后文件系统崩溃 | 牢记:xfs 不能缩容,只能扩 |
| 新加的硬盘没创建 PV 就直接 vgextend | vgextend 报错“设备不是物理卷” | 先 pvcreate /dev/sdb |
| 缩容前不备份、不 e2fsck | 数据丢失 | 严格按照备份→卸载→e2fsck→resize2fs→lvreduce |
| 用错 xfs_growfs 参数 | 报错“is not a mounted mount point” | 参数必须是挂载点(如 /mnt/data),不是设备路径 |
六、总结(一张图记住 LVM)
新硬盘 旧硬盘
↓ ↓
pvcreate → PV ──→ PV ←─ pvcreate
↓ ↓
vgextend
↓
VG
↓
lvcreate / lvextend
↓
LV
↓
mkfs.ext4 / mkfs.xfs
↓
mount 挂载
↓
日常使用日常运维口诀:
- 查空间:
vgs、lvs、df -hT - 扩空间:加硬盘 →
pvcreate→vgextend→lvextend→resize2fs或xfs_growfs - 缩空间:除非必要,否则别碰;ext4 可缩,xfs 不行,且必须备份+卸载+检查。
希望这份指南能帮你彻底搞懂 LVM。如果有任何步骤卡住,执行 man lvm 或留言交流!