Ddrescue linux как пользоваться

Обновлено: 06.07.2024

С тех пор как до меня дошла благая весть о существовании операционной системы под названием GNU/Linux, которую используют все настоящие программисты, я несколько раз пытался заменить ей детище Билла Гейтса и несколько раз потерпел неудачу.

Гуру поблизости отсутствовали, доступ к интернету был жёстко ограничен и потому любая нетривиальная задача становилась в те времена совершенно нерешаемой.

Потом, когда появился безлимитный интернет, вследствие чего с получением софта и знаний стало существенно легче, я настроил себе дуал бут и стал осваивать Убунту.

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

В большинстве случаев это было не фатально. Вместо привычного foobar всегда можно послушать музыку на Rhythmbox. Вместо Microsoft Office есть OpenOffice. Да, его совместимость с продуктом корпорации зла порой оставляет желать лучшего, но им вполне можно пользоваться для решения повседневных задач среднестатистического пользователя. Обо всяких Файрфоксах, Операх и Хромах я вообще молчу.

Но в некоторых случаях приходилось перезагружать компьютер, выбирать в меню загрузчика пункт Microsoft Windows и делать всё по старинке. Такой задачей было например снятие образа логического диска в целях переноса на другой физический носитель, потому как текущий уже изрядно поистрепался.

Программой, которая использовалась в таких ситуациях, был Acronis. Интуиция подсказывала, что на выяснение того, как обойтись без него, уйдёт не меньше недели, а результат обычно был нужен край через полчаса, поэтому выяснение откладывалось, откладывалось и откладывалось.

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

Гугл создавал чёткое впечатление, что как клонировать диски средствами опенсорсных ОС, знает каждая собака. Увы, чёткие инструкции по осуществлению общеизвестных и элементарных вещей найти как правило сложнее всего. Какие-то мануалы в результате упорных поисков в конце концов обнаружились, но всё равно с ними пришлось туговато, ибо их явно писали грамотные люди, которые возятся с темой не первый и даже не второй день, и просто не помнят, что знаниями, почитаемыми ими за необходимый минимум, владеют далеко не все.

Теперь, когда ужасы гугления позади, я понимаю, что всё действительно достаточно просто и хочу оформить результаты своих изысканий в виде краткого руководства по работе с образами дисков в GNU/Linux, обращённого в первую очередь к тем, кто привык к Акронису или другой подобной ему программе. Мне в свое время такой документ бы очень сильно помог, надеюсь, что он поможет и кому-то ещё.

Acronis

В Акронисе всё было просто и понятно: оконный интерфейс, подсказки и предшествующий опыт работы с образами компакт дисков делали процесс несложным. Снял образ, вставил новый винт, развернул образ на него — даже и рассказывать то не о чем. В случае с Линуксом процесс захлебнулся на этапе снятия образа — как это сделать было абсолютно неясно. Специальной программки с подсказками не нашлось, программки, которая добавляла в список устройств виртуальный DVD — наподобие Daemon Tools тоже. Да и сам список устройств оказался достаточно проблематичен, поэтому начать можно прямо с него.

Просмотр перечня накопителей

Для каждого подключенного накопителя (винчестера, флешки) в директории /dev можно найти соотвествующий ему файл. Его название состоит из букв sd и буквы, обозначающей номер устройства. То есть винчестеру, подключенному к первому каналу, будет соответствовать файл sda, второму sdb и так далее. Соответственно самый простой способ посмотреть список устройств — ls -1 /dev/sd[a-z]. Эта команда покажет список накопителей, но не даст нам никакой информации о них. А нам нужно хотя бы увидеть список разделов.

Просмотр перечня разделов на накопителе

Каждому разделу в директории dev тоже соотвествует файл. Его название строится из названия файла, соотвествующего накопителю и номера раздела. То есть для накопителя sda, на котором есть 2 раздела, в директории /dev будет создано 2 файла — sda1 и sda2. Посмотреть перечень разделов на накопителе sda можно командой ls -1 /dev/sda9 полный перечень разделов на всех устройствах получается на выводе команды ls -1 /dev/sd[a-z]4, а если есть необходимость включить в перечень и сами устройства, то можно просто написать ls -1 /dev/sd*, что значительно менее осмысленно, зато коротко и главное работает. Или, как подсказывают в комментариях, есть ещё вариант cat /proc/partitions

Часто владелец может опознать диск просто по такому перечню (это когда дисков у него не 452), но если этого недостаточно, то можно воспользоваться программой hdparm.

Конкретно hdparm -I /dev/sda выведет подробную информацию об устройстве /dev/sda.

Эту же информацию, но в рассеянном по разным файлам виде, можно найти в директории /sys/block/sda. Например модель диска находится в файле /dev/block/sda/device/model.

Если и этого недостаточно, то остается только по очереди монтировать устройства и смотреть что на них записано. Но это уже совсем другая история.

Снятие образа

Итак, устройство опознано и раздел, с которого нужно снять образ, найден. Теперь собственно процесс.

Общие рекомендации

