必须先卸载、强制检查、再resize2fs缩小文件系统,最后lvreduce缩减逻辑卷,顺序不可颠倒;ext4方可缩容,xfs不支持;最小安全尺寸需比已用空间多出数百MB。

不能跳过卸载和文件系统检查,也不能颠倒 resize2fs 和 lvreduce 的顺序——否则大概率丢数据。
确认文件系统类型和挂载状态
先看是不是 ext4,且是否能卸载:
- 运行
df -T /mount/point,输出中Type列必须是ext4;如果是xfs,直接放弃lvreduce,xfs 不支持缩容 - 运行
mount | grep /dev/mapper/xxx或findmnt /mount/point,确认逻辑卷当前是否挂载;若挂载在/、/var等关键路径,无法直接umount,需进单用户模式或使用 rescue 环境 - 用
lvs查目标 LV 当前大小,比如/dev/vg0/lv_data是 30G,你想缩到 20G,那目标值就是 20G
必须离线操作:卸载 + 强制检查 + 缩小文件系统
这三步缺一不可,且顺序固定:
- 执行
umount /dev/vg0/lv_data;失败则说明被进程占用,用lsof +D /mount/point或fuser -vm /mount/point查杀 - 运行
e2fsck -f /dev/vg0/lv_data:强制检查,修复潜在错误;若报错(如 “Superblock checksum does not match”),说明文件系统已损坏,停止操作 - 运行
resize2fs /dev/vg0/lv_data 20G:把文件系统内容压缩进 20G 空间内;注意单位必须是整数 +G/M,不能写20.5G;该命令会自动对齐块边界,无需手动算
执行 lvreduce 并验证
lvreduce 只负责“切掉”底层存储空间,它不碰文件系统数据——所以必须等 resize2fs 完成后才敢动:
- 运行
lvreduce -L 20G /dev/vg0/lv_data;系统会警告“data loss”,输入y确认——前提是前面三步已做完 - 切忌用
-r参数试图自动联动调整文件系统:lvreduce -r对 ext4 无效,它只支持少数旧版文件系统,别信 - 重新挂载:
mount /dev/vg0/lv_data /mnt;再跑df -h /mnt看是否显示 20G 左右可用空间 - 最后补一刀
resize2fs /dev/vg0/lv_data(无参数):让文件系统扩展回 LV 全部空间(可选,仅当你后续还要扩容时有用)
最容易被忽略的是:哪怕你确认了 df 显示文件系统用了不到 15G,也**不能直接设 resize2fs /dev/vg0/lv_data 15G**——因为 ext4 的保留块、inode 表、日志区域等元数据占空间,实际最小安全尺寸得比已用空间多出至少几百 MB。稳妥做法是先缩到 18G,挂载测试后再逐步试探下限。


















