Как постоянно читать прерывистый жесткий диск?

У меня неисправный жесткий диск, который работает с перебоями. После холодной загрузки я могу получить к нему доступ примерно 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++ для совместимости с maximus API/библиотекой. Мне понадобится некоторый контроль над моими обработчиками файлов, чтобы проверить, действительны ли они, и мне нужно что-то, чтобы возвращать неверные данные, но возвращать, если диск выходит из строя во время процесса копирования.

Может быть, С# даст мне наилучшие результаты, если я буду злоупотреблять «жестко запрограммированными» аппаратными исключениями?

Другим подходом было бы измерение того, сколько времени мне потребуется для включения и выключения моего жесткого диска, и кодирование программы, чтобы читать его только в течение этого времени, и помечать меня, когда нужно выключить и снова включить питание.

Что бы вы сделали в этом случае? Существуют ли какие-либо инструменты/утилиты, которые уже делают это?

О, есть ОТЛИЧНОЕ приложение для чтения плохих оптических носителей здесь , это называется IsoPuzzle, это не мое, я просто хотел поделиться чем-то связанным с моей проблемой.

!РЕДАКТИРОВАТЬ!

Некоторые уточнения. Я домашний пользователь, студент факультета вычислительной техники в колледже, и я лучше потеряю данные, чем потрачу тысячи долларов на их восстановление. На жесткий диск по-прежнему распространяется гарантия Seagate, но, поскольку они дали мне 5 лет гарантии, я хочу попробовать все возможное, пока не истечет время.

Когда я говорю «холодная загрузка», я имею в виду загрузку через несколько секунд без питания. Горячая загрузка будет перезагружать ваш компьютер, холодная загрузка будет выключать его, ждать несколько секунд, а затем снова загружать. Поскольку рассматриваемый жесткий диск является внутренним, но SATA, я могу просто отключить кабель питания, подождать несколько секунд и подключить его снова.

До сих пор я буду использовать robocopy, я просто ищу его, чтобы посмотреть, как я могу его использовать. Если мне нужно не кодить самому, а писать скрипт, будет еще проще.

!РЕДАКТИРОВАТЬ2!

Я не понял, у меня диск Seagate 7200.11. Известно, что у него плохая прошивка и это не всегда лечится простым обновлением прошивки (не после появления этого бага). Диск физически на 100% в рабочем состоянии, просто прошивка накручена, заставляя через несколько секунд переходить в состояние бесконечной занятости.


person Spidey    schedule 20.09.2009    source источник
comment
Это может относиться к ServerFault? С другой стороны, вопрос определенно заключается в том, как написать программу, так что это входит в компетенцию StackOverflow.   -  person Jonathan Leffler    schedule 21.09.2009
comment
Я хочу научиться обращаться с жестким диском напрямую, а не отправлять его в RMA или какому-нибудь специалисту по восстановлению данных. Это определенно программный вопрос.   -  person Spidey    schedule 21.09.2009


Ответы (4)


Я думаю, что самый простой способ для вас - скопировать весь образ диска. В Linux ваш диск будет отображаться как блочное устройство, например /dev/sdb1.

Начинайте копирование образа диска, пока не появится ошибка чтения. Затем подождите, пока пользователь «починит» диск и начнет чтение с последней позиции.

Вы можете легко смонтировать образ файлового диска и прочитать его содержимое, см. параметр -o loop для mount.

Охладите диск перед использованием. Я слышал, что это помогает.

person Viliam    schedule 21.09.2009
comment
Я могу открыть /dev/sdb1 с помощью простого обработчика FILE на C? Затем я управляю какой-то переменной указателем на fseek и продолжаю читать до конца? Будет ли файл устройства давать мой eof? Что касается монтирования, я читал, что могу монтировать раздел с помощью петлевого устройства. Могу ли я смонтировать целое устройство (например, /dev/sdb) с петлевым устройством, а затем смонтировать разделы с другим петлевым устройством? Когда я монтирую файл образа устройства, как я могу получить доступ к разделам? Я спрашиваю это просто из любопытства, у меня все равно есть только один раздел на этом диске. - person Spidey; 21.09.2009
comment
Конечно, вы можете открыть весь раздел и прочитать его как файл. Поскольку это блочное устройство, вы также можете использовать обычные функции, включая fseek и eof. Афаик, вы не можете смонтировать весь диск с разделами, только конкретный раздел. - person Viliam; 21.09.2009

Сначала я бы работал над этим с аппаратной точки зрения. Это внешний диск - если да, можете ли вы попробовать его в другом случае?

Вы упомянули о работе с холодной загрузкой, а затем он отключился. Это связано с жарой? Вы пробовали использовать жесткий диск в течение длительного времени в чем-то вроде морозильной камеры?

Со стороны программного обеспечения у меня был бы второй поток, который следил бы за некоторым счетчиком прогресса, обновляемым повторяющимся циклом, считывающим небольшие объемы данных, тогда он мог бы сигнализировать об ошибке через тайм-аут, который вы бы определили.

person Kendall Helmstetter Gelner    schedule 20.09.2009
comment
+1, если он буквально имеет в виду холодную загрузку, положить его в холодильник / морозильник не так уж и надуманно. У меня когда-то был диск, который работал противоположным образом - при запуске пару раз появлялся синий экран, прежде чем диск достаточно прогрелся. - person GRB; 21.09.2009
comment
Мне сказали, что если поместить жесткий диск в холодильник в сумку на несколько часов, он оживится на время, достаточное для процесса резервного копирования. Но опять же, я не думаю, что у меня аппаратная проблема, а проблема с прошивкой. - person Spidey; 21.09.2009
comment
Если проблема связана с перегревом, вы можете купить замораживающий спрей почти в любом приличном магазине электроники (Radio Shack, Fry's, местный магазин компьютерного барахла). Хороший порыв от этого будет держать его холодным в течение нескольких минут. - person Ira Baxter; 09.01.2011

Вас может заинтересовать robocopy ("Надежное копирование файлов"). Robocopy — это инструмент командной строки, который может переносить сбои в сети и возобновлять копирование с того места, где оно было остановлено ранее (неполные файлы отмечаются отметкой даты, соответствующей 1980-01-01, и содержат запись восстановления, поэтому Robocopy знает, с чего продолжить).

Знаете... Мне нравится быть "ленивым"... Вот что бы я сделал:

Я бы написал 2 простых скрипта. Один из них запустит robocopy (с отключенными функциями постоянства) и начнет копирование, в то время как другой будет периодически проверять (возможно, пытаясь просмотреть содержимое корневого каталога, и если это займет больше нескольких секунд, он мертв. .. еще раз ..) работает ли еще диск, и если жесткий диск перестал работать, он перезагрузил бы машину. Заставьте их запускаться после входа в систему и настройте автоматический вход, чтобы при перезагрузке машин он автоматически продолжался.

person Tarnay Kálmán    schedule 20.09.2009
comment
Мне нравится подход robocopy, но перезагрузка системы более тысячи раз не кажется хорошей идеей. Я буду придерживаться механической версии, самостоятельно [отключив] подключение кабеля питания sata. - person Spidey; 21.09.2009

С точки зрения «мне нужно вернуть свои данные», если ваши данные действительно ценны для вас, я бы порекомендовал отправить диск специалисту по восстановлению данных. В зависимости от того, насколько ценны данные, стоимость (вероятно, несколько сотен долларов) незначительна. В идеале вы должны найти специалиста по восстановлению данных, который не просто запускает какое-то программное обеспечение для восстановления — если программный подход не работает, он должен уметь делать такие вещи, как замена печатной платы на диске и, возможно, другие действия. вещи (я не специалист по восстановлению данных).

Если ценность данных на диске не достигает этого уровня, вам следует подумать о приобретении одной из многочисленных программ для восстановления данных. Например, я лично использовал и буду рекомендовать GetDataBack из программного обеспечения среды выполнения http://www.runtime.org. Я использовал его для восстановления неисправного диска, это сработало для меня.

А теперь к более общей информации... Стандартный процесс восстановления данных с неисправного диска заключается в том, чтобы как можно меньше делать на самом диске. Вы должны отключить диск и прекратить попытки что-либо сделать. Диск выходит из строя, и, вероятно, ситуация будет становиться все хуже и хуже. Вы не хотите играть с этим. Вы должны максимизировать свои шансы на получение данных.

Этот процесс работает с использованием программного обеспечения, которое считывает диск поблочно (а не файл за файлом) и создает копию образа диска. Программное обеспечение пытается прочитать каждый блок и повторяет чтение, если оно не удается, и записывает файл образа, который является образом всего жесткого диска.

После создания образа жесткого диска программное обеспечение работает с образом, чтобы идентифицировать различные логические части диска — разделы, каталоги и файлы. И затем это позволяет вам копировать файлы с изображения.

Программное обеспечение обычно может «выводить» структуры из изображения. Например, если таблица разделов повреждена или отсутствует, программное обеспечение просканирует весь образ в поисках элементов, которые могут быть разделами, и, если они достаточно похожи на разделы, будет рассматривать их как раздел и посмотреть, сможет ли оно найти каталоги и файлы. Итак, хорошее программное обеспечение пишется с использованием большого количества знаний о различных структурах диска.

Если вы хотите научиться писать такое программное обеспечение, молодцы! Я рекомендую вам начать с книг о том, как различные операционные системы организуют данные на жестких дисках, чтобы вы могли начать интуитивно чувствовать, как программное обеспечение может работать с образами дисков для извлечения данных из них.

person Don Dumitru    schedule 20.09.2009
comment
Моя проблема не стоит на уровне ОС, в абстракции битов на магнитном диске. Проблема аппаратная, но не физически, а просто неисправная прошивка. Некоторые профессионалы могут легко восстановить эти данные, но я немного поэкспериментирую, прежде чем попробую что-то более радикальное. - person Spidey; 21.09.2009