Образом диска мы обычно называем копию диска на уровне разделов или всего устройства. И если пользователь Windows в ответ на вопрос, как эту копию сделать, обычно слышит рекомендацию воспользоваться специализированным софтом, то в Линуксе всё не так.

Как я уже говорил, здесь каждый диск и каждый раздел диска представлен конкретным файлом. И, так как образ представляет из себя файл с копией диска, логично предположить, что операция снятия образа и операция копирования файла раздела — это одно и то же.

Так оно и есть. Пусть нам надо снять образ раздела /dev/sda2 (на нём Windows 7 обычно держит диск С:) и сохранить его в файл с названием win_c.img.

Для этого достаточно написать cp /dev/sda2 win_c.img. Или cat /dev/sda2 >win_c.img. Короче можно воспользоваться любой программой или комбинацией программ, которая осуществляет копирование файлов.

Правильный способ

Как вы наверное уже догадываетесь, добиться желаемого можно не одним и даже не двумя, остроумными и не очень способами, но правильнее и проще всего на мой взгляд, использовать утилиту ddrescue. Что существенно важно — имеется в виду GNU ddrescue, а не давно уже устаревший оригинал.

Используется ddrescue следующим образом:
ddrescue <ключи> <файл который копируем> <новый файл, в который скопируем старый> <лог файл>

ddrescue не способна принимать входные данные с конвейра, или передавать на конвейр результат работы, что впрочем неудивительно. Возможность пропускать места с ошибками при первой итерации и возвращение к ним в последующих циклах подразумевает наличие файлов на выходе и входе.

Команда, которая выполнит операцию, аналогичную описанной выше, будет выглядеть так:

ddrescue /dev/sda2 win_c.img win_c.img.log

Кстати, в данный момент я молчаливо подразумеваю, что жёсткий диск, с которого мы снимаем копию более-менее исправен и фокусов не выкидывает. Если с диском есть серьёзные проблемы, то лучше предварительно ознакомиться с подробностями использования ddrescue, например тут. и применить эти знания при снятии образа.

Неправильный способ

Часто можно встретить рекомендации использовать для копирования файла устройства или раздела программу под названием dd. Как правило, для снятия образа предлагается сделать что-то вот такое:

dd if=/dev/sda2 of=win_c.img

Не делайте так! Хотя семантически подход верен (произойдёт копирование одного файла в другой), последствия могут быть очень печальны. Да, dd превосходит cp в том отношении, что при обнаружении ошибки cp прекратит работу, а dd не прекратит, но если на диске есть битые или просто плохо читаемые сектора, то dd будет продолжать попытки считать их содержимое пока из винчестера не повалит дым.

Да, у dd есть аргумент noerror, но при его использовании копирование может быть выполнено с ошибками, попыток восстановления которых предпринято не будет. ddrescue в аналогичной ситуации после первого прохода вернётся к пропущенным местам и попробует прочитать их маленькими кусочками. И оставит лог файл, с помощью которого можно будет продолжать попытки вычитать сбойные места в будущем.

Короче, используйте ddrescue. А если кроме dd ничего нет, не забывайте про аргумент noerror.

Описанная выше процедура может применяться например для того, чтобы сохранить образ диска с только что установленной операционной системой для последующего восстановления. Да, настоящий линуксоид так поступать не станет, но среди пользователей операционной системы с другим названием это достаточно распространённая практика. И для периодического вдумчивого ремонта регулярно ломающегося компьютера какой нибудь симпатичной девушки её смело могут применять даже любители пингвинов. А если девушек больше некоторого, сугубо индивидуального для каждого самоделкина, количества, то данный метод просто незаменим. Главное не перепутать названия файлов с образами.

Просмотр содержимого образа раздела (логического диска)

Так как каждый раздел диска представлен файлом, можно предположить, что должен существовать штатный способ подключения файлов с образами к файловой системе. С определённой точки зрения так оно и есть. Конкретно для этого используется утилита mount, с помощью которой можно поместить дерево файлов, содержащееся в образе, в любую директорию на ваш выбор. Этот процесс называется монтированием.

Итак, у нас уже есть образ, снятый с диска C: операционной системы Windows 7. Мы назвали образ win_c.img и хотим увидеть его содержимое в заранее созданной директории /mnt/win_c. Для этого надо ввести команду mount -o loop win_c.img /mnt/win_c.

But we can go deeper.

Просмотр содержимого образа физического диска

А вот с монтированием образа диска целиком всё не так просто. Ужасная правда состоит в том, что монтировать файлы из произвольного места файловой системы ядро не умеет и аргумент -o loop, команды mount, сигнализирует о том, что сначала надо связать образ с файлом виртуального устройства в директории /dev, и потом уже присоединить содержимое этого устройства к файловой системе.

Файлы виртуальных устройств создаются заранее (на этапе загрузки системы) и имеют названия loop0, loop1, loop2 и так далее по нарастающей.

Связать образ раздела с одним из этих файлов можно командой losetup. Команда mount из предыдущего раздела на самом деле эквивалентна следующим двум командам.

