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
Типичный порядок действий, которому я стараюсь следовать при наличии таких проблем как ошибки чтения\записи, нетипичный треск диска и другие симптомы выхода из строя жесткого диска:
- Выключаю комп с проблемным диском
- Загружаю с LiveCD\LiveUSB – утилиты MHDD или Victoria
- Проверяю, определяется ли жесткий диск и есть ли возможность провести проверку диска чтением. Если запуск проверки диска прошел успешно, это можно считать положительным показателем работоспособности электроники. Останавливаю проверку.
- Далее я перехожу к переносу данных с помощью ddrescue.
- После успешного восстановления я пытаюсь запустить remap битых секторов. Обычно, действую по алгоритму: если remap начал обнаруживать очень большое количество битых секторов, то останавливаю. Диск летит в мусорку. Если битых секторов не шибко много, то диск после ремапа может еще не один год поработать, как средство для переноса некритичных данных между ПК.
- Запускаю проверку перенесенной файловой системы (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
- Репликация Mysql (master-slave, master-master)
- Ошибка 0x80004005 0x80070035 на Windows 10 при доступе к сетевой папке
- Текстовый редактор VIM, основы работы
- Спринт Lingoda (ex Марафон Lingoda) + промокод.
- ddrescue или спасаем данные с HDD
- Бесплатный SLES для Vmware – ВСЁ…
- Резервное копирование файлов сайта по ssh
- SQUID настройка ACL и http_access
- squid, использование опции debug_options или диагностика компонентов squid
- Седьмой релиз Debian
полезное 4тиво))
Я бы очень советовал обратить внимание на мегаполезную фичу 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
Шикарно.
Спасибо за примеры.
никогда не пытайтесь восстановить файловую систему с ошибками I/O
не совсем корректный перевод мануала – коректнее так:”никогда не пытайтесь восстановить файловую систему на ДИСКЕ с ошибками I/O”, то есть ошибки и/о это ошибки диска, а не ФС.
Спасибо за замечание. Поправил.
На картинке одна “р” лишняя, ddrescuRe. Потрите, пожалуйста, мои коменты с правками как прочтете.
Спасибо еще раз )
Спасибо за примеры, помогли разобраться.
Добрый день.
Скажите, пожалуйста, с вами можно как-то связаться насчет сабжа? Полетел диск, читаю мануалы, пытаюсь восстановить через ddrescue (в линуксе я полный нуб), но ощущение, что делаю что-то не так.
Связываемся все тут )
Подскажите, что выполняется в примере 1 командой fdisk /dev/hdb?
Данная команда пересоздает таблицу разделов. Этот шаг не обязателен, но спасет в том случае, если на исходном диске таблица разделов повреждена.
Скажите, пожалуйста, можно ли с помощью ddrescue восстановить данные с minisd карты?
Скажем так. Если с карты данные читаются, то ddrescue просто их прочтет.
Но ddrescue – это не тот инструмент, который стоит использовать для восстановления данный с SD.
Пример 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 два раза с разными ключами?
Первый раз ddrescue пытается прочитать 1 раз весь диск, записывает то, что смог прочитать на /dev/hdb, обо всем что прочитать не смог – пишет в mapfile.
Второй раз читает только проблемные области по 3 раза (-r3), при этом, использует прямой доступ к диску, минуя кэш ядра ОС (-d).
Столкнулся с вот такой проблемой в итоге
В гугле ответа не нашел, в мануале тоже. -А пробовал – не помогает.
Проблема – есть HDD с битымы секторами, клонирую его на другои диск с помощью ddrescue, но в самом конце диска, он мне выдал ошибку no space left on device. Хочу начать копирование заново, уже на другои диск, где места точно хватит, но утилита не хочет начинать копирование заново, а пытается продолжить старое с прежнего места и снова отправляетcя на 99.44% выполнения операции и снова пишет ошибку заполнения диска.
Подскажите, как сбросить данное восстановление и начать с чистого листа? Перезагрузка ПК так же не помогает…
Нужно вместо mapfile указать другое имя лога.
Тогда первая команда начнется сначала.
Mc.Sim большое спасибо за ответы! И последний вопрос:
Запускаю все, как в первом примере. Диск 1 ТБ Сигейт USB 3.0 – перенос секторов идет больше суток, но никак не заканчивается и в итоге в строчке о примерном времени завершения становится n\a. В чем проблема может быть? Разве он не должен завершить чтение и пропустить в конце концов битые блокии выдать какой-то резултат?
скрин https://www.dropbox.com/s/v4ur56qzvodbtnc/2019-02-21%2007.14.12.jpg?dl=0
Судя по скрину – процесс идет.
Восстановление может занимать очень много времени, все зависит от состояния диска.
Судя по средней скорости в 8000kB, скоро должно завершиться.
Здравствуйте. Вопрос такой – есть диск с debian, с битыми секторами, система отказывается грузиться. С помощью gddrescue скопировал данные на другой диск, данные читаются. Копировал как в примере с полной копией диска, побайтово. Но – при подключении с него система не грузится, пишет что вставьте подключите диск с системой, и т.д., то есть судя по всему, MBR не скопировался. Можно ли как-то это исправить?
Здравствуйте.
Какую команду вводили, когда копировали?
Могу предположить, что копировался логический раздел, а не физический.
Либо mbr находился на другом диске.
Здравствуйте!
Восстанавливаю диск по 1 примеру
Fdisk -l показал:
https://cloud.mail.ru/public/KdvS/mLbJ7RFyy
Выполнил первые две команды:
https://cloud.mail.ru/public/JLeD/8bkiKZLP9
Что дальше подскажите пожалуйста
Написал fdisk /dev/sdb ничего не происходит, пишет – добро пожаловать в fdisk и предлагает выполнить команды, что надо делать?
Для каких разделов выполнять e2fsck?
Не понимаю что за раздел sda2?
У меня на восстанавливаемой диске было 4 раздела.
Добрый день.
fdisk указан для того, чтобы на новом диске сверить разделы со старым. Его запускать не обязательно.
fsck нужно запустить для sdb1,5,6,7.
sdb2 – это extended раздел, который (условно) включает в себя sdb5,6,7. Он создается для того, чтобы можно было создать более 4х разделов. (primary может быть не более 4х)
было 4, потому что sdb1,5,6,7 – это разделы, которые видны в винде, а extended – не виден.
Спасибо большое! Не раз помогло спасти полезные данные с раритетных дисков перед отправкой оных на свалку.
Здравствуйте!
Такой вопрос – при попытке что-то восстановить, критично ли класть ЖД вверх ногами, т.е. блинами вниз? Из соображения – если в результате повреждения поверхности внутри винчестера могут образоваться мельчайшие осколки, и они могут оседать на поверхности, снова врезаться в головку, отчего количество царапин и “космического мусора” растёт по экспоненте. Соответственно, по идее, в положении вниз головой они должны меньше оседать и меньше будет риск остатоно ушатать диск при попытке прочитать его последний раз. Правильный ли совет? Просто всегда так делаю.
Ситуация: имеется сильно оцарапанный диск, я имел глупость продолжать им пользоваться с 2018 года, когда начались косяки с чтением скопированных файлов, и до недавнего времени всё тянул с покупкой спасательного ЖД, пока на днях при очередном старте не царапнуло нулевой сектор – кажись, даже со звуком – и прощай таблица разделов, диск в коме. Число “битков” всегда держалось примерно на 5000, навевая на мысль, то это могли быть софт-бэды от тогда плохого питания по USB через переходник, и беспокоиться не о чем – но сейчас на диагностике их число резко скакнуло до 14000. Тем не менее, диск определяется как пустой раздел на терабайт (вначале лежал ненужный раздел на 8гб, остальное место под NTFS хранилище), а Виктория видит сектора, хоть первые ~100мегабайт и читаются с трудом. Попытаюсь спасти что-нибудь через ddrescue, пока не слишком поздно (обращаться в платные сервисы дорого, не стоит того моя мелочёвка).
Да, второй вопрос – как после копирования достать из образа второй NTFS раздел, и можно ли после снятия образа как-нибудь сложить в отдельную папку все файлы, пересечённые битыми секторами?
Спасибо.
По поводу переворачивания диска я сомневаюсь. Обычно все думают, что там отказываются осколки, которые способны упасть под своим весом. Но часто – это не так. Это обычная пыль, которая легко поднимается от движения блинов точно так же, как головка летит над блином. К тому же, запись часто идет с двух сторон. Возможно, правильнее – ставить вертикально, платой вниз – блинами вверх. Чтобы частицы оседали в районе двигателя головок и фильтра. Вот тут есть наглядные иллюстрации – https://rlab.ru/doc/hdd_from_inside.html
Вытащить раздел можно записав слитый образ на другой диск, или просто примонтировать файл диска в ОС.
Необходимо также указать, что генерация mapfile делается сама при первом запуске, что весьма неочевидно из документации. Вместо этого я запускал с параметром –generate-mode, на что потратил лишние 3 часа. Комментарий выше для вытягивания logfile с других программ также считаю как минимум не актуальным.
Здравствуйте.
Клон ubuntu, Linux 4.15.0-121-generic x86_64
винт под crypto_LUKS2 ext4, диск нельзя урезать. 1Tb
есть винт на 500Gb/
Есть возможность копировать без обрезки?
Я думаю, что скопировать можно будет, но данные будет невозможно расшифровать.
Привет.
Скачал откудато DDrescue для Windows – как ему указать путь к моему NTFS разделу (диск E:)
И как ему указать начало и конец тех областей откуда можно читать данные (у меня таких областей штук 20). Начало и конец бэдов я уже записал в блокнотик с помощью Victoria.
Хочу склонировать образ диска в файл. Все плохие сектора уже помечены в NTFS как бэд кластеры.
После запуска ddrescue как в первом примере (копирование с диска на диск), появляется надпись (цифру точно не помню, но что-то вроде): start sector: 0, skip first 180 sectors
Это он о чём? Я ничего такого не указывал в команде. Разделы GPT, если это важно, Ubuntu 14.04
Трудно что-то подсказать не видя самой команды.