内核是否识别新容量,需看lsblk中磁盘size是否与云平台配置一致;若不一致,执行echo 1 > /sys/class/block/设备名/device/rescan后重查。

Linux 不会自动识别磁盘扩容后的新增空间,必须手动触发内核重扫描、更新分区表、再扩展文件系统——df -h 显示的容量不变,不代表扩容失败,只是流程卡在了某一步。
怎么确认内核是否已识别新磁盘容量
云盘或虚拟磁盘扩容后,宿主机已增大容量,但 Linux 内核可能还按旧大小看待该设备。关键看 lsblk 输出的磁盘总 SIZE 是否已更新:
- 运行
lsblk,对比NAME列(如vdb)的SIZE与你在云平台/VM设置里配置的容量是否一致 - 如果不一致(比如云平台设为 100G,但
lsblk显示仍是 50G),说明内核未重读:执行echo 1 > /sys/class/block/vdb/device/rescan(把vdb换成你的磁盘名) - 再跑一次
lsblk,若 SIZE 已变大,说明内核已识别;若仍不变,检查是否在云平台真正提交了扩容操作,或是否需要重启实例(极少数老内核或直通 SCSI 设备需重启)
怎么判断分区表是否已占用新增空间
即使磁盘容量变了,如果用了分区(如 /dev/vdb1),而分区大小没变,df -h 依然不会涨。验证方法:
- 用
fdisk -l /dev/vdb(MBR)或gdisk -l /dev/vdb(GPT)查看分区起始/结束扇区和总大小 - 对比分区
End扇区对应的实际字节数,是否接近磁盘总容量(可用blockdev --getsz /dev/vdb算扇区总数) - 若分区
Size明显小于磁盘Size,说明分区没扩展:需用fdisk或growpart扩展分区(注意:growpart /dev/vdb 1更安全,不用手输扇区) - 扩展后必须运行
partprobe /dev/vdb或kpartx -u /dev/vdb,否则内核不认新分区边界
为什么 df -h 还是旧大小?重点查文件系统类型
df -h 显示的是文件系统已用/可用空间,不是底层块设备大小。扩容命令必须匹配实际类型,错用就毫无效果:
- 先确认类型:
df -T /data或blkid /dev/vdb1,看TYPE是ext4还是xfs - ext4:运行
resize2fs /dev/vdb1(挂载或未挂载都可;若提示“needs fsck”,先e2fsck -f /dev/vdb1) - xfs:必须已挂载,且填挂载点路径,不是设备名 —— 错写成
xfs_growfs /dev/vdb1会报错;正确是xfs_growfs /data - LVM:先
lvextend -l +100%FREE /dev/vgname/lvname,再按上述 ext4/xfs 命令扩文件系统
最常被忽略的三件事
很多人卡在最后一步,反复检查命令却没结果,问题往往出在这些细节:
- 误把挂载点当设备名传给
resize2fs(它只接受设备路径,如/dev/vdb1)或把设备名传给xfs_growfs(它只接受挂载点,如/data) - 对 LVM 卷执行
resize2fs时,忘了先lvextend——resize2fs只能利用 LV 已有的空间,不会主动拉伸 LV - 用
fdisk扩分区时,新建分区起始扇区和原分区不一致,导致数据丢失风险;应严格记录并复用原Start扇区值