losetup /dev/loop0 win_c.img
mount /dev/loop0 /mnt/win_c

Но вот для того, чтобы посмотреть содержимое образа в котором есть несколько разделов, этого недостаточно. Дело в том, что если выполнить команду losetup для такого файла, то с устройством /dev/loop0 будет связан весь образ целиком. То есть это устройство будет эквивалентом /dev/sda, а нам нужны эквиваленты /dev/sda1 и /dev/sda2.

Обладатели свежих версий программы losetup (читай гентушники и арчеводы) могут выполнить losetup c аргументом --partscan, что приведёт к автоматическому созданию в директории /dev файлов, соответствующих разделам образа. То есть /dev/loop0p1, /dev/loop0p2 и так далее до самого горизонта. И вот уже эти файлы можно отдавать команде mount.

losetup --partscan /dev/loop0 drive.img
mount /dev/loop0p2 /mnt/win_c

Те же, кому не так повезло с дистрибутивом, могут воспользоваться программой kpartx, которая сделает то же самое, но положит файлы соотвествующие разделaм не в директорию /dev, а в директорию /dev/mapper, откуда их можно монтировать и просматривать.

kpartx -a /dev/loop0 drive.img
mount /dev/mapper/loop0p2 /mnt/win_c

But we can go even deeper than that…

Автоматическое создание файлов разделов при выполнении команды losetup

Вообще-то ядро (а конкретно модуль loop) уже достаточно давно умеет искать в файле образа таблицу разделов и создавать соответствующие файлы, но по умолчанию эта функция отключена.

Включается она если параметр модуля loop max_part не равен нулю. Задать этот параметр можно только при загрузке модуля, поэтому если система уже запущена, модуль надо выгрузить из памяти и загрузить снова с уже заданным параметром. Для этого нужно выполнить следующие две команды.

modprobe -r loop
modprobe loop max_part=63

Однако в некоторых дистрибутивах (напривер в Убунте) модуль loop вкомпилирован в ядро намертво и поэтому для установки параметра придётся вписать loop.max_part=63 в командную строку ядра и перезагрузить систему.

Развёртывание образа на физический носитель

А теперь о том, как собственно накатить образ на другой диск. Как и раньше надо руководствоваться тем, что диски и разделы представлены в виде файлов. И если для снятия образа нужно было создать копию файла устройства или раздела, то для того, чтобы закатать этот образ обратно надо провести операцию копирования в обратную сторону. То есть вместо cp /dev/sda2 win_c.img написать cp win_c.img /dev/sda2. Ну и лучше помнить о советах, изложенных в руководстве по снятию образа. А именно пользоваться ddrescue и не пользоваться dd.

ddrescue --force win_c.img /dev/sda2 win_c_restore.img.log
Конечно следует помнить, что раздел в который мы восстанавливаем образ (в данном случае /dev/sda2) должен быть не меньше файла с образом. Eсли же раздел окажется больше этого файла, то проблем при восстановлении не будет, но в разделе останется неразмеченное пространство. И придётся либо смириться с этим фактом, либо увеличить размер файловой системы до размера раздела каким-нибудь специализированным софтом (увеличивать, впрочем, обычно гораздо проще и быстрее, чем уменьшать).

Сжатие образа раздела (логического диска)

Особенно приятной чертой Акрониса является способность не писать в файл образа куски диска или раздела, которые не содержат файлов. Это позволяет ужать образ до реального объёма данных в разделе или на диске.

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

Однако выход из положения есть. Правда для его использования файловая система, на которой будет храниться образ, должна поддерживать такую специфическую штуку, как sparse файлы.

Sparse файлы

Sparse файл это файл, в котором куски, содержащие нули, на диск не пишутся. То есть, если половина файла заполнена данными, а другая половина нулями — на диск будет записана только половина этого файла и ещё дополнительная информация об областях файла, заполненных нулями. Если область с нулями непрерывна и начинается в середине, то реально на диске файл будет заменять половину от своего теоретического объёма.

Подготовка раздела или устройства к сжатию

Для того, чтобы воспользоваться этой возможностью в целях сжатия образа, нужно перед снятием записать в свободное место нули. Сделать это несложно — достаточно смонтировать файловую систему в директорию и создать в этой директории файл с бинарными нулями размер которого будет равен размеру свободного места на разделе.

Но выяснять количество свободного места и передавать его программе, создающей файл, к счастью не обязательно, да и искать программу, создающую файл с нулями, не понадобится. В директории /dev есть безразмерный файл zero, который, как нетрудно догадаться по названию, является неисчерпаемым источником бинарных нулей. Остаётся только скопировать его в нужное место.

Так как файл безразмерен, копирование будет продолжаться до тех пор, пока копия не заполнит всё доступное ей пространство, то есть все свободное место в разделе, что нам собственно и требовалось.

Про то, как копировать файлы стандартными средствами операцинной системы, здесь написано столько раз, что руководство вполне могло бы называться «Искусство копирования файлов в окружении GNU», но так как истина от повторения не тукснеет, я, пожалуй, напишу ещё раз.

