linux磁盘扩容需手动执行三步:先用lsblk或fdisk -l确认物理磁盘扩容,再用growpart扩展分区(要求分区为最后一个且未被lvm/swap占用),最后用resize2fs(ext4)或xfs_growfs(xfs,参数为挂载点)扩展文件系统;lvm环境则需依次执行pvresize、lvextend和文件系统扩容。

Linux 本身不会自动扩容磁盘空间 —— 所有“自动扩容”都是人为配置的脚本或云平台(如 AWS、阿里云)在底层触发的流程,系统内核和文件系统默认不主动扩展。
df -h 显示的容量没变,但云平台说磁盘已扩容
这是最常见误判场景:云厂商后台把块设备(如 /dev/vda)扩容了,但 Linux 内核还没感知到新容量,分区表和文件系统都还停留在旧大小。
- 先确认块设备是否真的变大:
lsblk或fdisk -l /dev/vda—— 如果SIZE列比之前大,说明底层已扩容 - 若
lsblk仍显示旧大小,需手动通知内核重读容量(尤其 KVM/QEMU 虚拟机):echo 1 > /sys/class/block/vda/device/rescan - 之后再运行
lsblk,应能看到/dev/vda容量更新,但其子分区(如/dev/vda2)尺寸不变 —— 这是正常现象,下一步才处理分区
growpart /dev/vda 2 扩容分区失败
growpart 只负责把分区边界推到物理磁盘末尾,它不做文件系统调整,也不保证一定能成功。
- 必须确保目标分区是最后一个分区(如
vda2在vda上排最后),否则会报错cannot grow partition X: not last partition - 如果分区表是 msdos(MBR)且已有 4 个主分区,
growpart无法在不删除分区的前提下扩容 —— 此时得用parted或转 GPT - 执行前确认分区未被占用:
umount /dev/vda2非必需(growpart支持在线操作),但若分区正在做 LVM PV 或 swap,需先停用 - 成功后
lsblk中/dev/vda2的 SIZE 应变大;若没变,检查返回值:echo $?—— 非 0 表示失败
resize2fs 或 xfs_growfs 不生效
这是扩容链最后一环,也是最容易卡住的地方:工具只作用于已挂载或未挂载的文件系统,但前提必须是底层块设备和分区已就绪。
- ext4 系统用
resize2fs /dev/vda2(支持在线 resize,无需 umount) - XFS 系统必须用
xfs_growfs /(注意:参数是挂载点,不是设备名!xfs_growfs /dev/vda2是错的) - 如果提示
cannot grow filesystem on mounted device,通常是因为文件系统类型识别错误,先用df -T /确认类型 - 若
resize2fs报The filesystem is already <size> blocks long</size>,说明分区根本没变大,回退检查growpart步骤
真正容易被忽略的是:LVM 环境下,growpart 和 resize2fs 都不适用 —— 你得走 pvresize → lvextend → resize2fs/xfs_growfs 这条链,而且每步顺序不能错。任何一环遗漏或颠倒,df -h 就永远卡在旧数值上。











