报错是这么冒出来的。CentOS 7.9 上一块 2T 的 xfs 数据盘,非正常断电后挂载报 Structure needs cleaning,按提示跑 xfs_repair 却输出 log has dirty data 和 Please run xfs_repair -L,看到这个参数又不敢直接按。

中间走过弯路,把「之前有人跑过一次 xfs_repair 但中途中断,留下半修状态」当成主因,改完现象没变。

把日志和配置对完,能解释这个现象的基本就这几处。日志里有未提交的事务,repair 默认不动日志所以拒绝继续。少数情况下是断电时正在做元数据更新,日志尾部和头部对不上。

不容易想到的是,分区被别的机器以只读方式挂过,日志状态没同步。

动手时先确认盘确实没被挂载也没被别的进程占用

mount | grep vdc; lsof /dev/vdc

再往下把能读的数据先拷出来

xfs_copy /dev/vdc1 /mnt/bak/vdc1.img

随后清空日志再执行修复

xfs_repair -L /dev/vdc1

修复完成后做一次只读扫描

xfs_repair -n /dev/vdc1

恢复的判定其实很直接。mount /dev/vdc1 能正常挂上,dmesg 里没有 XFS 的 corruption 报错,目录能正常遍历。

-L 会丢掉日志里未落盘的事务,等于放弃最后几秒的写入,业务数据必须先有备份再执行。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189