Linux копирование поврежденных файлов

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

Всем привет. Думаю, что каждый рано или поздно сталкивался с ситуацией, когда необходимо восстановить данные с жесткого диска. На помощь нам приходит утилита 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.

Читайте также:  Linux opened files by user

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

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

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

Формат ddrescue

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

ddrescue [options] infile outfile [mapfile=logfile]

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

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

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

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

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

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

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

Читайте также:  Linux read txt file

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

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

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

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

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 или перезагрузите компьютер ) # перезапускаем восстановление с байта 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 # () 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 или перезагрузите компьютер столько раз, сколько необходимо ddrescue -f -n -A /dev/hda /dev/hdb mapfile ddrescue -d -f -r3 /dev/hda /dev/hdb mapfile

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

Читайте также:  Удаленные файлы linux папка

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

Другие материалы в категории Железо

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

Я бы очень советовал обратить внимание на мегаполезную фичу 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

Источник

Оцените статью
Adblock
detector