当前位置:首页>Linux>Linux LVM(三):扩容与缩容

Linux LVM(三):扩容与缩容

  • 2026-10-11 05:40:51
Linux LVM(三):扩容与缩容

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

LVM 最爽的特性就是在线调整大小。本篇讲清楚扩、缩容的全部细节,包括 xfs 和 ext4 的差异。当然了,现在的Linux系统也可以通过growpart + resize2fs(ext4)/ xfs_growfs(xfs)实现无损扩容,但还是不如lvm灵活。

一、扩容

1.1 典型流程

┌──────────────────────────┐
│  1. 检查 VG 是否有剩余空间 │
└──────────┬───────────────┘
           ↓
┌──────────────────────────┐
│  2. lvextend 扩 LV        │
└──────────┬───────────────┘
           ↓
┌──────────────────────────┐
│  3. 扩文件系统(FS 级别)│
└──────────────────────────┘

两步必须都做:扩 LV 是扩 device-mapper 层的容量;扩 FS 是让文件系统真正"看到"新空间。

1.2 步骤演示

假设我们有:

$ lvs
  LV      VG      LSize
  lv_demo vg_data 5.00g

VG 还有 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_demo

1.3 一条命令搞定

lvextend 支持 -r 自动调用 FS 扩容:

$ lvextend -L +3G -r /dev/vg_data/lv_demo

-r 会检测文件系统类型自动选择 resize2fs / xfs_growfs / btrfs filesystem resize。生产环境建议加 -r,避免漏步骤。

1.4 VG 没空间怎么办

先扩 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 倍。一旦缩多了,多出来的空间会被立即释放,数据就找不回来了。先做完整备份再做。

2.1 xfs 不支持缩容

xfs 文件系统只能扩不能缩。要缩小 xfs LV 的唯一方法:

备份数据 → 删除 LV → 重建更小的 LV → 还原数据

或者改用 ext4。

2.2 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. 1. 缩 FS 的目标大小必须不小于df 看到的实际数据占用
  2. 2. 缩 FS 时使用的单位要明确(建议带 G)
  3. 3. resize2fs 缩文件系统后不要中途取消,否则 FS 损坏

2.3 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 vs ext4 总结

特性
ext4
xfs
扩容
✅ 在线
✅ 在线
缩容
✅ 离线(需卸载)
❌ 不支持
单个文件最大
16 TiB
8 EiB
单个 FS 最大
1 EiB
8 EiB
默认发行版
Ubuntu/Debian
RHEL/CentOS/openEuler
性能特点
通用
大文件/高并发更优
dump/restore
支持
支持

建议:能选 xfs 优先选 xfs(性能更好),需要缩容时选 ext4。两者都可以在线扩容,所以"扩容能力"不是选型主要考量。

四、文件系统免卸载扩容(ext4)

ext4 实际上可以在线扩容(但缩容必须离线)。如果不想 umount:

$ resize2fs /dev/vg_data/lv_demo

resize2fs 默认检测当前设备大小,自动扩到最大。

xfs 本身就是设计为在线扩容(无在线缩容):

$ xfs_growfs /mnt/lv_demo

五、lvresize:统一命令

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

全程不需要重启,不影响业务。

七、踩坑清单

  1. 1. 忘扩 FS:扩完 LV 后 df 看大小没变。lvextend 和 FS 扩容是两个独立步骤
  2. 2. 扩错方向:用 -L 5G 把 8G 的 LV"扩"成了 5G(实际是缩)。可以加 -f 强制但更推荐明确写 + 号
  3. 3. 缩 FS 时 LV 还在挂载:ext4 缩容时如果不卸载,会损坏 FS
  4. 4. xfs_growfs 用设备路径:xfs 扩 FS 必须用挂载点,不能用 /dev/xxx
  5. 5. resize2fs 漏写目标大小:默认行为是扩到最大,但缩容必须显式指定目标

八、小结

操作
步骤
扩 LV
lvextend -L +XG /dev/vg/lv
 → resize2fs 或 xfs_growfs
缩 LV(ext4)
卸载 → e2fsck → resize2fs XG → lvreduce -L XG
缩 LV(xfs)
不支持,需备份-删除-重建-恢复
一键扩容
lvextend -L +XG -r /dev/vg/lv
VG 扩
vgextend vg /dev/sdX
(先 pvcreate)

黄金口诀:

  • • 扩:先 LV 后 FS
  • • 缩 ext4:先 FS 后 LV
  • • 缩 xfs:不支持
相关阅读:
Linux LVM(一):基础、概念及简单示例
Linux LVM(二):查看与监控

最新文章

随机文章