在一次严重的服务器崩溃后,我无法在 Linux 上挂载 JFS 分区。该jfs_fsck
工具返回
Duplicate block references have been detected in Metadata. CANNOT CONTINUE.
processing terminated: <date> <time> with return code: 10060 exit code: 4.
12TB 分区保存着科学计算的结果,这些结果可以在几周内重现,并且没有备份。不过,我不能排除由于用户疏忽而导致一些不可重现的数据被遗留的可能性。
我恢复分区的计划如下:
- 重放日志并以只读方式挂载分区
- 将可以读取的文件复制到另一个文件系统
- 使用以下方法识别具有重复引用的块
jfs_fsck -v
- 使用以下方法识别这些块对应的 inode:
jfs_debugfs
- 使用以下方法查找与 inode 对应的文件系统对象
find -inum
- 使用
jfs_debugfs
- 再次运行
jfs_fsck
并希望它能够顺利完成
该计划只在步骤 (1) 到 (4) 中奏效。它首先在步骤 (5) 中失败,find
运行几个小时后似乎没有得到一个 inode,而且可能会永远运行下去。在复制文件时,我发现一些目录的 B+ 树变成了带有循环的图,因此目录遍历不会终止并非不可能。
我直接跳到步骤 (6),首先取消链接我能找到损坏结构的目录。但这无助于完成jfs_fsck
运行。然后我删除了除根目录条目之外的所有目录。但jfs_fsck
仍然无法完成。
我想我不仅要编辑目录结构,还要编辑块分配图。但是我找不到用 来做这件事的方法jfs_debugfs
。
是否有工具可以帮助使具有重复块引用的分区易于恢复?
答案1
如果您可以挂载磁盘 R/O,您可能可以尝试复制出您能复制的数据。如果日志已损坏,则可能只有最后几个文件更改丢失。因此,您可以尝试取出文件。
但是,如果文件是数据,您如何知道它是否完全正确或本身是否已被损坏。
当然,日志损坏也可能隐藏着更严重的磁盘问题。
此时,我的想法是,为了确保数据的完整性,您可能必须重新运行模拟。