扩展LVM磁盘空间

在虚拟化环境中,随着业务增长,磁盘空间不足是常见问题。本文记录在 CentOS 7/8 环境下扩展 LVM 磁盘空间的完整流程。

扩展虚拟机磁盘

首先在虚拟化平台(VMware / KVM / Proxmox 等)上扩大虚拟磁盘容量。以 VMware 为例:

  1. 关闭虚拟机(部分平台支持在线扩容)
  2. 编辑虚拟机设置,将磁盘容量从原来的 50GB 扩展到 100GB
  3. 启动虚拟机

扩展后,操作系统层面不会自动识别新增的空间,需要手动操作。

确认当前磁盘状态

# 查看块设备信息
lsblk

# 查看磁盘分区表
fdisk -l /dev/sda

# 查看PV/VG/LV状态
pvdisplay
vgdisplay
lvdisplay

假设当前磁盘 /dev/sda 有一个分区 /dev/sda1,PV 为 /dev/sda1,VG 名为 centos,LV 名为 root,挂载点为 /。

使用 growpart 扩展分区

growpart 可以在不破坏数据的情况下扩展已有分区,使其占用新增的磁盘空间。

# 安装 cloud-utils-growpart(如果未安装)
yum install -y cloud-utils-growpart

# Debian/Ubuntu 系统使用
sudo apt install cloud-guest-utils

# 扩展分区(磁盘设备 + 分区编号)
growpart /dev/sda 1

执行后可以用 fdisk -l /dev/sda 确认分区大小已扩展。

GPT 分区表:使用 sgdisk 扩展分区

如果磁盘使用 GPT 分区表(常见于 UEFI 启动的系统或 newer 虚拟机),growpart 可能因 GPT 备份表位置问题而失败。此时可以用 sgdisk 手动扩展分区。

# 安装 gdisk(如果未安装)
yum install -y gdisk          # CentOS/RHEL
apt install -y gdisk          # Debian/Ubuntu

# 查看当前分区表
sgdisk -p /dev/sda

# 扩展分区(将分区 1 扩展到磁盘末尾)
sgdisk -e /dev/sda            # 修正 GPT 表尾位置
sgdisk -d 1 /dev/sda          # 删除分区 1
sgdisk -n 1:0:0 /dev/sda      # 重新创建分区 1(0 表示从起始到末尾)
sgdisk -c 1 "Primary" /dev/sda # 设置分区标签
partprobe /dev/sda            # 通知内核重读分区表

注意:sgdisk -d + -n 的方式会重新创建分区条目,分区编号和起止扇区保持不变,不会破坏数据。但操作前建议先备份重要数据。

扩展后同样用 fdisk -l /dev/sda 或 sgdisk -p /dev/sda 确认分区大小。

扩展 LVM 物理卷和逻辑卷

# 让LVM识别扩展后的PV
pvresize /dev/sda1

# 查看VG可用空间
vgdisplay centos | grep "Free"

# 将所有可用空间扩展到LV
lvextend -l +100%FREE /dev/centos/root

# 或者指定具体大小
lvextend -L +50G /dev/centos/root

扩展文件系统

逻辑卷扩展后,还需要扩展文件系统才能实际使用新增空间。

XFS 文件系统(CentOS 7 默认)

xfs_growfs /

注意:XFS 只支持扩容,不支持缩容。xfs_growfs 后面跟的是挂载点,不是设备路径。

ext4 文件系统

resize2fs /dev/centos/root

验证结果

df -h /

此时应该能看到文件系统容量已扩展到目标大小。

总结

整个流程可归纳为以下四步:

  1. 在虚拟化平台扩展虚拟磁盘
  2. growpart(MBR)或 sgdisk(GPT)扩展分区
  3. pvresize + lvextend 扩展 PV 和 LV
  4. xfs_growfs / resize2fs 扩展文件系统

常见问题

Q: growpart 报错 “NOCHANGE: partition 1 is size XXXXX it cannot be grown”

这说明分区已经是磁盘末尾且无法扩展,或者分区表类型不支持。检查是否已经扩展到最大,或者考虑新增分区后创建新的 PV 加入 VG。

Q: growpart 在 GPT 分区表上报错怎么办?

GPT 分区表在磁盘末尾有备份表,growpart 可能因备份表位置问题失败。改用 sgdisk 扩展分区:sgdisk -e /dev/sda 修正 GPT 表尾 → sgdisk -d 1 /dev/sda 删除分区 → sgdisk -n 1:0:0 /dev/sda 重新创建 → partprobe /dev/sda。分区数据不受影响。

Q: pvresize 报错 “Device /dev/sda1 not found”

分区可能没有被内核重新识别,执行 partprobe /dev/sda 后重试。

Q: 能否在线操作?

以上所有步骤均支持在线操作(不重启、不卸载),前提是虚拟化平台支持在线扩容磁盘。