# Linux LVM 在线扩容 ## 场景 `/data` 快满了,宿主机已经给虚拟机扩了磁盘,需要在业务不停的情况下把空间加进去。 ## 前置条件 - 文件系统是 XFS 或 ext4 - 底层用 LVM(`lsblk` 能看到 `vg`/`lv`) - 有 root 权限 - **先确认备份**:XFS 只能扩不能缩,`resize2fs` 缩容有风险 ## 配置 ```bash # 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 ``` 如果是在原有磁盘上扩了分区: ```bash growpart /dev/sda 3 pvresize /dev/sda3 lvextend -l +100%FREE /dev/data_vg/data_lv xfs_growfs /data ``` ## 验证 ```bash df -h /data lvs vgs ``` `df` 里的容量应该和 `lvs` 报出来的 LV 大小对得上。 ## 回滚 扩容本身**不可逆**,能做的只有把新加的 PV 摘掉: ```bash pvmove /dev/sdb1 vgreduce data_vg /dev/sdb1 pvremove /dev/sdb1 ``` 前提是 LV 里没有数据真的落在这块新盘上。**所以扩容前先做快照或备份。** ## 坑 !!! note "热扩容不等于零风险" 在线扩 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`,虽然有日志也不差这几分钟。