GrabDuck

ddrescue или спасаем данные с HDD

:

 

gnu ddrescue recoveryВсем привет. Думаю, что каждый рано или поздно сталкивался с ситуацией, когда необходимо восстановить данные с жесткого диска. На помощь нам приходит утилита ddrescue. Я тоже не обошел данную проблему стороной.  Буквально на днях моя домашняя файлопомойка заскрипела диском и начала сыпать ошибками на консоль и в лог. Что-то вроде:

Error fsyncing/closing /dev/sda: Input/output error
Input/output error during read on /dev/sda
Input/output error during read on /dev/sda

Повезло мне, что: 1. есть бэкап, который успокоил мою душу (хорошо, что не понадобился). 2. Проблема оказалась с поверхностью диска, а не с контроллером\электроникой.

Порядок действий с битым hdd

Типичный порядок действий, которому я стараюсь следовать при наличии таких проблем как ошибки чтения\записи, нетипичный треск диска и другие симптомы выхода из строя жесткого диска:

  1. Выключаю комп с проблемным диском
  2. Загружаю с LiveCD\LiveUSB - утилиты MHDD или Victoria
  3. Проверяю, определяется ли жесткий диск и есть ли возможность провести проверку диска чтением. Если запуск проверки диска прошел успешно, это можно считать положительным показателем работоспособности электроники. Останавливаю проверку.
  4. Далее я перехожу к переносу данных с помощью ddrescue.
  5. После успешного восстановления я пытаюсь запустить remap битых секторов. Обычно, действую по алгоритму: если remap начал обнаруживать очень большое количество битых секторов, то останавливаю. Диск летит в мусорку. Если битых секторов не шибко много, то диск после ремапа может еще не один год поработать, как средство для переноса некритичных данных между ПК.
  6. Запускаю проверку перенесенной файловой системы (fsck для linux, chkdsk для Windows разделов).

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

Восстановление битого hdd с помощью ddrescue

Исторически, для побайтового копирования в Linux существовала утилита dd. Недостаток dd, в данном случае в том, что она может копировать данные только с исправных устройств. Данного недостатка лишена ddrescue. Давайте кратко рассмотрим man ddrescue:

GNU ddrescue - Data recovery tool. It copies data from one file or block device (hard disc, cdrom, etc) to another, trying to rescue the good parts first in case of read error. <...>

If you use the mapfile feature of ddrescue, the data is rescued very efficiently, (only the needed blocks are read). Also you can interrupt the rescue at any time and resume it later at the same point. The mapfile is an essential part of ddrescue's effectiveness. Use it unless you know what you are doing.<...>

Что по русски звучит, как:

GNU ddrescue - Утилита восстановления данных. Утилита копирует данные из одного файла или блочного устройства (жесткого диска, CDROM и т.п.) в другой, пытается спасти данные в случае ошибок чтения.

Если вы используете функцию логфайла, восстановление данные происходит очень эффективно (копируются только необходимые блоки). Вы можете прервать копирование в любое время и возобновить его в любой момент и копирование продолжется с того места, с которого остановилось. Логфайл - это неотъемлемая часть успешного восстановления данных с помощью ddrescue. Используйте его, если не знаете, что делаете.

При своей работе ddrescue не пишет нули в выходной файл, когда он находит бэды на входном файле, и не обрезает выходной файл, если это не задано в параметрах. Таким образом, каждый раз, когда ddrescue натравливается на тот же выходной файл, он пытается заполнить пробелы, не трогая уже спасенные данные. В общем-то все выглядит просто. Послушаемся совета использовать лог файл. Лог файл после определенной версии ddrescue стал называться mabfile.

Рекомендации  по восстановлению данных или Будьте бдительны и осторожны

Опять же, взято из мануала:

  • ddrescue - довольно мощное средство по уничтожению данных, если Вы будете не осторожны. Необходимо понимать, что вы собираетесь делать. 7 раз отмерь...
  • никогда не запускайте восстановление данных с\на раздел, который примонтирован на чтение\запись. Разделы, с которыми будет работать ddrescue вообще лучше не монтировать, даже в режиме RO;
  • никогда не пытайтесь восстановить файловую систему с ошибками I/O на диске, т.к. размер поврежденных может значительно увеличиться;
  • если Вы пытаетесь восстановить данные на устройство или раздел, все данные на этом устройстве будут перезаписаны;
  • некоторые системы после перезагрузки могут изменять имена устройств (например те, что используют udev). Если ОС была перезагружена, проверьте имена устройств прежде чем перезапускать ddrescue;
  • если возникла необходимость прервать ddrescue для перезагрузки, будьте осторожны, чтобы перезагрузка не началась с восстанавливаемого раздела. Это может привести к изменениям данных на диске и повторный запуск ddrescue будет неконсистентным.

Формат  ddrescue

ddrescue запускается в следующем формате:

 ddrescue [options] infile outfile [mapfile=logfile]

