LVM 逻辑卷管理详解:PV/VG/LV 三件套、在线扩容缩容、快照与迁移实战


磁盘空间不够了怎么办?传统分区要先格式化、数据全没;想换个更大的盘要停机迁移。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,磁盘扩容和备份从此不再需要停机折腾。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

MongoDB 安装与基础操作教程:集合、增删改查、索引、备份恢复与远程连接实战

rsync 命令详解与实战:增量同步、断点续传、免密配置与实时备份方案

评 论
更换验证码