Для создания файла с бинарными нулями можно выполнить команду cp /dev/zero zerofile или cat /dev/zero > zerofile.

Создание sparse файла образа устройства или раздела

Большинство утилит для работы с файлами знают о существовании sparse файлов и умеют их создавать. Упомянутой ранее ddrescue, для того, чтобы образ оказался sparse файлом нужно передать ключ --sparse. Теперь результирующий файл будет занимать столько места, сколько ему необходимо, и не больше.

Как быть в случае сжатия образа повреждённого диска

Как известно, многие диски и в руки то брать страшно, какой уж может быть разговор о записывании туда многогигабайтных файлов. Если вам в руки попался именно такой диск, следует сначала снять образ, а потом уже сделать из него sparse файл. Для этого нужно смонтировать полученный образ, потом заполнить свободное место нулями и сделать с образа копию, которая уже будет полноценным sparse файлом. Исходный образ после этого можно удалить.

С копированием файла прекрасно справится cp, которая умеет делать sparse файлы не хуже ddrescue. cp --sparse win_c.img win_c_sparse.img

Конечно, для проведения этих операций потребуется много свободного пространства, но так всё-таки значительно лучше, чем вообще никак.

Заключение

А теперь в сжатом виде о том, что можно почерпнуть из данного руководства.

Оригинал: GNU ddrescue – The Best Damaged Drive Rescue
Автор: Carla Schroder
Дата публикации: 2 марта 2017 года
Перевод: А. Кривошей
Дата перевода: апрель 2018 г.

Когда вы спасаете свои данные с умирающего жесткого диска, время имеет большое значение. Чем дольше требуется копировать ваши данные, тем больше вы рискуете потерять. GNU ddrescue - это превосходный инструмент для копирования умирающих жестких дисков, а также любых блочных устройств, таких как компакт-диски, DVD-диски, USB-накопители, Compact Flash, SD-карты - все, что распознается вашей системой Linux как /dev /foo. Вы можете скопировать устройства, предназначенные для Windows и Mac OS X, поскольку GNU ddrescue работает на уровне блоков, а не на уровне файловой системы, поэтому не имеет значения, какая файловая система находится на устройстве.

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

Мне нравится всегда иметь под рукой SystemRescueCD на компакт-диске, а также на USB-накопителе. SystemRescueCD имеет небольшой объем и специализируется на спасательных операциях. В наши дни большинство дистрибутивов Linux имеют загрузочные версии с live-режимом, поэтому вы можете использовать то, с чем вам удобно работать, при условии, что вы ваш дистрибутив включает GNU ddrescue и другое программное обеспечение для спасения данных, которое вам нужно.

Не путайте GNU ddrescue с dd-rescue от Курта Гарлоффа . dd-rescue старше, и дизайн GNU ddrescue, вероятно, выиграл от этого. GNU ddrescue работает быстро и надежно: он пропускает плохие блоки и копирует хорошие блоки, а затем возвращается, чтобы попытаться скопировать поврежденные блоки, отслеживая их местоположение с помощью простого лог-файла.

Требуемое оборудование

Вам нужна система Linux с GNU ddrescue (gddrescue в случае Ubuntu), диск, который вы пытаетесь спасти, и устройство с пустым разделом, размером по крайней мере, в 1,5 раза больше, чем тот, который вы спасаете, так как у вас должен быть приличный запас свободного места. Если вы исчерпали свободное место, даже если это всего лишь несколько байтов, GNU ddrescue завершится неудачно в конце операции.

Есть несколько способов настройки оборудования. Один из способов - установить поврежденный диск в вашей Linux-системе, что очень просто, если это оптический диск или USB-устройство. Для дисков SATA и SDD имеются недорогие н простые в использовании адаптеры USB. Я предпочитаю подключать поврежденный диск к своей надежной системе Linux, а не зацикливаться на загрузчиках и странном железе. Для хранения спасенных данных я использую запасной диск SATA в переносном USB-кейсе.

Другой способ - загрузить компьютер, в котором находится умирающий диск, с помощью SystemRescueCD (или любого другого подобного дистрибутива), и подключить накопитель для копирования данных.

Если у вас недостаточно USB-портов, незамененимым является мощный USB-концентратор.

Идентификация накопителей

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

lsblk

Как видно из этого примера, вполне возможно ошибиться. У меня два диска по 1,8 TB. На одном корневая файловая система и мой домашний каталог, а другой - дополнительный накопитель для хранения данных. lsblk точно определяет флэш-накопитель, SD-карту и оптический привод. Если вы не сможете определить ваши диски, попробуйте findmnt:

Здесь видно, что корневой файловой системой является /dev/sda3, а все, что находится в папке /media, не относится к корневой файловой системе.

/media/carla/100MB2 и /media/carla/50MB обозначены метками вместо UUID типа /media/carla/8c670f2e-dae3-4594-9063-07e2b36e609e, так как я всегда присваиваю своим USB-накопителям понятные имена. Это можно делать для любой файловой системы, например я могу присвоить имя своей корневой файловой системе:

