xfs_db 是只读调试工具,不能修复 XFS 元数据损坏,真正修复须用 xfs_repair;安全操作顺序为确认→备份→验证→修复→校验,且全程需在文件系统卸载状态下执行。

修复 XFS 元数据损坏时,xfs_db 本身是只读调试工具,**不能直接用于修复**;真正执行修复的是 xfs_repair。误用 xfs_db 写入操作极可能导致二次损坏。最安全的操作顺序必须以“确认 → 备份 → 验证 → 修复 → 校验”为逻辑主线,且所有操作均需在文件系统未挂载(unmounted)状态下进行。
1. 确认损坏现象并卸载文件系统
不要在已挂载的 XFS 上做任何修复尝试。先通过 dmesg 或 /var/log/messages 查看内核日志中是否有 "XFS: metadata corruption detected" 类报错。使用 mount | grep xfs 确认目标设备未被挂载。若已挂载,强制卸载:
umount -f /dev/xxx(如 /dev/sdb1)。若卸载失败,说明有进程正在使用,用 lsof + fuser 定位并终止。
2. 对底层块设备做完整镜像备份
这是不可跳过的一步。即使损坏轻微,xfs_repair 的 -L(清日志)或 -n(模拟)也可能改变元数据布局。使用 dd 或 ddrescue 创建位级备份:
- dd if=/dev/sdb1 of=/backup/sdb1.img bs=1M conv=noerror,sync
- 更稳妥可选:ddrescue -d -r3 /dev/sdb1 /backup/sdb1.img /backup/sdb1.log
3. 使用 xfs_db 只读诊断,不写入
仅用 xfs_db 查看结构、定位问题区域,严禁使用 write、set、crc 等修改命令:
- xfs_db -r /dev/sdb1(-r 表示只读模式)
- 常用只读检查:sb 0(读超级块)、agi 0(读 AGI)、agf 0(读 AGF)、print(显示当前对象)、check(轻量校验,不修复)
- 若发现 AGF 中 freeblks 不一致,或 ino 无法读取,说明 AG 级元数据异常,需进入下一步修复
4. 运行 xfs_repair 并严格控制参数
修复必须由 xfs_repair 执行,且优先尝试无损选项:
- 先试模拟运行:xfs_repair -n /dev/sdb1(不写入,报告将做什么)
- 若模拟通过,再真实修复:xfs_repair /dev/sdb1
- 仅当日志损坏且无法重放时,才考虑 xfs_repair -L /dev/sdb1(-L 会清除日志并丢弃未提交事务,慎用)
- 绝对避免使用 -Y、-m、-t 等非常规参数,除非明确理解其副作用
5. 修复后挂载验证与一致性抽查
修复完成后,重新挂载并快速验证关键功能:
- mount /dev/sdb1 /mnt/test
- 检查目录可遍历:ls -l /mnt/test | head
- 抽查几个大文件 md5sum 是否与备份前一致(如有记录)
- 运行 xfs_info /mnt/test 确认 AG 数、块大小等基础参数未异常变更









