xfs 元数据损坏 xfs_repair 报错后的数据抢救优先级顺序

11次阅读

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

xfs 元数据损坏 xfs_repair 报错后的数据抢救优先级顺序

遇到 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 快照,优先挂载快照卷提取,避免依赖当前损坏结构

数据抢救不是靠一次命令解决,而是分层验证、逐级降级:镜像保底 → 只读提取 → 定向修复 → 外部回溯。每一步都应留痕、可逆、可复现。

text=ZqhQzanResources