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,虽然有日志也不差这几分钟。