Запустите sudo e2label [device], чтобы увидеть вашу новую метку. e2label подходит для файловых систем ext2/ext3/ext4, а для XFS, JFS, BtrFS и других файловых систем имеются свои команды. Упростить этот процесс можно с помощью GParted: отключите файловую систему, а затем вы можете присвоить или изменить метку без использования команд для каждой файловой системы.

Основы восстановления данных

Мы потратили достаточно времени на выяснение того, как узнать, где какой диск. Предположим, что GNU ddrescue запущена на /dev/sda1, поврежденный диск - /dev/sdb1, и мы копируем его в /dev/sdc1. Первая из приведенных ниже команд копирует как максимально возможное количество данных без повторных попыток. Вторая команда снова работает с поврежденной файловой системой и делает три попытки чтения. Лог-файл находится в корневой файловой системе, которая, по моему мнению, лучше, чем съемный носитель, но вы можете поместить его куда считаете нужным:

Чтобы скопировать весь диск, используйте только имя диска, например /dev/sdb, и не указывайте раздел.

Если у вас есть поврежденные файлы, которые ddrescue не может полностью восстановить, вам понадобятся другие инструменты для их восстановления, такие как Testdisk, Photorec, Foremost или Scalpel. В Arch Linux wiki есть хороший обзор инструментов для восстановления файлов.

В следующих статьях вы найдете описание других средств для восстановления утерянных данных:

дохлая флешка

Притащил мне юзер, значит, флешку. "Не открывается", говорит, "а там файлы очень нужные", такие дела. На самом деле флешка открывалась, но при попытке скопировать файлы компьютер вешался намертво. Скорее всего, выдернули не вовремя из разъёма - можно было бы просто ткнуть её себе в комп и попытаться натравить на раздел вендовый scandisk. Но файлы то "очень нужные", есть вероятность что флешка "немного умирает", так что пришлось действовать осторожно, чтобы не убить :).

Образ снять можно по-разному. Под windows есть несколько простых и бесплатных программок, но они не заточены на то, чтобы снимать данные с диска, на котором читаются не все блоки. Если такая программа примется каждый не читаемый сектор читать по нескольку раз - диск может помереть окончательно, унеся с собой все ещё не прочитанные байты, даже те, которые можно было бы прочитать до запуска программы. Гугление по форумам подсказывает, что есть R-Studio, есть WinHEX - но они платные, кряки искать не охота, да и не алё как-то ломаный софт на работе использовать. Есть такая неплохая штука, как Non-Stop Copy, но это немного не то т.к. работает на уровне файлов. В итоге, бесплатной и "проверенной временем" софтины под Windows для этой цели - при поверхностном гуглении обнаружить не удалось, поэтому стал смотреть в сторону linux-ового софта.

Вариант с dd отметаем сразу - его недаром в народе прозвали Disk Destroyer - вполне может и добить полуживое устройство теми же самыми повторными попытками прочитать один и тот же сбойный блок. Но есть как минимум две известные софтины, умеющие именно то, что нужно - сначала прочитать то, что ещё можно прочитать, и только потом более вдумчиво ковырять проблемные места. Называются они, что характерно, практически одинаково - dd_rescue и ddrescue (GNU ddrescue). Обе программы более-менее активно развиваются до сих пор, но духи (хабр, гугл и прочий инет) говорят, что ddrescue умеет всё что нужно "из коробки", а вот dd_rescue приходится "прокачивать" скриптом на bash, если это не сделать - dd_rescue работать будет жутко медленно. У dd_rescue, как говорят, есть ощутимое преимущество в способности по-всякому сжимать поток и засылать его в pipe, но мне оно не надо. Значит, берём ddrescue. Установить в Debian её можно как-то так:


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

DDRescue GUI


Для GNU ddrescue существует GUI на питоне (в репозиториях отсутствует, можно взять отсюда), но у меня он нормально не заработал (возможно, дело в версии python), так что пришлось читать документацию к консольной утилите :). Опций там много разных, и со всем этим разным вдумчивый читатель может ознакомиться самостоятельно, набрав в консоли info ddrescue (или pinfo ddrescue, что имхо гораздо удобнее). Те же, кто менее вдумчив, или кому нужно просто ехать, а не шашечки - сразу зайдут в раздел examples документации и обнаружат, что типовые параметры запуска достаточно просты.

Так запускается первый проход по диску. С диска /dev/hda пишется образ в filename.ddr, лог (он важен!) сохраняется в logfilename.log. Опция -n заставит программу бережнее относиться к плохим блокам - не пытаться повторять чтение или искать в плохом блоке читаемые куски меньшего размера. Теоретически можно в первый проход использовать ещё и опцию -d чтобы программа работала с диском напрямую, не обращаясь к кешу операционной системы, но для этого нужно либо задать правильный размер сектора опциями, либо понадеяться, что размер по умолчанию соответствует реальному для устройства :). В моём случае (с флешкой) размер в 512 байт по умолчанию подошёл, т.е. в первый проход данные нормально читались с опцией -d.
Сам процесс чтения и записи образа сопровождается выводом в консоль информации о скорости и прогрессе выполнения, так что GUI не сильно то и нужен.

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

