如何一致地读取间歇性硬盘?

时间:2009-09-20 21:18:41

标签: c# c++ c hardware hard-drive

我有一个故障的硬盘驱动器,间歇性地工作。冷启动后,我可以访问它大约30-60秒,然后硬盘驱动器失败。我愿意编写一个软件来将这个驱动器备份到一个新的更大的磁盘上。我可以在GNU / Linux或Windows下开发它,我不在乎。

问题是:我只能访问磁盘一段时间,而且有些文件很大而需要的时间比要复制的文件长。出于这个原因,我正在考虑将整个硬盘备份成较小的部分,例如bit trenting。在尝试阅读另一组之前,我会阅读一些兆字节并存储它。我的主要循环是这样的:

while(1){
    if(!check_harddrive()){ sleep(100ms); continue; }
    read_some_megabytes();
    if(!check_harddrive()){ sleep(100ms); continue; }
    save_data();
    update_reading_pointer();
    if(all_done){ break; }
}

问题是check_harddrive()函数。我愿意用C / C ++编写这个,以获得最大的API /库兼容性。我需要对文件处理程序进行一些控制以检查它们是否仍然有效,并且我需要一些东西来返回错误数据,但如果驱动器在复制过程中失败则返回。

如果我滥用“硬编码”硬件异常,C#会给我最好的结果吗?

另一种方法是测量我需要多长时间来重新启动硬盘驱动器并编程程序才能在此时间内读取它,并标记我何时重启电源。

在这种情况下你会做什么?是否有任何工具/实用程序已经执行此操作?

哦,有一个很棒的应用程序可以阅读不良的光学媒体here,它叫做IsoPuzzle,它不是我的,我只想分享一些与我的问题有关的东西。

!EDIT!

一些澄清。我是家庭用户,是大学计算机工程专业的学生,​​我宁愿丢失数据而不是花费数千美元来恢复它。希捷的保修仍然涵盖了硬盘,但由于他们给了我5年的保修期,我想尽一切可能,直到时间用完。

当我说冷启动时,我的意思是在没有电源的情况下启动几秒钟。热启动会重新启动计算机,冷启动会将其关闭,等待几秒钟然后重新启动它。由于有问题的硬盘是内置的SATA,我可以断开电源线,等待几秒钟再重新连接。

到现在为止,我将使用robocopy,我只是在搜索它以了解我如何使用它。如果我不需要编写自己的代码,而是编写脚本,那就更容易了。

!EDIT2!

我不清楚,我的驱动器是Seagate 7200.11。众所周知,它有一个糟糕的固件,并不总是可以通过简单的固件更新来修复(不会出现此错误)。该驱动器在物理上处于工作状态的100%,只是固件被拧紧,使其在几秒钟后进入无限繁忙状态。

4 个答案:

答案 0 :(得分:6)

我会首先从硬件角度来解决这个问题。它是一个外部驱动器 - 如果是这样,你可以在不同的情况下尝试吗?

你提到冷启动工作,然后退出。这与热有关吗?您是否尝试过像冰箱一样长时间使用硬盘?

从软件方面,我有第二个线程,密切关注一些重复循环读取少量数据更新的进度计数器,然后它将能够通过您定义的超时发出故障信号。

答案 1 :(得分:2)

您可能对 robocopy (“强健文件复制”)感兴趣。 Robocopy是一个命令行工具,它可以容忍网络中断并恢复先前停止的复制(不完整的文件用日期戳记对应于1980-01-01并包含恢复记录,因此Robocopy知道从哪里继续)。

你知道......我喜欢“ lazy ”......这就是我要做的事情:

我会写2个简单的脚本。其中一个会启动robocopy(关闭持久性特征)并开始复制,而另一个会定期检查(可能是通过尝试列出根目录的内容,如果它需要的时间超过它已经死了几秒钟。 ..再次..)驱动器是否仍在工作,如果硬盘停止工作,它将重新启动机器。登录后让他们启动并设置自动登录,这样当机器重新启动时,它会自动继续。

答案 2 :(得分:2)

我认为最简单的方法是复制整个磁盘映像。在Linux下,您的磁盘将显示为块设备,例如/dev/sdb1

开始复制磁盘映像,直到出现读取错误。然后等待用户“修复”磁盘并从最后一个位置开始读取。

您可以轻松装入文件磁盘映像并阅读其内容,请参阅-o loop的{​​{1}}选项。

使用前冷却磁盘。我听说有帮助。

答案 3 :(得分:1)

从“我需要获取数据”的角度来看,如果您的数据对您非常有价值,我建议您将驱动器发送给数据恢复专家。根据数据的价值,成本(可能是几百美元)是微不足道的。理想情况下,你会发现一个数据恢复专家不只是运行一些软件来进行恢复 - 如果软件方法不起作用,他们应该能够做一些事情,比如更换驱动器上的电路板,可能还有其他事情(我不是数据恢复专家)。

如果驱动器上的数据值没有达到该级别,则应考虑购买许多软件中的一个用于数据恢复。例如,我个人已经使用过,并会从Runtime软件http://www.runtime.org推荐GetDataBack。我用它来恢复失败的驱动器,它对我有用。

现在更一般的信息......关闭故障驱动器的数据恢复的标准流程是尽可能少地在驱动器上进行。您应拔掉驱动器,并停止尝试执行任何操作。驱动器出现故障,可能会变得越来越糟。你不想玩它。您需要最大化获取数据的机会。

该过程的工作方式是使用逐块(不是逐个文件)读取驱动器的软件,并制作驱动器的映像副本。该软件会尝试读取每个块,并在它们失败时重试读取,并写入一个图像文件,该文件是整个硬盘的映像。

对硬盘进行映像后,软件会对映像进行处理,以识别驱动器的各个逻辑部分 - 分区,目录和文件。然后,它可以让您从图像中复制文件。

软件通常可以从图像中“推断”结构。例如,如果分区表损坏或丢失,软件将扫描整个映像,查找可能是分区的内容,如果它们看起来像分区,它会将它们视为分区,看看它是否可以找到目录和文件。因此,使用大量有关驱动器上不同结构的知识来编写好的软件。

如果你想学习如何编写这样的软件,那对你有好处!我的建议是,您从有关各种操作系统如何在硬盘驱动器上组织数据的书籍开始,这样您就可以开始直观地了解软件如何使用驱动器映像从中提取数据。