У меня неисправный жесткий диск, который работает с перебоями. После холодной загрузки я могу получить к ней доступ в течение 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 # даст мне лучшие результаты, если я злоупотреблю "жестко закодированными" аппаратными исключениями?
Другим подходом было бы измерить, сколько времени мне понадобится для включения и выключения питания моего жесткого диска и кодирования программы, чтобы прочитать его только в это время, и пометить меня, когда включать и выключать питание.
Что бы вы сделали в этом случае? Есть ли инструменты / утилиты, которые уже делают это?
О, есть отличное приложение для чтения плохих оптических носителей здесь , оно называется IsoPuzzle, оно не мое, я просто хотел поделиться чем-то, связанным с моей проблемой.
! EDIT!
Некоторые уточнения. Я домашний пользователь, студент компьютерного факультета в колледже, я бы предпочел потерять данные, чем потратить тысячи долларов на их восстановление. На жесткий диск все еще распространяется гарантия Seagate, но, поскольку они дали мне 5 лет гарантии, я хочу попробовать все возможное, пока не истечет время.
Когда я говорю «холодная загрузка», я имею в виду загрузку через несколько секунд без питания. Горячая загрузка - это перезагрузка компьютера, холодная загрузка - выключение, ожидание через несколько секунд, а затем повторная загрузка. Поскольку указанный жесткий диск является внутренним, но SATA, я могу просто отсоединить кабель питания, подождать несколько секунд и снова подключить его.
До сих пор я пойду с robocopy, я просто ищу его, чтобы посмотреть, как я могу его использовать. Если мне не нужно самому кодировать, а писать сценарии, это будет еще проще.
! EDIT2!
Мне было непонятно, мой диск - это Seagate 7200.11. Известно, что у него плохая прошивка, и ее не всегда можно исправить простым обновлением прошивки (не после появления этой ошибки). Привод физически находится в рабочем состоянии на 100%, просто прошита прошивка, через несколько секунд он переходит в состояние бесконечной занятости.