Всё, теперь можно или пытаться использовать продвинутые возможности ddrescue чтобы спасти ещё немного данных (если спасено не всё), либо скармливать полученный файл любой программе для препарирования образов диска и вынимать оттуда информацию. В принципе, можно просто переписать образ на исправный диск с помощью dd

Запишет содержимое образа на диск /dev/hdb блоками по 10 мегабайт (если оставить размер блока по умолчанию - снизится скорость копирования). Теперь можно натравливать на диск любые проверялки файловых систем и монтировать это дело стандартными средствами операционок.

Как вариант (если считалось всё или почти всё) - можно починить файловую систему прямо в образе (образ стоит забекапить перед этим), затем смонтировать сам образ и вынуть оттуда выжившие файлы. И тут нужно обратить внимание на следующее - если образ снимался с устройства целиком - значит, в файле образа лежит не только раздел с файловой системой, но и MBR (либо GPT для EFI) - т.е. таблица разделов и, возможно, код загрузчика. Поэтому просто так взять и натравить на полный образ диска какой-нибудь mount или dosfsck - нельзя. Либо сразу создавайте образы с отдельных разделов, либо придётся читать таблицу разделов и задавать до них смещения. Проще всего просмотреть таблицу разделов, натравив на файл образа linux-овый fdisk.

Опция u заставляет fdisk отображать смещения в секторах, а не в цилиндрах (чтобы не пересчитывать цилиндры в байты); опция c отключает устаревший режим MSDOS, который, в общем-то, не мешает, но документация рекомендует его отключать. В результате получим что-то типа такого:

Command (m for help): p

Disk ./ filename.ddr : 0 MB, 0 bytes
32 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x06392f78

Device Boot Start End Blocks Id System
./rescue.ddr1 * 63 7553951 3776944+ b W95 FAT32

Command (m for help): q

Красным выделены команды, которые нужно дать с клавиатуры. Команда p заставит вывести информацию по разделам, команда q - завершить работу fdisk. Как видно, в одном секторе 512 байт, а первый и единственный раздел файловой системы внутри образа - начинается с 63 сектора, т.е. первый байт файловой системы смещён от начала файла образа на 63*512=32256 байт.
Однако fdisk не умеет работать с GPT (это новый формат таблицы разделов для EFI - более нового аналога BIOS) который, в частности, вместо MBR по умолчанию использует Windows 8. Поэтому альтернативный вариант - программа parted (не путать с gparted!). Скорее всего, она уже установлена, но если нет - что-нибудь вроде apt-get install parted спасёт отца русской демократии :). Натравливаем parted сразу на образ:

Number Start End Size Type File system Flags
1 63 s 7553951s 7553889s primary fat32 boot

Командой unit s включаем отображение размеров в секторах, иначе parted выдаст округлённо-приближённо-человекочитаемые цифры типа "32,3kB"", из которых получить точное число байт несколько проблематично. Командой print - получаем таблицу разделов. Командой q - выходим из parted. Собственно, здесь тоже видно, что размер сектора 512 байт, а смещение раздела - 63 сектора.

Теперь можно манипулировать разделом. Если нужно просто примонтировать его - достаточно примерно такой команды:

mount -t vfat -o loop,offset=32256 /root/temp/filename.ddr /mnt/temp

Монтирует файловую систему типа vfat (fdisk и parted выше недвусмысленно намекали, что файловая система раздела - fat32) из файла образа /root/temp/filename.ddr в каталог /mnt/tmp. Каталог, понятное дело, должен существовать. Опция loop заставляет mount самостоятельно подключить образ на loopback device (представить его в виде блочного устройства), а offset задаёт ранее добытое нами смещение в файле образа до начала раздела. Смещение в принципе можно записать в виде $((63*512)) - тогда bash самостоятельно вычислит 32256 и подставит в команду. Если образ снимался прямо с раздела - опцию offset нужно убрать.

Однако если образ не удалось снять с диска целиком и в нём остались "белые пятна" из не прочитавшихся блоков - файловая система может либо вообще не подмонтироваться, либо ошибки могут возникнуть в процессе работы с разделом. Теоретически подлатать раздел можно утилитой проверки вроде dosfsck, но для этого придётся руками подключить раздел из образа в виде блочного устройства:

Команда представляет раздел из образа /root/temp/filename.ddr со смещением (указано опцией -o ) в виде устройства /dev/loop0 . Если в образе несколько разделов и какие-либо разделы идут после того, с которым вы собираетесь работать - крайне рекомендуется установить ограничение размера опцией --sizelimit. В противном случае в устройстве /dev/loop0 будут видны не только байты нужного раздела, но и всех что идут за ним. Смещение конца раздела вычисляется точно так же как и для начала - смотрим что fdisk\parted выдаёт в End и умножаем количество секторов на размер сектора.
Теперь с устройством /dev/loop0 можно работать точно так же, как с каким-нибудь /dev/sda1 - монтировать, натравливать утилиты проверки файловых систем, утилиты для восстановления данных. в общем, что угодно. Например, попытаемся восстановить файловую систему:

