Oamc

Linux LVM 在线扩容 · 修改记录

这是 linux/lvm-expand.md 的每次改动内容,按时间从新到旧。其他文章一起提交的部分不会出现在这里。

#1 2026-10-18 +6 −0 docs: 添加页面元数据(标签/置顶/排序) dcc4854
 @@ -1,3 +1,9 @@
+---
+tags: [lvm, 磁盘, linux]
+order: 30
+pinned: true
+---
+
 # Linux LVM 在线扩容
 ## 场景
#2 2026-10-18 +76 −0 docs: 新建 network/H3C 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`,虽然有日志也不差这几分钟。