Linux 中 LVM 详解

2025-10-15 Linux 运维

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/data

xfs 不支持缩容。 这是 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

七、生产环境建议

  1. 为系统盘单独分区(不要用 LVM 管理 /boot)
  2. 保留 10-20% 卷组余量,应急扩容用
  3. 使用 LVM 快照前确保有足够的卷组空闲空间
  4. 监控卷组使用率(vgs + 告警),避免空间耗尽
  5. xfs 配 LVM 时留好缩容方案(备份路径),或者用 ext4
  6. 重要数据卷加镜像(lvcreate --type mirror)或依赖 RAID 硬件
  7. /boot 分区不要放在 LVM 上,部分引导加载器无法识别 LVM