磁盘空间不够了怎么办?传统分区要先格式化、数据全没;想换个更大的盘要停机迁移。LVM(Logical Volume Manager,逻辑卷管理) 就是为了解决这些问题而生:它把多块物理磁盘"揉成"一个资源池,分区可以随时在线扩容、缩容、做快照,甚至可以跨磁盘。这篇文章用最简单的方式讲懂 LVM,并给出服务器上最常用的实战操作。
一、LVM 是什么?解决什么问题
传统分区:一块盘 -> 一个分区 -> 一个文件系统,容量写死,满了很难办。
LVM 把存储分成三层:
| 层 | 名称 | 比喻 |
|---|---|---|
| PV | 物理卷(Physical Volume) | 一块块砖头(真实磁盘/分区) |
| VG | 卷组(Volume Group) | 把所有砖头堆成一个大仓库(资源池) |
| LV | 逻辑卷(Logical Volume) | 从仓库里划出来的一块区域(相当于分区) |
你在 LV 上格式化文件系统、挂载使用。以后仓库(VG)里的空间不够,就往里加 PV(新磁盘),然后随时把 LV 扩容——不需要停机,不需要重新格式化,数据不丢。
磁盘 /dev/sdb ─┐
├─ PV ──┐
磁盘 /dev/sdc ─┘ ├─ VG(资源池)── LV ── 挂载到 /data
└─ 剩余空间:随时扩给 LV
二、查看当前的 LVM 状态
新机器可能还没用 LVM,先确认系统里有没有:
pvdisplay # 查看物理卷
vgdisplay # 查看卷组
lvdisplay # 查看逻辑卷
一键总览:
pvs && vgs && lvs
很多 VPS 商家给的数据盘默认已经用 LVM 格式化(比如 /dev/vdb1 属于某个 VG),先跑一遍上面的命令看状态。
三、从零创建一个 LVM 存储
假设有一块新数据盘 /dev/vdb,要把它做成 LVM 并挂载到 /data。
第 1 步:创建 PV 物理卷
pvcreate /dev/vdb
pvs # 确认创建成功
第 2 步:创建 VG 卷组
vgcreate data_vg /dev/vdb
vgs # 卷组 data_vg 已创建
第 3 步:创建 LV 逻辑卷(比如划 80G)
lvcreate -L 80G -n data_lv data_vg
lvs # /dev/data_vg/data_lv
也可以把 VG 剩余空间全部给 LV:
lvcreate -l 100%FREE -n data_lv data_vg
第 4 步:格式化并挂载
mkfs.xfs /dev/data_vg/data_lv # 或 mkfs.ext4
mkdir -p /data
mount /dev/data_vg/data_lv /data
第 5 步:开机自动挂载(写进 /etc/fstab)
echo '/dev/data_vg/data_lv /data xfs defaults 0 0' >> /etc/fstab
mount -a # 验证 fstab 配置无误
注意 fstab 建议写 UUID 更稳妥:
blkid /dev/data_vg/data_lv # 拿到 UUID
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults 0 0
四、磁盘满了,在线扩容 LV(核心场景)
这是 LVM 最常用的场景:/data 快满了,加一块新盘扩上去。
第 1 步:新磁盘加入卷组
pvcreate /dev/vdc # 新盘变 PV
vgextend data_vg /dev/vdc # 加入 data_vg
第 2 步:给 LV 扩容
lvextend -L +50G /dev/data_vg/data_lv # 增加 50G
# 或直接扩到卷组剩余全部
lvextend -l +100%FREE /dev/data_vg/data_lv
第 3 步:让文件系统感知新大小(这步不能漏)
xfs_growfs /data # XFS 文件系统
resize2fs /dev/data_vg/data_lv # ext4 文件系统
df -h # 确认 /data 已变大
整个过程在线完成,服务不用停,数据不丢。
五、缩容 LV(XFS 不支持,ext4 可以)
⚠️ 先警告:XFS 文件系统不能缩容(只能扩)。国内 CentOS 7+ 默认 XFS,如果当初用 mkfs.xfs 格式化的,LV 只能扩不能缩。ext4 可以缩,但必须先卸载:
umount /data
e2fsck -f /dev/data_vg/data_lv # 先检查文件系统
resize2fs /dev/data_vg/data_lv 60G # 文件系统缩到 60G
lvreduce -L 60G /dev/data_vg/data_lv # LV 缩到 60G
mount /dev/data_vg/data_lv /data
缩容有风险,操作前一定备份数据,并且先缩文件系统、再缩 LV,顺序反了会损坏数据。
六、LVM 快照:秒级备份与回滚
LVM 快照可以在秒级"冻结"一个时间点的数据,常用于备份前的一致性保证。
# 给 /data 创建一个 10G 的快照(快照空间按变化量估算)
lvcreate -L 10G -s -n data_snap /dev/data_vg/data_lv
挂载快照查看数据:
mkdir -p /mnt/snap
mount /dev/data_vg/data_snap /mnt/snap
ls /mnt/snap # 这是创建快照那一刻的数据
数据确认无误后删除快照:
umount /mnt/snap
lvremove /dev/data_vg/data_snap
快照很实用:数据库备份前先打快照,保证备份的文件是同一时间点的一致性数据。
七、迁移数据:LV 换到新磁盘
旧盘要换掉,把数据从旧 PV 挪到新 PV 上,全程不影响使用:
pvmove /dev/vdb # 把 /dev/vdb 上的数据移到同卷组的其他 PV
vgreduce data_vg /dev/vdb # 从卷组移除旧 PV
pvremove /dev/vdb # 移除 PV 标记,旧盘可以拔了
八、常见问题排查
1. 扩容后 df -h 没变化
99% 是忘了执行 xfs_growfs / resize2fs,文件系统大小没跟上 LV 大小。
2. 系统提示 Volume group not found
一般是重启后 VG 没有激活:
vgchange -ay
3. 创建 PV 报错 "Device /dev/vdb excluded"
磁盘上已有分区表或旧数据,用 wipefs 清掉再试:
wipefs -a /dev/vdb
pvcreate /dev/vdb
4. lvreduce 后数据丢了?
缩容顺序错(先缩 LV 后缩文件系统)或操作前没备份。再次强调:ext4 缩容必须"先文件系统后 LV"且先备份,XFS 别想着缩。
总结
LVM 是生产服务器管理磁盘的标配技能,核心就三层概念:PV(物理卷)-> VG(卷组)-> LV(逻辑卷)。记住三件套命令 pvcreate / vgcreate / lvcreate,扩容三步走"加 PV、扩 LV、扩文件系统",快照用于备份一致性,迁移用 pvmove。学会 LVM,磁盘扩容和备份从此不再需要停机折腾。


