dcc4854
@@ -1,3 +1,9 @@ +--- +tags: [lvm, 磁盘, linux] +order: 30 +pinned: true +--- + # Linux LVM 在线扩容 ## 场景
这是 linux/lvm-expand.md 的每次改动内容,按时间从新到旧。其他文章一起提交的部分不会出现在这里。
dcc4854
@@ -1,3 +1,9 @@ +--- +tags: [lvm, 磁盘, linux] +order: 30 +pinned: true +--- + # Linux LVM 在线扩容 ## 场景
3e8c895
new file mode 100644 @@ -0,0 +1,76 @@ +# 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`,虽然有日志也不差这几分钟。