LVM(Logical Volume Manager,逻辑卷管理器)是 Linux 下最强大的磁盘管理工具之一。它允许你在不中断服务的情况下调整磁盘分区大小、跨磁盘聚合存储空间、创建快照备份。
这篇文章从最底层的概念讲起,到完整的实战操作。
一、为什么需要 LVM?
传统的物理分区(如 /dev/sda1、/dev/sdb1)有三大痛点:
| 问题 | 传统分区 | LVM |
|---|---|---|
| 扩容难 | 分区满了不能在线扩容 | 可在线扩展,无需停机 |
| 缩容难 | 分区大了不能灵活回收 | 可在线缩小(需先卸载) |
| 跨盘 | 一块分区只能在一个物理盘上 | 一个逻辑卷可以跨多块物理盘 |
典型场景:当初给 /home 分了 100GB,现在用满了。传统分区需要备份 → 删除分区 → 重建分区 → 恢复数据。LVM 只需要一行命令立即扩容。
二、LVM 的核心概念
LVM 在物理磁盘和文件系统之间抽象了三层:
┌────────────────────────────────────────┐
│ 文件系统(ext4 / xfs) │ ← 用户看到和使用的地方
├────────────────────────────────────────┤
│ 逻辑卷(LV - Logical Volume) │ ← 可在线调整大小
├────────────────────────────────────────┤
│ 卷组(VG - Volume Group) │ ← 聚合多个物理盘的空间
├────────────────────────────────────────┤
│ 物理卷(PV - Physical Volume) │ ← 物理磁盘或分区
├────────────────────────────────────────┤
│ /dev/sda /dev/sdb /dev/sdc │ ← 物理磁盘
└────────────────────────────────────────┘物理卷(PV)
物理卷是 LVM 的基本存储单元,可以是整个磁盘、分区或 RAID 阵列。
# 将磁盘初始化为物理卷
pvcreate /dev/sdb /dev/sdc
# 查看物理卷
pvdisplay
pvs # 简洁版卷组(VG)
卷组是一个或多个物理卷的存储池。所有物理卷的空间汇聚到卷组中统一管理。
# 创建卷组
vgcreate myvg /dev/sdb /dev/sdc
# 查看卷组
vgdisplay
vgs逻辑卷(LV)
逻辑卷是从卷组中划分出来的逻辑分区,格式化后就可以挂载使用。
# 创建逻辑卷(大小 50GB)
lvcreate -L 50G -n mylv myvg
# 查看逻辑卷
lvdisplay
lvs
# 格式化并挂载
mkfs.ext4 /dev/myvg/mylv
mount /dev/myvg/mylv /mnt/data物理块(PE - Physical Extent)
PE 是 LVM 的最小存储单元(默认 4MiB)。卷组中的所有空间按 PE 切割,逻辑卷按 PE 数量分配。
卷组 myvg(100GB)
┌──────────────────────────────────────────┐
│ PE │ PE │ PE │ PE │ PE │ PE │ PE │ PE │...│ ← 每个 PE 4MiB
└──────────────────────────────────────────┘
│
├── 逻辑卷 mylv(50GB)= 12800 个 PE
│
└── 剩余空间(50GB)= 12800 个 PE(可分配给其他 LV)三、LVM 实战操练
环境准备
# 模拟两块虚拟磁盘(实际服务器上就是真实磁盘)
# 假设 /dev/sdb 100GB, /dev/sdc 100GB
# 1. 创建 PV
pvcreate /dev/sdb /dev/sdc
# 2. 创建 VG
vgcreate data_vg /dev/sdb /dev/sdc
# 3. 创建 LV(60GB)
lvcreate -L 60G -n data_lv data_vg
# 4. 格式化
mkfs.ext4 /dev/data_vg/data_lv
# 5. 挂载
mkdir -p /mnt/data
mount /dev/data_vg/data_lv /mnt/data
df -h /mnt/data在线扩容 LV
这是 LVM 最常用的功能——不停机扩容。
# 情况:/mnt/data 原来 60GB,现在快满了
# 1. 扩展 LV 到 80GB
lvextend -L 80G /dev/data_vg/data_lv
# 或增加 20GB(两种写法等价)
lvextend -L +20G /dev/data_vg/data_lv
# 2. 扩展文件系统(不同文件系统命令不同)
resize2fs /dev/data_vg/data_lv # ext4
xfs_growfs /mnt/data # xfs(注意参数是挂载点)
# 3. 验证
df -h /mnt/data
lvs跨盘扩容
把新磁盘加入卷组,再扩容逻辑卷:
# 加入新盘 /dev/sdd
pvcreate /dev/sdd
vgextend data_vg /dev/sdd
# 现在卷组有 300GB 空间可用
# 扩容 LV 到 120GB
lvextend -L 120G /dev/data_vg/data_lv
resize2fs /dev/data_vg/data_lv在线缩容 LV(仅 ext4,xfs 不支持)
# 缩容需要先卸载
umount /mnt/data
# 检查文件系统
e2fsck -f /dev/data_vg/data_lv
# 缩小文件系统到 50GB
resize2fs /dev/data_vg/data_lv 50G
# 缩小 LV 到 50GB
lvreduce -L 50G /dev/data_vg/data_lv
# 重新挂载
mount /dev/data_vg/data_lv /mnt/dataxfs 不支持缩容。 这是 xfs 的设计限制,不是 LVM 的问题。生产环境使用 xfs 时,缩容只能通过备份 → 重建 → 恢复的流程。
移除磁盘
如果某块磁盘需要更换(故障或升级),先把数据迁移到卷组其他磁盘上:
# 将 /dev/sdc 上的数据迁移到同一卷组的其他 PV
pvmove /dev/sdc
# 从卷组移除
vgreduce data_vg /dev/sdc
# 移除 PV 标签
pvremove /dev/sdc
# 现在可以安全拔掉 /dev/sdc四、LVM 常用命令速查
| 操作 | 命令 |
|---|---|
| 创建 PV | pvcreate /dev/sdX |
| 查看 PV | pvs 或 pvdisplay |
| 创建 VG | vgcreate vg_name /dev/sdX /dev/sdY |
| 查看 VG | vgs 或 vgdisplay |
| 扩展 VG | vgextend vg_name /dev/sdZ |
| 缩小 VG | vgreduce vg_name /dev/sdX |
| 创建 LV | lvcreate -L 10G -n lv_name vg_name |
| 查看 LV | lvs 或 lvdisplay |
| 扩展 LV | lvextend -L +5G /dev/vg_name/lv_name |
| 缩小 LV | lvreduce -L 5G /dev/vg_name/lv_name |
| 重命名 LV | lvrename vg_name old_name new_name |
| 删除 LV | lvremove /dev/vg_name/lv_name |
| 移动 PE | pvmove /dev/sdX |
五、LVM 的优缺点
优点
| 特性 | 说明 |
|---|---|
| 在线扩容 | 不停机扩展存储空间 |
| 跨盘聚合 | 多块磁盘合并成一个逻辑卷 |
| 快照 | 即时创建卷级快照,用于备份 |
| 条带化 | 数据跨盘分布,提升 I/O 性能 |
| 镜像 | 数据实时复制到多块磁盘 |
| 精简配置 | 按需分配空间,避免预分配浪费 |
缺点
| 限制 | 说明 |
|---|---|
| xfs 不可缩容 | 需要缩容的场景只能用 ext4 |
| 性能开销 | 多一层抽象带来微量 I/O 损耗 |
| 复杂度 | 故障排查比传统分区复杂 |
| 单点 | VG 元数据损坏可能导致整个卷组不可用 |
| 碎片 | 频繁调整可能导致物理碎片 |
六、常见故障排查
LVM 无法激活
# 查看所有卷组状态
vgscan
vgchange -ay # 激活所有卷组
# 查看缺失的 PV
pvscan
# 如果某块磁盘丢失,可以强制激活(有数据风险)
vgchange -ay --partial移除磁盘时提示"PV in use"
# 查看 PV 上分配了哪些 LV
pvdisplay -m /dev/sdc
# 先迁移数据
pvmove /dev/sdc
# 再移除
vgreduce data_vg /dev/sdc
pvremove /dev/sdc卷组空间不足
# 查看卷组剩余空间
vgs
# 扩容:加新盘或回收未使用的 LV
vgextend data_vg /dev/sdd
# 或者删除不用的 LV
lvremove /dev/data_vg/old_lv七、生产环境建议
- 为系统盘单独分区(不要用 LVM 管理
/boot) - 保留 10-20% 卷组余量,应急扩容用
- 使用 LVM 快照前确保有足够的卷组空闲空间
- 监控卷组使用率(
vgs+ 告警),避免空间耗尽 - xfs 配 LVM 时留好缩容方案(备份路径),或者用 ext4
- 重要数据卷加镜像(
lvcreate --type mirror)或依赖 RAID 硬件 - /boot 分区不要放在 LVM 上,部分引导加载器无法识别 LVM