пятница, 17 апреля 2009 г.

Спасаем данные в Linux с помощью ddrecovery

«Input/output error (5)» сказала система при копировании файла и заставила погрузиться в неприятные раздумья о новом винчестере и подлом партизане SMART. К счастью все важные данные сохранились в резервных копиях, и всё-же постараться вытащить один файл очень хотелось — 34Гб образ виртуальной машины содержал в себе несколько документов потерять которые было бы неприятно.

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

Первым делом потребовалось скачать утилиту — она идёт в стандартных пакетах Ubuntu(под именем gddrescue), но достаточно старой версии и некоторые полезные возможности не содержит.
По адресу ftp.gnu.org/gnu/ddrescue/ находится релиз 1.10, собирается простым набором «./configure && make && make install» и сразу готов к работе.

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

Первый проход запускается командой

ddrescue --no-split --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

т.е. отключаем повторные чтения и попытки минимизировать проблемные зоны, указываем откуда и куда копировать и файл лога. Понятно что копировать файл на тот-же диск идея плохая. Исходная файловая система ext3, раздел куда копируется ext2.

Лог восстановления — параметр не обязательный, но при многопроходном варианте нужен, и если в первый проход его создать забыли, то можно использовать --generate-logfile, полученный лог будет больше оптимального, но для дальнейших проходов полностью подойдёт.

В моём случае первый проход занял больше дня и сообщил о следующем
rescued: 22093 MB, errsize: 12264 MB, errors: 3876
картина не самая приятная, но уже что-то, начинаем второй проход.

ddrescue --direct --max-retries=2 --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

теперь пробуем прочесть диск в режиме прямого доступа и с 2 повторными попытками. Это число можно увеличивать, но в моём случае это только увеличивало время и результатов не приносило. (А вот при копировании CD вполне может дать результат).

Второй проход занял ещё около 15 часов, причём значительно улучшил картину:
rescued: 34292 MB, errsize: 65220 kB, errors: 16659
но попробуем вернуть остатки

ddrescue --retrim --max-retries=2 --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

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

Через два часа восстановление прерываю, результат
rescued: 34293 MB, errsize: 64579 kB
понятно что резкого улучшения ждать не стоит. С другой стороны для файлов небольшого размера (10-100мб) именно третий проход давал максимум данных, так что зависит от везения и характера проблем.

Образ был успешно добавлен в VirtualBox, проверен стандартным chkdsk и все необходимые данные скопированы, погибшие 60 мегабайт пришлись на системные файлы. Времени на всё ушло чуть более двух суток, что конечно много, но приемлемо.

Удачного восстановления, и не забывайте делать бекапы, они стоят потерянного времени, но а на крайний случай, ddrescue Вам в помощь

Комментариев нет:

Отправить комментарий