问题出现得很突然,日志倒是留得挺全。业务写入报 Structure needs cleaning,dmesg 里文件系统打印 Corruption detected 和具体 inode 号,分区能挂载但部分文件读不了。

这类报错背后常见的原因有几处,逐个排除就行。掉电时日志回放不完整,元数据只写了一半。还有一种是云盘底层返回的块内容与校验值不符。

不容易想到的是,内存故障导致脏页写回时把数据写错了。

第一件事是看具体损坏的 inode 和类型

dmesg -T | grep -i xfs | tail -20

卸载后先做只读检查

xfs_repair -n /dev/vdb1

随后备份可读数据后正式修复

xfs_repair /dev/vdb1

剩下的就是挂载并核对文件数量

mount /dev/vdb1 /data && ls /data | wc -l

怎么算真的好了,看的是同一批现象。修复工具跑完输出 done,挂载后 dmesg 不再出现损坏提示,业务写入恢复正常。

容易忽略的是,不带检查参数直接跑修复会改元数据,动手之前把超级块附近备份一份;修完还要抽查文件内容是否完整。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189