Опция -a заставит исправлять ошибки автоматически. Подмонтировать можно примерно так:

Если блочное устройство больше не нужно и его надо отсоединить - используем опцию -d.


Несколько слов о работе через VirtualBox.

  • Во-первых, если не устанавливать расширения (а их бесплатно нельзя использовать "в коммерческих целях" т.е. на работе) - скорость работы usb будет достаточно низкой. Для флешки это ещё терпимо, а вот съёмный usb-винт так прочитать в разумные сроки нереально. А уж если речь о IDE или SATA-винте - мне лично гораздо проще воспользоваться стареньким, нигде и никому уже не нужным системником, чем расковыривать свой рабочий компьютер, а потом пробрасывать диск в виртуальную машину :).
  • Во-вторых - в VirtualBox есть удобная функция, позволяющая быстро пробросить локальную директорию внутрь виртуальной машины (монтируется командой вида mount -t vboxsd sharename mountpoint ), однако работает она странно и не идеально. Например, сохранить в такую директорию образ с помощью ddrescue - можно, а вот подмонтировать - уже нельзя (в блочном устройстве получаются какие-то совершенно левые последовательности байтов), приходится или копировать образ внутрь виртуальной машины, или давать доступ к файлу образа каким-либо иным способом, скажем по сети.

В общем, по-быстрому поковырять флешку удобнее может быть с виртуальной машины. Но с целью чего-то посерьезнее держать наготове системник, в том числе с установленным дистрибутивом linux - на мой взгляд, всё же оптимальный вариант. Кстати, вместо виртуалки можно установить на windows cygwin - там, помнится, была уже скомпиллированная под windows версия ddrescue.

Ну и о судьбе флешки, с которой всё началось - мне повезло и образ спокойно считался в режиме прямого доступа к диску в первом же проходе, без единой ошибки. Но сама флешка при этом умерла - не удаётся ни переформатировать файловую систему, ни восстановить scandisk-ом или dosfsck-ом, файлы же на флешке перестали видеться после первой же попытки починить файловую систему.

Файловая система внутри образа была немного повреждена. После восстановления с помощью dosfsck выяснилось, что несколько файлов побиты, но ничего важного среди них не было (только логи и конфиги portable-программы). Все хранившиеся там вордовские и прочие офисные документы уцелели и вернулись к своему владельцу.

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

Повезло мне, что : 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, можно пометить все ошибочные области, как области, которые еще не читались. Рекомендуется использовать опцию, если диск перестает отвечать.

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

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

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

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

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

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

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

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

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

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

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

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

ddrescue примеры

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

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

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

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

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

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

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

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

Ссылки

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

Другие материалы в категории основы Linux

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

В последнее время ситуация с носителями, типа CD/DVD дисков, уже не так актуальна как 2-4 года назад, в наше время уже во всю популярны флешки и внешние жесткие диски, но бывают еще случаи, когда нужно скопировать диск, а он либо царапаный, либо записан не корректно и программа для записи выплевывает его. Что в таких случаях может нам предложить любимаяUbuntu?

На первый взгляд ситуация не радужная, но после некоторых проб и экспериментов могу сказать, что не все уж так плохо. Кто, как я, привык к графическому интерфейсу, может воспользоваться программой [urlspan]DVDisaster[/urlspan]. Если мало, то можно запустить через Wine, к примеру ISOBuster, который можно скачать с торрент-трекеров, либо воспользоваться весьма неплохой бесплатной программой Non-Stop Copy.

Но мне оказалось и этого мало, и я захотел попробовать истинно линуксные программы. После моей беды с потерянными файлами, я начал уже без особой опаски относиться к Терминалу. Хотя я до сих пор не могу понять, как можно скажем кодировать видео из одного формата в другой, при этом создавать меню для DVD с фоном и фоновой музыкой и все это делать в консоли. Это ж сколько нужно команд вбить в Терминале, сколько всяких путей прописать, названий файлов и т.д. По мне такие вещи удобней делать исключительно с GUI интерфейсом, но опять таки, это сугубо мое мнение. Но вот что касается восстановления файлов, создания образов, копирования нечитаемых DVD дисков, то тут Терминал может оказаться как нельзя кстати и не такой уж он и страшный. Итак идем дальше.

Программа dd. Очень старая и очень популярная среди линуксоидов программа. При помощии dd создают образы жестких дисков, флешек и других накопителей, создают образ системы и т.д. Она поблочно копирует файлы из одного места в другое. Чтобы скопировать «битый» DVD при помощи этой программы, выполним следующее:

dd if=/dev/cdrom of=image.iso conv=noerror

dev/cdrom — это ваш DVD привод

image.iso — образ копируемого DVD/CD диска

conv=noerror — параметр, который указывает, что нужно копировать, игнорируя ошибки

Это простейший пример, который показывает как можно использовать программу dd. При желании можно найти массу информации о данной программе: настройки, параметры и прочее.

