![低级硬盘分析工具](https://linux22.com/image/485585/%E4%BD%8E%E7%BA%A7%E7%A1%AC%E7%9B%98%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7.png)
我有一个来自 Windows 2008 服务器计算机的 NTFS 驱动器,它有几个坏扇区。
我已在 Linux 中安装了该驱动器。
当我在 /media/hda2/Users/Jason 中执行列表 (ls) 时,它不会提供完整列表,并给出输入/输出错误。但是,即使目录 /media/hda2/Users/Jason/Desktop 没有出现在列表中,我仍然可以通过 cd 转到该目录并检索我的文件。
现在我需要来自 /media/hda2/Users/Jason/???? 的数据,其中 ???? 是一个我记不住的文件夹名称(是的,我试过猜测)。
内核日志告诉我,在扇区 16564040 处发生 I/O 错误,现在我想以低级别的方式查看该区域中的原始数据,希望可以看到一些可以唤起我对神秘目录名称记忆的东西。
我已经尝试过 Spinrite。
我接下来要研究的是 dd_rescure,它与 dd 类似,但在恢复方面更胜一筹,但我对这两者都不熟悉。
有谁知道有什么实用程序可以在最低级别查看磁盘上的数据,或者能帮助我如何使用 dd_rescure 实用程序。或者甚至有完全不同的想法告诉我如何恢复我的文件。
谢谢
答案1
使用ddrescue
。
或者使用其前身dd_rescue
与 相补充dd_rhelp
。
启动光盘。该 CD 是 Linux,包含dd_rescue
)。您将获得一个简单的 shell。在这里您应该使用dd_rhelp
。它是 的 bash 脚本包装器dd_rescue
。引用自其网站:
dd_rhelp 是一个 bash 脚本,它处理由 Kurt Garloff 用 C 编写的非常有用的程序,称为 dd_rescue,它大致充当 dd linux 命令,其特点是当出现读/写错误时不会停止。
这使得 dd_rescue 成为恢复有坏扇区的硬盘的最佳工具。(dd_rescue 可以在以下位置找到:http://www.garloff.de/kurt/linux/ddrescue)
但使用它非常耗时。这就是 dd_rhelp 可以提供帮助的地方。简而言之,dd_rhelp 将对整个磁盘使用 dd_rescue,但它会尝试收集最大有效数据,然后再对大量坏扇区进行长时间尝试。因此,如果您让 dd_rhelp 无限期地工作,它将产生与简单的 dd_rescue 相同的效果。但由于您可能没有这个无限的时间(在某些情况下这确实需要很长时间......),dd_rhelp 会在遇到太多连续坏扇区时跳过它。从长远来看,它将使用 dd_rescue 解析您的所有设备。
您可以随时按 Ctrl-C 并随意重新运行它,它将恢复其工作,因为它依赖于 dd_rescue 创建的日志文件。
此外,正在救援的设备的 ASCII 图片中将显示进度。
用法:
dd_rhelp /dev/yourdrive /mnt/backupdrive/yourdriverescued
答案2
如果驱动器尝试重新映射自身时出现太多硬件 I/O 错误,您可能需要尝试运行驱动器制造商的磁盘测试实用程序。它通常是一个 ISO,您可以将其刻录到 CD 并从中启动。它将让您进行完整的驱动器测试,并在测试过程中检测并尝试重新映射坏扇区。这可能会让您恢复数据,尽管其中一些数据可能已损坏。
答案3
我自己没用过,但有人告诉我 WinHex (http://www.x-ways.net/winhex/index-m.html) 可以处理这样的工作。
我很惊讶没有方便的实用程序来告诉您存储在特定扇区的文件,但是当我寻找时也没有找到。
答案4
大多数持续性读取错误是由于 ECC 代码与数据不匹配,这可能是由于写入时断电触发的。详细的 IO 错误名称应该是类似 ECC 不可纠正错误之类的。否则请忽略本文的其余部分。无法对该扇区上的数据进行任何操作。但是,文件系统块和硬件磁盘驱动器块之间的不匹配可能会阻止您读取完好的周围扇区。当文件系统尝试读取包括坏扇区在内的多个扇区时,它会收到 IO 错误,并且不够智能,无法看到只有一小部分读取请求失败。解决此问题的一种方法是用零覆盖该硬盘扇区。可以使用以下方法完成:
dd if=/dev/zero of=/dev/yourvolume seek=the_sector_number count=1 (如果您的设备有大于 512 字节的块,则使用适当的硬块大小 bs=XXX )。
为了确保您具有正确的扇区号,请首先尝试使用以下命令仅读取故障扇区:
dd if=/dev/yourvolume of=somefile skip=the_sector_number count=1 bs=your_block_size_if_not_512
这样,您就能够读取周围的扇区并确定损坏的块。显然,这是一个非常危险的操作,如果 dd 参数之一出错,可能会导致更多数据丢失。