先把当时的情况摆出来。一台 2014 年装机器的 2T 数据盘用 mkfs.ext4 建的文件系统,云盘扩到 20T 后 resize2fs 报 Filesystem too large,只能用 2T 与 16T 之间的部分。
真正麻烦的地方在于,几个原因的现象几乎一样。ext4 默认的 32 位块号最多描述 16T,超过后必须依赖 64bit 特性。还有一种是早期 sed 版本的 mke2fs 默认关闭 64bit,后续扩容直接被限制。
另外,块大小是 1K 时上限更低,2T 就已经接近边界。少数情况下是文件系统上还有未迁移的元数据特性,resize 前不允许打开新特性。
第一件事是确认当前块大小与特性
dumpe2fs -h /dev/vdb1 | grep -E 'Block size|Filesystem features'
做完整备份再改特性
rsync -aHAX /data/ /backup/data/
接着打开 64bit 特性并检查
tune2fs -O 64bit /dev/vdb1 && e2fsck -f /dev/vdb1
末了分区与文件系统一起扩到新容量
growpart /dev/vdb 1 && resize2fs /dev/vdb1
别只看报错消失,验证要多做一步。dumpe2fs 的特性列表里出现 64bit,resize2fs 执行完成,df -h 显示容量接近 20T 且写入测试正常。
提醒一点。打开 64bit 是不可逆操作,旧内核和旧工具读不了,回滚只能靠备份;1K 块的文件系统在大容量下性能很差,趁迁移重建成 4K 更划算。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