Далее идет тяжелая артиллерия. Опытные пользователи говорят, что «битые» диски лучше всего копировать программами gddrescue (в Терминале пишем ddrescue) и dd_rescue. Несмотря на схожесть названий, это совершенно разные программы. Установить эти программы можно из Центра приложений Убунту. И добавлю от себя — gddrescue лучше чем dd_rescue. Итак идем далее.

gddrescue

Установим ddrescue. Установить можно из Центра приложений, либо командой:

sudo apt-get install gddrescue

  • gddrescue копирует информацию из одного источника (винчестер, CD-ROM и т.д.) в другой, пытаясь восстановить данные если есть ошибки чтения.
  • gddrescue не затирает выходной файл, если это не запрошено, поэтому при каждом запуске для одного и того же выходного файла делаются попытки заполнить пробелы.
  • gddrescue работает абсолютно в автоматическом режиме.
  • Если ведется журнал работы, то информация восстанавливается еще эффективее, потому что считываются лишь нужные блоки. Более того, восстановление можно прекратить когда угодно вам, а потом продолжить.
  • Журнал все время сохраняется на диск. Поэтому, если копирование прервано, то его можно продолжить с минимальным повторным копированием.

Как использовать данную программу? Программа консольная, поэтому работать с ней будем в Терминале, собственно как и со всеми программами, которые описаны в этом обзоре.

Схема использования: ddrescue [options] infile outfile [logfile]

— h, --help показать справку
— V, --version показать номер версии
— b, --block-size=bytes аппаратный размер блока на исходном устройстве [512]
— B, --binary-prefixes использовать степени двойки в числах [по умолчанию SI]
— c, --cluster-size=blocks число аппаратных блоков для разового копирования [128]
— C, --complete-only не считывать данные дальше, чем указано в лог-файле
— e, --max-errors=n максимально разрешенное количество областей с ошибками
— i, --input-position=pos начальная позиция в исходном файле [0]
— n, --no-split не стараться дробить области с ошибками
— o, --output-position=pos начальная позиция в целевом файле [ipos]
— q, --quiet минимум подробностей
— r, --max-retries=n выйти после этого числа повторов чтения(-1=до бесконечн.)[0]
— s, --max-size=bytes максимальный объём данных для копирования
— t, --truncate очистить целевой файл перед записью
— v, --verbose максимум подробностей

Полный список параметров можно посмотреть при помощи команды:

ddrescue -h

ddrescue -v /dev/cdrom Recovered.iso ddrescue.log

В данном примере будет копироваться диск в приводе, с созданием образа Recovered.iso и лога ddrescue.log с применением параметра -v (максимум подробностей)

dd_rescue

Далее идет программа dd_rescue. Установить также можно через Центр приложений Убунту, либо в Терминале:

Схема использования: dd_rescue [options] infile outfile

— s ipos начальная позиция в исходном файле (default=0),
— S opos начальная позиция в целевом файле (def=ipos),
— b softbs размер блока для копирования (def=65536),
— B hardbs размер блока во время возникновении ошибок копирования (def=512),
— e maxerr окончание работы после установленного количества ошибок (def=0=infinite),
— m maxxfer максимальный объём копируемых данных (def=0=inf),
— y syncfrq частота запросов fsync к целевому файлу (def=512*softbs),
— l logfile имя файла для регистрации ошибок и вывода сводки (def=»»),
— o bbfile имя файла для регистрации номеров сбойных блоков (def=»»),
— r копирование данных в обратном направлении (def=forward),
— t очищать целевой файл перед записью (def=no),
— d/D использовать O_DIRECT для ввода/вывода (def=no),
— w окончание работы во время возникновения ошибок (def=no),
— a запись файла с пустотами (def=no),
— A всегда записывать блоки, заполняя нулями сбойные (def=no),
— i интерактивный режим: спрашивать перед перезаписью данных (def=no),
— f принудительный режим: пропустить ряд проверок (def=no),
— p сохранять права доступа и владельца файла (def=no),
— q минимум подробностей,
— v максимум подробностей,
— V вывести номер версии и выйти,
— h вывести данную справку и выйти.

dd_rescue -v /dev/cdrom Recovered.iso

recoverdm

Установить recoverdm можно как и все предыдущие, в данном обзоре, программы из Центра приложений, либо командой:

sudo apt-get install recoverdm

Схема использования: recoverdm -t type -i file/devicein -o fileout [-l list] [-n retries] [-s speed]

— t тип данных
— i откуда копируем
— o восстановленный файл
— l этот файл будет содержать смещение из плохих(!) блоков
— n количество попыток чтения прежде чем перейдет к следующему сектору
— s скорость чтения приводов CD/DVD (по умолчанию 1х)
— r количество повторов при чтении с RAW

recoverdm -i /dev/cdrom -o Recovered.iso

Ну вот в принципе и заканчивается данный обзор. Могу лишь написать, что по умолчанию программа recoverdm очень медленно копировала битый диск, в отличии от gddrescue и ddrescue. Я остановил свой на выбор именно на них.

Читайте также: