抢救XFS元数据损坏数据须严格按“保数据>保文件系统结构>保原始状态可追溯性”顺序执行:先停写并用ddrescue制镜像;再xfs_db/xfs_irecover只读提取;最后仅在诊断明确时轻量修复或回溯日志/备份。

遇到 XFS 元数据损坏、xfs_repair 报错时,抢救数据的优先级不是按“先修再拷”,而是严格遵循“保数据 > 保文件系统结构 > 保原始状态可追溯性”的顺序。盲目运行 -L(强制清日志)或 -f(覆盖修复)可能直接抹掉尚可恢复的目录项、inode 或 extent 信息。
1. 立即停止写入并保留原始设备镜像
这是所有后续操作的前提。只要设备仍在挂载或有进程写入,损坏可能扩散,已丢失的元数据块也可能被覆盖。
- 若已挂载,立即执行
umount -f /mount/point;若无法卸载,强制只读重挂:mount -o remount,ro /dev/sdXN - 用
ddrescue制作位对位镜像(比dd更容错):ddrescue -d -r3 /dev/sdXN xfs-disk.img xfs-disk.log - 后续所有修复与恢复操作,必须在镜像上进行,原盘仅归档封存
2. 尝试无损只读提取:xfs_db + xfs_irecover + xfs_find
很多元数据损坏并不影响底层数据块内容,只是目录树断裂或 inode 链接丢失。此时应跳过修复,直取数据。
- 用
xfs_db -r xfs-disk.img进入只读调试模式,检查关键结构:sb 0(超级块)、agf 0(分配组摘要)、agi 0(inode 组摘要)是否可读 - 若 inode 组未全毁,用
xfs_irecover -v -r xfs-disk.img /recovery/dir扫描并重建孤立 inode 的文件名和路径(需内核支持,部分老版本需打补丁) - 配合
xfs_find -i 123456 -n "report.pdf" xfs-disk.img定向定位特定文件的 extent 位置,再用dd按物理偏移提取
3. 有条件尝试轻量修复:避开 -L,用 -n + -v 诊断后分步干预
xfs_repair -n(只读检查)和 -v(详细日志)是唯一安全的修复入口。报错中明确指向 AG、inode、directory block 时,才考虑针对性干预。
- 记录完整错误输出,重点关注 “AG #”, “ino #”, “dir block #” 等定位信息,而非泛泛的 “corruption detected”
- 对单个损坏目录块,可用
xfs_db -x -r xfs-disk.img -c "blockget -n ino 12345"查看其内容,确认是否真不可恢复 - 仅当确认某 AG 的 free space tree 损坏且无重要文件位于该 AG 时,才用
xfs_repair -o ag_stride=... -o ag_stride_shift=... -v xfs-disk.img跳过该 AG 重建
4. 备用通道:从日志、备份 superblock 或外部索引还原
XFS 日志(即使未提交)和多份 superblock 副本常含关键线索,而应用层备份(如 rsync 快照、数据库 WAL、VM 快照)有时比文件系统层更可靠。
- 用
xfs_logprint -t xfs-disk.img查看日志事务,识别最近成功提交的 inode 分配/删除操作,反推文件存在性 - 用
xfs_info xfs-disk.img获取 AG 数量,再用xfs_db -r -c "sb 0" -c "print" xfs-disk.img对比各 AG 的 superblock,找未损坏的副本(通常 AG0、AG1、AGn-1 有备份) - 若系统启用了
xfsdump或使用 LVM 快照/VM 快照,优先挂载快照卷提取,避免依赖当前损坏结构
数据抢救不是靠一次命令解决,而是分层验证、逐级降级:镜像保底 → 只读提取 → 定向修复 → 外部回溯。每一步都应留痕、可逆、可复现。










