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

11 октября, 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.




Теги: , , ,

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

  1. DRM
    27 октября, 2015 at 22:59
    1

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

  2. olegkrutov
    17 декабря, 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

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

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

  3. bookit
    4 января, 2016 at 23:51
    4

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

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

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

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

  4. bookit
    5 января, 2016 at 01:45
    6

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

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

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

  5. bookit
    5 января, 2016 at 01:51
    8

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

  6. Слава
    19 июля, 2016 at 08:02
    9

    Добрый день.

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

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

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

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

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

    • 17 мая, 2018 at 09:07
      12

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

  8. ivanbigua
    30 апреля, 2017 at 10:18
    13

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

    • 9 февраля, 2019 at 13:56
      14

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

  9. Александр
    16 февраля, 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 два раза с разными ключами?

    • 18 февраля, 2019 at 13:23
      16

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

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

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

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

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

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

    • 21 февраля, 2019 at 22:08
      18

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

  11. Александр
    22 февраля, 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

    • 23 февраля, 2019 at 00:07
      20

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

  12. Max
    30 мая, 2019 at 15:17
    21

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

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

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

  13. Borya
    31 августа, 2019 at 21:49
    23

    Здравствуйте!
    Восстанавливаю диск по 1 примеру
    Fdisk -l показал:
    https://cloud.mail.ru/public/KdvS/mLbJ7RFyy
    Выполнил первые две команды:
    https://cloud.mail.ru/public/JLeD/8bkiKZLP9
    Что дальше подскажите пожалуйста
    Написал fdisk /dev/sdb ничего не происходит, пишет – добро пожаловать в fdisk и предлагает выполнить команды, что надо делать?
    Для каких разделов выполнять e2fsck?
    Не понимаю что за раздел sda2?
    У меня на восстанавливаемой диске было 4 раздела.

    • 31 августа, 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 – не виден.

  14. Артур
    13 января, 2020 at 17:39
    25

    Спасибо большое! Не раз помогло спасти полезные данные с раритетных дисков перед отправкой оных на свалку.

  15. Корнинг
    14 февраля, 2021 at 04:18
    26

    Здравствуйте!
    Такой вопрос – при попытке что-то восстановить, критично ли класть ЖД вверх ногами, т.е. блинами вниз? Из соображения – если в результате повреждения поверхности внутри винчестера могут образоваться мельчайшие осколки, и они могут оседать на поверхности, снова врезаться в головку, отчего количество царапин и “космического мусора” растёт по экспоненте. Соответственно, по идее, в положении вниз головой они должны меньше оседать и меньше будет риск остатоно ушатать диск при попытке прочитать его последний раз. Правильный ли совет? Просто всегда так делаю.

    Ситуация: имеется сильно оцарапанный диск, я имел глупость продолжать им пользоваться с 2018 года, когда начались косяки с чтением скопированных файлов, и до недавнего времени всё тянул с покупкой спасательного ЖД, пока на днях при очередном старте не царапнуло нулевой сектор – кажись, даже со звуком – и прощай таблица разделов, диск в коме. Число “битков” всегда держалось примерно на 5000, навевая на мысль, то это могли быть софт-бэды от тогда плохого питания по USB через переходник, и беспокоиться не о чем – но сейчас на диагностике их число резко скакнуло до 14000. Тем не менее, диск определяется как пустой раздел на терабайт (вначале лежал ненужный раздел на 8гб, остальное место под NTFS хранилище), а Виктория видит сектора, хоть первые ~100мегабайт и читаются с трудом. Попытаюсь спасти что-нибудь через ddrescue, пока не слишком поздно (обращаться в платные сервисы дорого, не стоит того моя мелочёвка).

    Да, второй вопрос – как после копирования достать из образа второй NTFS раздел, и можно ли после снятия образа как-нибудь сложить в отдельную папку все файлы, пересечённые битыми секторами?
    Спасибо.

    • 10 апреля, 2021 at 22:54
      27

      По поводу переворачивания диска я сомневаюсь. Обычно все думают, что там отказываются осколки, которые способны упасть под своим весом. Но часто – это не так. Это обычная пыль, которая легко поднимается от движения блинов точно так же, как головка летит над блином. К тому же, запись часто идет с двух сторон. Возможно, правильнее – ставить вертикально, платой вниз – блинами вверх. Чтобы частицы оседали в районе двигателя головок и фильтра. Вот тут есть наглядные иллюстрации – https://rlab.ru/doc/hdd_from_inside.html
      Вытащить раздел можно записав слитый образ на другой диск, или просто примонтировать файл диска в ОС.

  16. ice
    21 марта, 2021 at 11:50
    28

    Необходимо также указать, что генерация mapfile делается сама при первом запуске, что весьма неочевидно из документации. Вместо этого я запускал с параметром –generate-mode, на что потратил лишние 3 часа. Комментарий выше для вытягивания logfile с других программ также считаю как минимум не актуальным.

  17. garet
    23 мая, 2021 at 18:01
    29

    Здравствуйте.
    Клон ubuntu, Linux 4.15.0-121-generic x86_64
    винт под crypto_LUKS2 ext4, диск нельзя урезать. 1Tb
    есть винт на 500Gb/
    Есть возможность копировать без обрезки?

    • 23 мая, 2021 at 21:06
      30

      Я думаю, что скопировать можно будет, но данные будет невозможно расшифровать.

  18. lvl
    31 августа, 2021 at 22:23
    31

    Привет.
    Скачал откудато DDrescue для Windows – как ему указать путь к моему NTFS разделу (диск E:)
    И как ему указать начало и конец тех областей откуда можно читать данные (у меня таких областей штук 20). Начало и конец бэдов я уже записал в блокнотик с помощью Victoria.

    Хочу склонировать образ диска в файл. Все плохие сектора уже помечены в NTFS как бэд кластеры.

  19. Konstantin
    15 марта, 2024 at 10:26
    32

    После запуска ddrescue как в первом примере (копирование с диска на диск), появляется надпись (цифру точно не помню, но что-то вроде): start sector: 0, skip first 180 sectors
    Это он о чём? Я ничего такого не указывал в команде. Разделы GPT, если это важно, Ubuntu 14.04

    • 17 марта, 2024 at 11:43
      33

      Трудно что-то подсказать не видя самой команды.

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