字数 1468,阅读大约需 8 分钟

LVM 最爽的特性就是在线调整大小。本篇讲清楚扩、缩容的全部细节,包括 xfs 和 ext4 的差异。当然了,现在的Linux系统也可以通过growpart + resize2fs(ext4)/ xfs_growfs(xfs)实现无损扩容,但还是不如lvm灵活。
┌──────────────────────────┐
│ 1. 检查 VG 是否有剩余空间 │
└──────────┬───────────────┘
↓
┌──────────────────────────┐
│ 2. lvextend 扩 LV │
└──────────┬───────────────┘
↓
┌──────────────────────────┐
│ 3. 扩文件系统(FS 级别)│
└──────────────────────────┘两步必须都做:扩 LV 是扩 device-mapper 层的容量;扩 FS 是让文件系统真正"看到"新空间。
假设我们有:
$ lvs
LV VG LSize
lv_demo vg_data 5.00gVG 还有 4.99G 剩余,先扩 LV:
# 方式 1:增加 3G
$ lvextend -L +3G /dev/vg_data/lv_demo
Size of logical volume vg_data/lv_demo changed from 5.00 GiB (1280 extents) to 8.00 GiB (2048 extents).
Logical volume vg_data/lv_demo successfully resized.
# 方式 2:扩到(绝对值)8G
$ lvextend -L 8G /dev/vg_data/lv_demo
# 方式 3:扩到 VG 总大小(占满剩余空间)
$ lvextend -l +100%FREE /dev/vg_data/lv_demo注意:
-L后面是绝对值或带 + 的增量;-l是按 LE 数(PE 数)计算。-l 100%FREE是"占满剩余"。
然后扩文件系统:
# ext4
$ resize2fs /dev/vg_data/lv_demo
# xfs(必须指定挂载点,不能用设备路径)
$ xfs_growfs /mnt/lv_demo验证:
$ df -h /mnt/lv_demo
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_demo 8.0G 68M 8.0G 1% /mnt/lv_demolvextend 支持 -r 自动调用 FS 扩容:
$ lvextend -L +3G -r /dev/vg_data/lv_demo-r 会检测文件系统类型自动选择 resize2fs / xfs_growfs / btrfs filesystem resize。生产环境建议加 -r,避免漏步骤。
先扩 VG,再扩 LV:
# 加一块新盘 /dev/sdd
$ pvcreate /dev/sdd
$ vgextend vg_data /dev/sdd
# 此时 VG 多了 /dev/sdd 的空间,再 lvextend
$ lvextend -l +100%FREE /dev/vg_data/lv_demo -r⚠️ 缩容比扩容危险 10 倍。一旦缩多了,多出来的空间会被立即释放,数据就找不回来了。先做完整备份再做。
xfs 文件系统只能扩不能缩。要缩小 xfs LV 的唯一方法:
备份数据 → 删除 LV → 重建更小的 LV → 还原数据或者改用 ext4。
缩容顺序与扩容相反:先缩 FS,再缩 LV。
1. 卸载 LV(必须)
2. 检查 FS
3. resize2fs 缩到目标大小
4. lvreduce 缩 LV
5. 重新挂载步骤演示:把 8G 的 ext4 LV 缩到 5G。
# 1. 卸载
$ umount /mnt/lv_demo
# 2. 检查文件系统(必须先做)
$ e2fsck -f /dev/vg_data/lv_demo
e2fsck 1.46.5 (2021-08-...)
Pass 1: Checking inodes, blocks, and sizes
...
Pass 5: Checking group summary information
/dev/vg_data/lv_demo: 11/524288 files (0.0% non-contiguous), 23456/2097152 blocks
# 3. 缩 FS 到 5G
$ resize2fs /dev/vg_data/lv_demo 5G
resize2fs 1.46.5 (2021-08-...)
Resizing the filesystem on /dev/vg_data/lv_demo to 1310720 (4k) blocks.
The filesystem on /dev/vg_data/lv_demo is now 1310720 (4k) blocks long.
# 4. 缩 LV 到 5G
$ lvreduce -L 5G /dev/vg_data/lv_demo
Size of logical volume vg_data/lv_demo changed from 8.00 GiB to 5.00 GiB.
Logical volume vg_data/lv_demo successfully resized.
# 5. 重新挂载
$ mount /dev/vg_data/lv_demo /mnt/lv_demo关键点:
1. 缩 FS 的目标大小必须不小于 df看到的实际数据占用2. 缩 FS 时使用的单位要明确(建议带 G)3. resize2fs缩文件系统后不要中途取消,否则 FS 损坏
lvreduce 的安全确认lvreduce 默认会让你输入 y 确认破坏性操作:
$ lvreduce -L 5G /dev/vg_data/lv_demo
Size of logical volume vg_data/lv_demo changed from 8.00 GiB to 5.00 GiB.
Do you really want to reduce vg_data/lv_demo? [y/n]: y加 -y 跳过交互(脚本场景慎用)。
建议:能选 xfs 优先选 xfs(性能更好),需要缩容时选 ext4。两者都可以在线扩容,所以"扩容能力"不是选型主要考量。
ext4 实际上可以在线扩容(但缩容必须离线)。如果不想 umount:
$ resize2fs /dev/vg_data/lv_demoresize2fs 默认检测当前设备大小,自动扩到最大。
xfs 本身就是设计为在线扩容(无在线缩容):
$ xfs_growfs /mnt/lv_demolvresize:统一命令lvresize 是 lvextend 和 lvreduce 的"统一接口":
$ lvresize -L +3G /dev/vg_data/lv_demo # 扩
$ lvresize -L -3G /dev/vg_data/lv_demo # 缩
$ lvresize -L 8G /dev/vg_data/lv_demo # 缩或扩到目标
$ lvresize -l +100%FREE /dev/vg_data/lv_demo区别:lvextend 默认拒绝缩容(防止误操作),lvreduce 默认拒绝扩容。lvresize 两者都行。
只是举个栗子,实际请根据自己的环境,切勿生搬硬套^_^
/var 在线扩容 20G# 1. 准备 PV(新盘)
$ pvcreate /dev/sdd
$ vgextend vg_sys /dev/sdd
# 2. 扩 LV(业务文件系统一般是 xfs/ext4)
$ lvextend -L +20G /dev/vg_sys/lv_var -r
# 3. 验证
$ df -h /var
# 4. 看 VG 剩余
$ vgs vg_sys全程不需要重启,不影响业务。
df 看大小没变。lvextend 和 FS 扩容是两个独立步骤-L 5G 把 8G 的 LV"扩"成了 5G(实际是缩)。可以加 -f 强制但更推荐明确写 + 号xfs_growfs 用设备路径:xfs 扩 FS 必须用挂载点,不能用 /dev/xxxresize2fs 漏写目标大小:默认行为是扩到最大,但缩容必须显式指定目标lvextend -L +XG /dev/vg/lvresize2fs 或 xfs_growfs | |
e2fsck → resize2fs XG → lvreduce -L XG | |
lvextend -L +XG -r /dev/vg/lv | |
vgextend vg /dev/sdXpvcreate) |
黄金口诀: