Как правильно читать прерывистый жесткий диск? - PullRequest
2 голосов
/ 21 сентября 2009

У меня неисправный жесткий диск, который работает с перебоями. После холодной загрузки я могу получить к ней доступ в течение 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%, просто прошита прошивка, через несколько секунд он переходит в состояние бесконечной занятости.

Ответы [ 4 ]

6 голосов
/ 21 сентября 2009

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

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

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

2 голосов
/ 21 сентября 2009

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

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

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

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

2 голосов
/ 21 сентября 2009

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

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

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

1 голос
/ 21 сентября 2009

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

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

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

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

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

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

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

...