Oamc

Linux LVM 在线扩容

本页目录

场景

/data 快满了,宿主机已经给虚拟机扩了磁盘,需要在业务不停的情况下把空间加进去。

前置条件

  • 文件系统是 XFS 或 ext4
  • 底层用 LVM(lsblk 能看到 vg/lv)
  • 有 root 权限
  • 先确认备份:XFS 只能扩不能缩,resize2fs 缩容有风险

配置

# 1. 看新盘有没有被认出来
lsblk
# 假设多出来的是 /dev/sdb,或者原有 /dev/sda 多了一块分区

# 2. 分区(如果是整块新盘)
parted /dev/sdb --script mklabel gpt
parted /dev/sdb --script mkpart primary xfs 0% 100%
partprobe /dev/sdb
pvcreate /dev/sdb1

# 3. 扩 VG 和 LV
vgextend data_vg /dev/sdb1
lvextend -l +100%FREE /dev/data_vg/data_lv

# 4. 扩文件系统
xfs_growfs /data          # XFS
resize2fs /dev/data_vg/data_lv   # ext4

如果是在原有磁盘上扩了分区:

growpart /dev/sda 3
pvresize /dev/sda3
lvextend -l +100%FREE /dev/data_vg/data_lv
xfs_growfs /data

验证

df -h /data
lvs
vgs

df 里的容量应该和 lvs 报出来的 LV 大小对得上。

回滚

扩容本身不可逆,能做的只有把新加的 PV 摘掉:

pvmove /dev/sdb1
vgreduce data_vg /dev/sdb1
pvremove /dev/sdb1

前提是 LV 里没有数据真的落在这块新盘上。所以扩容前先做快照或备份。

坑

热扩容不等于零风险

在线扩 XFS 是安全的,但 pvcreate/vgextend 打错盘符会直接毁数据。 执行前一定用 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT 对一遍。

  • growpart 报 NOCHANGE 多半是分区表没重读,partprobe 一下。
  • 虚拟机扩完磁盘没重启,lsblk 看不到新容量 —— 需要 echo 1 > /sys/class/block/sda/device/rescan。
  • LVM 元数据有备份在 /etc/lvm/backup/,误删 VG 时能救命。
  • ext4 扩之前可以先 e2fsck -f,虽然有日志也不差这几分钟。