有一个 Windows/NTFS 驱动器发生故障。我能够通过 USB-IDE 电缆连接到另一台 PC,并使用 Knoppix 7.2 LiveUSB 和ddrescue
/恢复驱动器的大部分ddrutitliy
内容。我已经恢复了大多数关键数据。现在我将其用作学习练习,看看我是否可以简化这个过程,以及在不弄乱硬件的情况下我可以恢复多少数据。
下面是完整的叙述,但我想知道是否有人成功编写了一个脚本来处理驱动器(USB 或其他)在救援过程中间歇性或由于已知原因切断的情况。
使用ddru_ntfsbitmap
它可以拉出引导扇区和 MBR 位图,从而将恢复范围缩小到仅使用的文件空间(60GB 驱动器上的 16GB)。使用的命令是:
ddru_ntfsbitmap -i 32256 -m MFTDomainFile.txt /dev/sdc filelocations.txt
(-i
使用63*512 = 32256
。因为驱动器无法安装以从 fdisk 中找到 63,所以我不得不猜测直到ddru_ntfsbitmap
告诉我它可以找到引导扇区。显然它通常是 63 或 2048。)
此驱动器经常断电,并且有一个驱动器部分(前 950MB)在单个扇区读取错误后就会断电。要继续,需要拔下 usb-IDE 电缆并重新插入,以使驱动器重新显示在 /dev 中。在这台电脑上(或者可能与 Knoppix 有关),如果驱动器断电,ddrescue
会继续将其他读取尝试标记为错误,这使得很难跟踪“真正的”扇区读取问题。(在另一台装有 Ubuntu 的旧电脑上,它会以某种方式检测到这个问题并终止ddrescue
,这是一个不错的功能,但我不知道是什么导致了这种不同的行为。)经过几次启动和重新启动,我能够ddrescue
一次读取/复制大块并获得大部分磁盘。(>95% 的表现较好的部分)。使用-i
和-s
选项我解决了“将所有标记为坏的”问题并限制了其影响。
一般来说,我使用的命令是这样的:
ddrescue -S -m filelocations.txt /dev/sdc HDImage.img HDRecoverlog.txt -r2 -d -i5GB -s1GB
如果它切断,它只会将 1GB 部分标记为坏的,我可以重试添加,-AM
以便它会阻止复制,或者直接运行-r5
。复制速度在慢速部分似乎并不重要,并且在进行块复制时它会更频繁地切断。
在获得所有未尝试过的大型部分后,允许ddrescue
在驱动器更稳定的部分上运行一夜,发现该部分中大多数扇区错误。ddru_ntfsfindbad
(以查找哪些文件有错误)在 $MFT 中报告了 20 个扇区错误,因此我使用以下命令重新运行了一夜:
ddrescue -S -m MFTDomainFile.txt /dev/sdc HDImage.img HDRecoverlog.txt -r-1 -d
这发现了所有$MFT
错误,因此我运行ddru_ntfsfindbad
以查找驱动器其余部分中仍然存在错误的文件:
ddru_ntfsfindbad -i 32256 -DD -HDImage.img HDRecoverlog.txt
(-DD
生成一个包含每个 inode 扇区位置的调试日志文件,可以与正常文件结合使用ntfsfindbad.log
来定位每个有错误的文件。)
只需让ddrescue
稳定部分运行一整个周末,它就能找出该部分中除两个扇区错误之外的所有错误(来自周五的 1112 个错误)。重新运行后,ddru_ntfsfindbad
文件错误列表会小得多。
对于硬盘前部,仍有约 150MB 被标记为“坏”。许多文件只是被跳过/未尝试,但被标记为与硬盘切口一样坏。使用 ntfsfindbad 日志,我可以通过以下(显然众所周知的)痛苦过程手动定位文件:
- 插入 USB 连接器。
ddrescue
旋转后发出命令。CTRL-C
如果我听到它遇到坏扇区,就会发出警报,否则它会丢失上面提到的位置 。- 它
CTRL-C
会在下一个扇区停止并将下次从那里开始。 - 该
-X
选项将消除这种需要,但它会停留在问题区域而不是前进,并且永远不会越过真正糟糕的区域。
- 它
- 拔下驱动器以切断电源
- 转到 (1)
我能够通过这种方式完全恢复大多数感兴趣的文件。手动定位/拆分未尝试过的大块区域,可能会无错误地提取整个区域。但有时我必须重试某个错误 10-20 次。使用此过程,除了 ~150kB 之外的所有错误都“快速”清除。从那时起,手动重试已降至总共 ~55 个单扇区错误和 31kB。根据驱动器其余部分的行为,如果我可以清除除几个实际坏扇区之外的所有扇区,并且可能在替换少量文件(当然 Windows/system32 位于该部分)后使整个映像正常工作,我不会感到惊讶。
我意识到这是一个相当幸运(尽管罕见)的数据可恢复的案例。但我救出的最后一个磁盘有一个非常类似的“驱动器因一次读取错误而切断”问题。我读过很多关于如何尝试重置或关闭磁盘和/或 USB 端口的电源循环的帖子。据我所知,切断 USB 电源的能力高度依赖于硬件和 Linux 内核。我还意识到,如果成本/收益情况不同,那么硬件和服务解决方案可以帮助解决这个问题,这将是值得的。
那么,有没有更好的方法来处理上述 5 步流程?这可能也使“好”部分的初始数据抓取速度更快(手动操作更少)。有没有更好的方法(仍然是 DIY)来解决整个过程?
答案1
设置局部淋巴细胞1 秒内解决了我的电源循环问题:
smartctl -l scterc,10,10 /dev/sdX
答案2
我刚刚遇到了同样的问题,USB 外壳中的 SSD 有问题,/dev/sd…
每次ddrescue
遇到坏扇区时,磁盘的设备就会消失,因此我不得不将 USB 拔出并重新插入 200-300 次,或者只是尝试在ddrescue
第一遍“大块”模式下读取坏扇区附近的内容。
这次我没有找到适合自己的解决方案,但我有这样的想法:那些一生中遇到这种情况不止一次的人会从USB 中继板可以通过命令行进行控制,例如使用usbrelay
软件。继电器将连接到特制的 USB 延长线上,它会中断并重新连接电源线。这与拔下并重新插入设备相同,然后系统应该重新检测设备。这允许在软件中自动执行所有操作,因为脚本现在可以启动重新插入设备。