【问题标题】:How to read an intermittent hard drive consistently?如何持续读取间歇性硬盘?
【发布时间】:2010-11-29 22:30:12
【问题描述】:

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

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

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,它不是我的,我只是想分享一些与我的问题相关的东西。

!编辑!

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

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

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

!EDIT2!

我不清楚,我的驱动器是希捷 7200.11。众所周知,它有一个坏的固件,它并不总是可以通过简单的固件更新来修复(不是在这个错误出现之后)。硬盘物理100%处于工作状态,只是固件被拧,几秒钟后进入无限忙碌状态。

【问题讨论】:

  • 这可能属于ServerFault?另一方面,问题肯定是问如何编写程序,所以这确实属于 StackOverflow 的职权范围。
  • 我想学习如何直接处理硬盘,而不是将其发送给 RMA 或一些数据恢复专家。这绝对是一个软件问题。

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


【解决方案1】:

我会先从硬件角度来解决这个问题。它是外部驱动器吗?如果是,您可以换一种情况试试吗?

您提到冷启动工作,然后它退出。这与热量有关吗?您是否尝试过在冰箱之类的地方长时间使用硬盘?

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

【讨论】:

  • +1,如果他的字面意思是“冷启动”,把它放在冰箱/冰柜里并不是那么牵强。我曾经有一个以相反方式工作的驱动器 - 在驱动器充分预热之前,启动会蓝屏几次。
  • 有人告诉我,把硬盘放在冰箱里的袋子里几个小时可以让它有足够的时间用于备份过程。但同样,我不认为我有硬件问题,而是固件问题。
  • 如果是热问题,您几乎可以在任何一家不错的电子产品商店(Radio Shack、Fry's、您当地的电脑旧货店)购买冷冻喷雾。一个很好的爆炸可以让它冷却几分钟。
【解决方案2】:

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

你知道...我喜欢“懒惰”...这是我会做的:

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

【讨论】:

  • 我喜欢 robocopy 的方法,但重启系统一千多次似乎不是一个好主意。我会坚持使用机械版本,[dis]自己连接 sata 电源线。
【解决方案3】:

从“我需要取回我的数据”的角度来看,如果您的数据对您真的很有价值,我建议您将驱动器发送给数据恢复专家。根据数据的价值,成本(可能几百美元)是微不足道的。理想情况下,您会找到一位数据恢复专家,该专家不仅仅运行一些软件来进行恢复 - 如果软件方法不起作用,他们应该能够执行诸如更换驱动器上的电路板之类的事情,并且可能还有其他事情(我不是数据恢复专家)。

如果驱动器上的数据价值没有完全上升到那个水平,您应该考虑购买众多软件中的一种来进行数据恢复。例如,我个人使用过并且会推荐来自 Runtime 软件的 GetDataBack http://www.runtime.org。我用它来恢复故障驱动器,它对我有用。

现在了解更多一般信息...从故障驱动器恢复数据的标准过程是尽可能少地对驱动器本身进行操作。您应该拔下驱动器,并停止尝试做任何事情。驱动器出现故障,并且可能会变得越来越糟。你不想玩弄它。您需要最大限度地提高获取数据的机会。

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

一旦对硬盘进行了映像,软件就会根据映像来识别驱动器的各个逻辑部分 - 分区、目录和文件。然后它使您能够从图像中复制文件。

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

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

【讨论】:

  • 我的问题不在于操作系统层,在于磁盘中位的抽象。问题是硬件,但不是物理上的,只是有故障的固件。一些专业人士可以轻松地恢复这些数据,但在我尝试更激烈的事情之前,我会自己冒险一下。
【解决方案4】:

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

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

您可以轻松挂载文件磁盘映像并读取其内容,请参阅mount-o loop 选项。

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

【讨论】:

  • 我可以用 C 语言中的一个简单的 FILE 处理程序打开 /dev/sdb1 吗?然后我用某种变量控制指向 fseek 的指针,然后我继续阅读直到 eof?设备文件会给出我的 eof 吗?安装怎么样,我读过我可以使用循环设备安装分区。我可以用循环设备安装整个设备(例如 /dev/sdb),然后用另一个循环设备安装分区吗?挂载设备映像文件时,如何访问分区?我只是出于好奇才问这个问题,反正我在这个磁盘上只有一个分区。
  • 当然可以,你可以打开整个分区,将其作为文件读取。由于它是块设备,您可以使用包括 fseek 和 eof 在内的普通函数。 Afaik 你不能用分区挂载整个磁盘,只能挂载具体的分区。
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2017-09-05
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多