我曾经遇到过硬盘故障,并设法使用 GNU 的 从磁盘(1TB)中恢复了一些数据ddrescue
。磁盘的最后 800GB 完好无损,没有任何错误,但在前 200GB 中,整个区域分布着近 14000 个错误(坏块)。ddrescue
创建一个描述坏块位置的日志文件。
ddrescue
命令行参数:
ddrescue /dev/sdb /dev/sdd /mnt/sdc1/sdb.log -r -1 -f -d -v
日志文件如下所示:
# pos size status
0x00000000 0x1C08CE00 +
0x1C08CE00 0x00000200 -
0x1C08D000 0x011E6800 +
0x1D273800 0x00000200 -
0x1D273A00 0x005EC000 +
0x1D85FA00 0x00000200 -
... ... ...
加号 (+) 表示连续的良好空间,减号 (-) 表示不可读空间;位置和大小以十六进制表示。删除以“+”结尾的行后,我有一个包含坏块位置的列表,但我需要一种方法将这些坏块与文件系统(顺便说一下,是 NTFS)上的文件关联起来。
我知道我可以用类似磁盘资源管理器手动执行此操作,但这将是地狱有 14000 个扇区。那么,有没有一种或多或少自动化且优雅的方式来做到这一点?
答案1
自从这个问题大获成功以来,我一直没有答案,如果有的话。但我继续研究,发现了一个微软实用程序,可以追溯到 1999 年,名为 nfi.exe,它是用于 Windows NT 4 和 2000 的 OEM 支持工具第 3 阶段服务版本 2。该实用程序完全满足了我的需求,接收一个扇区并返回一个文件。但它对单个扇区执行此操作,因此我必须创建一个脚本来自动化该过程。这是一个 Python (2.7+) 脚本,其工作方式如下:
它接收 ddrescue 日志文件作为输入,对其进行解析,为文件中的每个扇区调用 nfi.exe,并按字母顺序生成文件列表。
>sector_correlator.py -h
usage: sector_correlator.py [-h] [-v] [-n \path\to\nfi.exe] [-V] [-L]
logfile nt-device-path output file
Receives a list of sectors and returns a list of files which resides in them.
positional arguments:
logfile path to ddrescue's logfile.
nt-device-path NT-style path to physical device, like
\device\harddisk1\dr1
output file filelist output file name
optional arguments:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-n \path\to\nfi.exe nfi.exe's path, if not speciified, assumes's it is in
the same path as the script
-V enables verbose mode
-L save nfi.exe's output log to nfi_raw.log
例子:
sector_correlator.py sdb.log \devices\harddisk0\dr0 filelist.txt
其中:sdb.log 是 ddrescue 的日志,
\device\harddisk0\dr0 是硬盘的 NT 样式路径(您可以使用名为程序运行对象和磁盘管理实用程序)
filelist.txt 是您想要的文件列表。它看起来如下:
\Documents\Downloads\Evernote_4.5.1.5432.exe
\Documents\Downloads\Programs\Apophysis207SE.exe
\Documents\Downloads\Programs\GetGnuWin32-0.6.21.exe
\Documents\Downloads\Programs\mbam-setup.exe
\Documents\Downloads\Programs\msnbackup133.exe
\Documents\Downloads\Programs\x64Components_v254.exe
脚本上的其他参数是可选的,当您使用 -h 运行它时会对其进行解释。默认情况下,脚本假定 nfi.exe 位于同一目录中,如果不是,请使用 -n pathtonfi.exe。
最后,这里是脚本的链接:扇区相关器.py
它非常简陋并且没有错误处理功能,但是可以完成工作。
答案2
这更像是对答案 (#1) 的补充,基于我尝试检查故障驱动器。1) 您仍然可以获取 nfi.exe 并使用它(至少在 winxp 上)。您可以下载上面答案 #1 中链接的 MS 页面中列出的文件 oem3sr2.zip。
我发现,使用当前版本的 nfi.exe,您不需要挖掘驱动器路径。一个简单的驱动器号就可以了……例如“K:”
python sector_correlator.py badsectors.log k: badfiles.txt
但是(我擅长 perl,所以不要对我的 python 理解抱有太大期望),在我看来,该脚本每行仅检查一个与 '-' 匹配的块。因此,如果日志文件报告了 200 个连续的坏块(日志文件行的第二个数字),则该脚本尚未检查最后 199 个块是否存在不同的文件关联。
在 Linux 中你可以使用ddrescuelog -l- badsectors.log展开以显示所有坏块。不幸的是,我不明白为什么,Ubuntu 的 ddrescue 实现不包括 ddrescuelog(但从 debian 获取最新版本并编译和安装它相当容易,这是我见过的最简单的)。
答案3
我现在正在恢复一个坏磁盘,并将尝试以下操作:
http://sourceforge.net/projects/ddrutility/
...(从 2.1 版开始)包括 ddru_ntfsfindbad:
Ddru_ntfsfindbad 是一个用于 NTFS 分区的实用程序,用于查找 ddrescue 日志文件中哪些文件与坏扇区相关。
安装意味着从源代码进行编译,但是有了 Ubuntu 机器(VM),提供的说明使这一切变得简单。