如何使用“超级块读取失败”恢复 XFS 文件系统

Kie*_*ran 9 xfs filesystems data-recovery

我有一个来自 Buffalo LinkStation 的磁盘,该磁盘上有一个无法安装的 XFS 分区。

将磁盘插入 Ubuntu 机器上的 SATA->USB 盒。我得到以下信息:

$ sudo fdisk -l /dev/sdb

Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              63      594404      297171   83  Linux
/dev/sdb2          594405     1590434      498015   83  Linux
/dev/sdb4         1590435   976768064   487588815    5  Extended
/dev/sdb5         1590498     1863539      136521   82  Linux swap / Solaris
/dev/sdb6         1863603   976494959   487315678+  83  Linux
Run Code Online (Sandbox Code Playgroud)

问题分区是/dev/sdb6。

$ sudo xfs_check /dev/sdb6
ERROR: The filesystem has valuable metadata changes in a log which needs to
be replayed.  Mount the filesystem to replay the log, and unmount it before
re-running xfs_check.  If you are unable to mount the filesystem, then use
the xfs_repair -L option to destroy the log and attempt a repair.
Note that destroying the log may cause corruption -- please attempt a mount
of the filesystem before doing this.
Run Code Online (Sandbox Code Playgroud)

所以尝试 xfs_repair -L 选项让我陷入无法超越的境地:

$ sudo xfs_repair -L /dev/sdb6
Phase 1 - find and verify superblock...
superblock read failed, offset 382252089344, size 131072, ag 89, rval -1

fatal error -- Input/output error
Run Code Online (Sandbox Code Playgroud)

使用 photorec 我已经能够从该分区中提取一些文件,因此数据在那里并且磁盘在物理上工作。但是,超级块存在问题。

我将如何恢复这个分区?

小智 5

当我今天(大约 9.5 小时前)遇到这个问题时,上面的答案对我没有帮助。我将在这里介绍对我有用的解决方案,以及上一个答案没有帮助的原因。

症状

  1. 无处不在/home,无法保存/编辑中的任何文件等或列出的任何目录。
  2. dmesg显示xfs_do_force_shutdown called了其他一些 xfs 消息。
  3. xfs_repair在第 1 阶段失败,superblock read failed随后是fatal error -- Input/output error
  4. 我的磁盘的其余部分运行完美(包括/,即只是/home不工作)。
  5. 尝试mount会导致superblock cannot be found(或类似的)错误,但没有提示下一步要做什么。

解决方案

解决方案基于这篇文章Nigel Smith,XFS 的主要作者(如果我理解正确的话)。我将在此处重新发布这些步骤,以防之前的链接已过时。以下所有操作都必须root(显然)运行。

  1. 对驱动器进行长时间的自检:smartctl -t long /dev/sda. 可能还要等一下。smartctl -t short /dev/sda如果有一个相对较新的长测试(就像我的情况一样),您也可以运行一个短测试。
  2. 使用以下任一方式检查测试:smartctl -l selftest /dev/sdasmartctl -a /dev/sda(后者显示所有内容,但您需要的信息几乎在最后)。
  3. 测试报告的最后一栏称为LBA_of_first_error。这是磁盘上第一个错误的位置。从最新的测试(将编号为“#1”并位于列表顶部)中,获取显示的数字并将其除以 8 并截断为整数值(参见原帖,了解原因)。
  4. 然后,您将该特定块清零。这将导致该位置的特定文件被破坏。(但是,如果您已经用尽了所有其他方法,那么一些损坏的文件也没什么大不了的。)。为此,请运行以下命令:# dd if=/dev/zero of=/dev/sda conv=sync bs=4096 count=1 seek=*NUMBER_COMPUTED_EARLIER*
  5. 执行一个简短的测试并等待一两分钟的结果。重复此操作,直到短测试不显示任何错误。或者,您可以使用以下命令检查错误块的大致数量smartctl -A /dev/hda | egrep 'Reallocated|Pending|Uncorrectable'在我的情况下,我重复了步骤 1 到 4,直到错误减少到 24。
  6. 运行xfs_repair /dev/sda没有-L标志)。这可能会报告您应该尝试挂载文件系统,因为日志日志错误。
  7. 尝试挂载该系统。就我而言,那失败了,所以我不得不运行xfs_repair -L /dev/sdawhich 删除日志日志(这可能会导致数据被删除)。
  8. 挂载您的文件系统并进行最近的备份!

为什么上述解决方案不再起作用

  • 最初的帖子已经有好几年了。与此同时,XFS 已经发生了足够多的变化,SuSE 团队认为它足够稳定,可以用作/home.
  • xfs_check已经过时,有利于xfs_repair -n.
  • Debian 解决方案既麻烦又浪费时间。到目前为止,Debian支持 UEFI 启动,并且该信息不在他们的下载页面上,也不在他们的主要 FAQ 页面上(在他们的 Wiki 上)。因此,为了使用它启动,您需要在 BIOS 中禁用 UEFI 安全启动,然后在密钥上启动。之后,您会注意到默认情况下没有安装 xfs 工具。所以你apt-get install xfsprogs只会意识到,这是 Debian,他们的“稳定”软件包实际上落后了好几年。长话短说,xfs_repair /dev/sda永远挂着。该进程无法终止(即使使用 sigterm)。
  • UFS Explorer 是付费软件。
  • photorec 仅支持特定的文件类型(对 GPG 密钥说再见)并将具有任意名称的所有文件都恢复到一个文件夹中。祝你好运通过所有这些并找到相关信息。


eww*_*ite 3

XFS 重放错误后,请根据错误消息尝试再次安装分区。

如果一切变得太混乱,我强烈建议下载UFS Explorer以帮助从另一个系统进行深度文件恢复。

  • 在尝试了一些免费的 Linux 工具之后,没有什么比 UFS Explorer 更好的了。虽然价格可能是 40 英镑,但确实有效。谢谢。 (2认同)