阿里云 4 核 8G 的 CentOS 7.9 上一块 4T XFS 数据盘掉电后挂不上,mount 报 Structure needs cleaning,照文档执行 xfs_repair -n 能跑完,去掉 -n 正式修的时候报 cannot open 或 need more space。

一开始怀疑是「修复前还挂着其他同名卷,日志重放针对的设备路径不是报错的那一个」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。xfs_repair 在内存里建一套元数据索引,可用内存不够就直接退出并提示需要更多空间。也可能是坏盘上元数据互相引用着,修复所需的内存远大于空闲块,被误当成磁盘空间不足。

另外,分区上残留着上次未完成的修复标记,工具要求先清掉才肯继续。

只看不写,确认损坏范围和结论

xfs_repair -n /dev/vdb1 2>&1 | tail -30

接着把卷卸干净再动手,避免缓存干扰

umount /data && wipefs -a -n /dev/vdb1

随后加内存选项修复或挂到更大内存的机器上

xfs_repair -m 2048 /dev/vdb1

修完重新挂载并核对可用容量

mount /dev/vdb1 /data && df -h /data

改完先别撤,确认这几项。xfs_repair 退出码为 0 且输出里没有 unfixed 项,mount 挂载成功,df 显示的容量与此前一致,往目录里写文件不报错。

修复期间别用 -L 强清日志,那是拿一致性换启动,能救回来的文件可能一起丢;空间够不够看的是内存,不是 df。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189