【发布时间】: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