При этом, в большинстве случаев, достаточно всего нескольких опций:

-A или --try-again

Не углубляясь в нюансы работы ddrescue, можно пометить все ошибочные области, как области, которые еще не читались. Рекомендуется использовать опцию, если диск перестает отвечать.

-d или --idirect

При указании данной опции, ddrescue использует прямой доступ к диску, обходя кэши ядра.

-i bytes или --input-position=bytes

Ключ задает откуда (с какого bytes) начинать чтение с infile. По умолчанию установлен в ноль.

-m file или --domain-mapfile=file

Ограничить размер восстанавливаемого раздела последним блоком, обозначенным в логфайле. Используется для слияния образов восстановления. Например, если диск outfile сломался во время восстановления.

-n или --no-scrape

Пропускает т.н. фазу scrape. Уменьшает время восстановления, т.к. снижает время на попытки чтения самых трудных частей файла.

-r n или --retry-passes=n

Задает количество повторных попыток чтения поврежденных областей. По умолчанию - 0. -1 подразумевает, что количество попыток бесконечное. Каждый битый сектор читается один раз, пи этом перечитывается 0 раз по умолчанию, или то количество раз, которое заданно в текущей опции.

-R или --reverse

Обратная последовательность выполнения каждой фазы восстановления. То есть ddrescue читает данные в обратной последовательности.

-f или --force

Заставить ddrescue перезаписать диск outfile. Необходим, когда в качестве outfile используется устройство. Используется для защиты от ошибочного повреждения данных.

-v или --verbose

Verbose mode, он же подробный режим. Можно указать несколько -v (до 4х), что увеличит детальность вывода.

Давайте теперь рассмотрим данные опции на примерах.

ddrescue примеры

Пример 1: Восстановление целого диска с несколькими разделами ext3 (или любыми другими, хоть NTFS) с /dev/hda на /dev/hdb.

Примечание: Нет необходимости создавать таблицу разделов на /dev/hdb, т.к. данные копируются побайтово вместе со структурой разделов.

ddrescue -f -n /dev/hda /dev/hdb mapfile
ddrescue -d -f -r3 /dev/hda /dev/hdb mapfile
fdisk /dev/hdb
e2fsck -v -f /dev/hdb1
e2fsck -v -f /dev/hdb2

Пример 2: Восстановление одного раздела с /dev/hda2 на /dev/hdb2.

Примечание: результирующий раздел должен существовать с тем же типом и размером, что и исходный, либо должен быть создан.

ddrescue -f -n /dev/hda2 /dev/hdb2 mapfile
ddrescue -d -f -r3 /dev/hda2 /dev/hdb2 mapfile
e2fsck -v -f /dev/hdb2
mount -t ext2 -o ro /dev/hdb2 /mnt
# (попробуйте прочитать данные с восстановленного раздела)

Пример 3: Во время восстановления целого диска  /dev/hda на /dev/hdb,  /dev/hda  остановился и перестал отвечать на позиции 12345678.

ddrescue -f /dev/hda /dev/hdb mapfile
# ( <-- /dev/hda freezes here --> )
# (переподключите  /dev/hda или перезагрузите компьютер )
# перезапускаем восстановление с байта 12350000 
ddrescue -f -i 12350000 /dev/hda /dev/hdb mapfile
# Пробуем восстановить с конца диска
ddrescue -f -R /dev/hda /dev/hdb mapfile

Пример 4: Во время восстановления целого диска  /dev/hda на /dev/hdb,  /dev/hdb выдал ошибку и мы пытаемся восстановить данные на третий диск  /dev/hdc

ddrescue -f -n /dev/hda /dev/hdb mapfile1 
# (<-- /dev/hdb выдал ошибку -->)
ddrescue -f -m mapfile1 /dev/hdb /dev/hdc mapfile2
ddrescue -f -n /dev/hda /dev/hdc mapfile2
ddrescue -d -f -r3 /dev/hda /dev/hdc mapfile2

Пример 5: Во время восстановления целого диска /dev/hda на /dev/hdb, /dev/hda перестал отвечать, стал недоступен и невидим в /dev

ddrescue -f -n /dev/hda /dev/hdb mapfile 
# (<-- /dev/hda fails here --> )
# Переподключите /dev/hda или перезагрузите компьютер столько раз, сколько необходимо 
ddrescue -f -n -A /dev/hda /dev/hdb mapfile
ddrescue -d -f -r3 /dev/hda /dev/hdb mapfile

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

Ссылки

https://www.gnu.org/software/ddrescue/ - основной ресурс разработчиков ddrescue
http://www.sysresccd.org/ - Live дистрибутив, специально заточенный под восстановление данных
https://www.scientificlinux.org/ - тоже интересный Live дистрибутив с необходимыми инструментами для работы с HDD

С Уважением, Mc.Sim.


Другие материалы в категории Linux
Теги: , , ,