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

Октябрь 11th, 2015 Рубрики: Linux, Железо, основы Linux

 

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.




Теги: , , ,

24 комментария к “ddrescue или спасаем данные с HDD”

  1. DRM
    Октябрь 27th, 2015 at 22:59
    1

    полезное 4тиво))

  2. olegkrutov
    Декабрь 17th, 2015 at 05:29
    2

    Я бы очень советовал обратить внимание на мегаполезную фичу ddrescue — работу с картой занятого места (domain logfile). Это файл, который говорит ddrescue, что копировать, а что нет. Такие файлы можно генерить с помощью утилит из пакета partclone, там их куча для разных типов ФС (fat, ext, ntfs, hfs). Это всё сильно помогает, если диск не занят под завязку, конечно ж. Также, конечно, чудес не бывает, и если побита инфа, на основе которой partclone.xxxx генерит свои карты, то надо делать полный образ (или если сильно охота помучаться, воспользоваться утилитой ddru_ntfsbitmap из пакета ddrutility, которая вычитывает битовую карту как может).

    Ещё одна фича — указание размера физического сектора, что оно даёт — в случае физического сектора на диске, как сейчас часто бывает, 4Кбайт, если это указано, ddrescue не станет копировать каждый логический сектор 512 байт размером, если он не читается, а будет читать данные кусками по 4К (ускоряет вычитывание битых участков). Это, понятно, имеет смысл, если разделы на диске выровнены по границе 4К.

    Ну, вот гипотетический пример, допустим, нам надо скопировать диск с двумя разделами (1 = Ext2, 5 = Ext4) на исправный диск.
    Пациент = /dev/sda (раздел /dev/sda1,5), образ пишем на /dev/sdb. (/dev/sdb должен быть не меньшего размера, чем исходный!)


    ### копируем MBR и всякий grub, если он там есть, для верности
    dd if=/dev/sda of=/dev/sdb bs=512 count=63
    ### сохраняем инфу о разделах в текстовый файлик...
    sfdisk -d /dev/sda > ./partitions
    ### ... и заливаем её из этого файлика на диск под образ
    sfdisk /dev/sdb < ./partitions
    ### вуаля, теперь /dev/sdb имеет ровно те же разделы, что и пациент (MBR, для GPT не годится!)
    ### теперь делаем карты занятого места (полагаем, что разделы нормально отмонтированы, и карты у нас создадутся)
    partclone.extfs -D -s /dev/sda1 -O ./part_1.domain
    partclone.ext4 -D -s /dev/sda5 -O ./part_5.domain
    ### создали карты, теперь делаем образы
    for i in 1 5; do ddrescue -d -f --domain-logfile=./part_$i.domain /dev/sda$i /dev/sdb$i ./part_$i.log; done
    ### по результатам можно логи (и карты) смотреть графически при помощи ddrescueview,
    ### а статистику -- ddrescuelog, например,
    ddrescuelog -t -m ./part_5.domain ./part_5.log

    • Август 3rd, 2016 at 22:07
      3

      Шикарно.
      Спасибо за примеры.

  3. bookit
    Январь 4th, 2016 at 23:51
    4

    никогда не пытайтесь восстановить файловую систему с ошибками I/O

    не совсем корректный перевод мануала — коректнее так:»никогда не пытайтесь восстановить файловую систему на ДИСКЕ с ошибками I/O», то есть ошибки и/о это ошибки диска, а не ФС.

    • Август 3rd, 2016 at 22:38
      5

      Спасибо за замечание. Поправил.

  4. bookit
    Январь 5th, 2016 at 01:45
    6

    На картинке одна «р» лишняя, ddrescuRe. Потрите, пожалуйста, мои коменты с правками как прочтете.

    • Август 3rd, 2016 at 22:56
      7

      Спасибо еще раз )

  5. bookit
    Январь 5th, 2016 at 01:51
    8

    Спасибо за примеры, помогли разобраться.

  6. Слава
    Июль 19th, 2016 at 08:02
    9

    Добрый день.

    Скажите, пожалуйста, с вами можно как-то связаться насчет сабжа? Полетел диск, читаю мануалы, пытаюсь восстановить через ddrescue (в линуксе я полный нуб), но ощущение, что делаю что-то не так.

    • Август 4th, 2016 at 21:51
      10

      Связываемся все тут )

  7. Алекс
    Сентябрь 14th, 2016 at 03:55
    11

    Подскажите, что выполняется в примере 1 командой fdisk /dev/hdb?

    • Май 17th, 2018 at 09:07
      12

      Данная команда пересоздает таблицу разделов. Этот шаг не обязателен, но спасет в том случае, если на исходном диске таблица разделов повреждена.

  8. ivanbigua
    Апрель 30th, 2017 at 10:18
    13

    Скажите, пожалуйста, можно ли с помощью ddrescue восстановить данные с minisd карты?

    • Февраль 9th, 2019 at 13:56
      14

      Скажем так. Если с карты данные читаются, то ddrescue просто их прочтет.
      Но ddrescue — это не тот инструмент, который стоит использовать для восстановления данный с SD.

  9. Александр
    Февраль 16th, 2019 at 16:39
    15

    Пример 1:

    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

    Подскажите, зачем запускать ddrescue два раза с разными ключами?

    • Февраль 18th, 2019 at 13:23
      16

      Первый раз ddrescue пытается прочитать 1 раз весь диск, записывает то, что смог прочитать на /dev/hdb, обо всем что прочитать не смог — пишет в mapfile.
      Второй раз читает только проблемные области по 3 раза (-r3), при этом, использует прямой доступ к диску, минуя кэш ядра ОС (-d).

  10. Александр
    Февраль 18th, 2019 at 14:00
    17

    Столкнулся с вот такой проблемой в итоге

    В гугле ответа не нашел, в мануале тоже. -А пробовал — не помогает.

    Проблема — есть HDD с битымы секторами, клонирую его на другои диск с помощью ddrescue, но в самом конце диска, он мне выдал ошибку no space left on device. Хочу начать копирование заново, уже на другои диск, где места точно хватит, но утилита не хочет начинать копирование заново, а пытается продолжить старое с прежнего места и снова отправляетcя на 99.44% выполнения операции и снова пишет ошибку заполнения диска.

    Подскажите, как сбросить данное восстановление и начать с чистого листа? Перезагрузка ПК так же не помогает…

    • Февраль 21st, 2019 at 22:08
      18

      Нужно вместо mapfile указать другое имя лога.
      Тогда первая команда начнется сначала.

  11. Александр
    Февраль 22nd, 2019 at 12:51
    19

    Mc.Sim большое спасибо за ответы! И последний вопрос:

    Запускаю все, как в первом примере. Диск 1 ТБ Сигейт USB 3.0 — перенос секторов идет больше суток, но никак не заканчивается и в итоге в строчке о примерном времени завершения становится n\a. В чем проблема может быть? Разве он не должен завершить чтение и пропустить в конце концов битые блокии выдать какой-то резултат?
    скрин https://www.dropbox.com/s/v4ur56qzvodbtnc/2019-02-21%2007.14.12.jpg?dl=0

    • Февраль 23rd, 2019 at 00:07
      20

      Судя по скрину — процесс идет.
      Восстановление может занимать очень много времени, все зависит от состояния диска.
      Судя по средней скорости в 8000kB, скоро должно завершиться.

  12. Max
    Май 30th, 2019 at 15:17
    21

    Здравствуйте. Вопрос такой — есть диск с debian, с битыми секторами, система отказывается грузиться. С помощью gddrescue скопировал данные на другой диск, данные читаются. Копировал как в примере с полной копией диска, побайтово. Но — при подключении с него система не грузится, пишет что вставьте подключите диск с системой, и т.д., то есть судя по всему, MBR не скопировался. Можно ли как-то это исправить?

    • Август 31st, 2019 at 21:55
      22

      Здравствуйте.
      Какую команду вводили, когда копировали?
      Могу предположить, что копировался логический раздел, а не физический.
      Либо mbr находился на другом диске.

  13. Borya
    Август 31st, 2019 at 21:49
    23
    • Август 31st, 2019 at 21:57
      24

      Добрый день.
      fdisk указан для того, чтобы на новом диске сверить разделы со старым. Его запускать не обязательно.
      fsck нужно запустить для sdb1,5,6,7.
      sdb2 — это extended раздел, который (условно) включает в себя sdb5,6,7. Он создается для того, чтобы можно было создать более 4х разделов. (primary может быть не более 4х)
      было 4, потому что sdb1,5,6,7 — это разделы, которые видны в винде, а extended — не виден.

Написать комментарий