IP-телефония на базе Asterisk*
8(3532) 40-95-05
8(3537) 20-30-40
Viber Out:+883510008211052 ddrecovery

ddrecovery

Posted in Справочный материал

Спасаем данные

«Input/output error» сказала система при копировании файла и заставила погрузиться в неприятные раздумья о новом винчестере и подлом партизане SMART. К счастью все важные данные сохранились в резервных копиях, и всё-же постараться вытащить один файл очень хотелось — 34Гб образ виртуальной машины содержал в себе несколько документов потерять которые было бы неприятно.
Делать образ всего диска оказалось не лучшей идеей — место для этого отсутствовало, а ставить ещё один жёсткий очень не хотелось, вдобавок структура диска была цела и доступ к отдельным файлам оставался возможным. На помощь пришла утилита ddrescue, задача которой копировать файлы чтение которых затруднено — в первую очередь различных оптических дисков, но и жёстких дисков в нагрузку.

Первым делом потребовалось скачать утилиту — она идёт в стандартных пакетах Ubuntu(под именем gddrescue), но достаточно старой версии и некоторые полезные возможности не содержит.
По адресу ftp.gnu.org/gnu/ddrescue/ находится релиз 1.10, собирается простым набором «./configure && make && make install» и сразу готов к работе.

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

Первый проход запускается командой

ddrescue --no-split --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

т.е. отключаем повторные чтения и попытки минимизировать проблемные зоны, указываем откуда и куда копировать и файл лога. Понятно что копировать файл на тот-же диск идея плохая. Исходная файловая система ext3, раздел куда копируется ext2.

Лог восстановления — параметр не обязательный, но при многопроходном варианте нужен, и если в первый проход его создать забыли, то можно использовать --generate-logfile, полученный лог будет больше оптимального, но для дальнейших проходов полностью подойдёт.

В моём случае первый проход занял больше дня и сообщил о следующем
rescued: 22093 MB, errsize: 12264 MB, errors: 3876
картина не самая приятная, но уже что-то, начинаем второй проход.

ddrescue --direct --max-retries=2 --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

теперь пробуем прочесть диск в режиме прямого доступа и с 2 повторными попытками. Это число можно увеличивать, но в моём случае это только увеличивало время и результатов не приносило. (А вот при копировании CD вполне может дать результат).

Второй проход занял ещё около 15 часов, причём значительно улучшил картину:
rescued: 34292 MB, errsize: 65220 kB, errors: 16659
но попробуем вернуть остатки

ddrescue --retrim --max-retries=2 --verbose /media/disk-1/broken.vdi /media/disk-4/fixed.vdi /media/disk-4/rescue.log

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

Через два часа восстановление прерываю, результат
rescued: 34293 MB, errsize: 64579 kB
понятно что резкого улучшения ждать не стоит. С другой стороны для файлов небольшого размера (10-100мб) именно третий проход давал максимум данных, так что зависит от везения и характера проблем.

Образ был успешно добавлен в VirtualBox, проверен стандартным chkdsk и все необходимые данные скопированы, погибшие 60 мегабайт пришлись на системные файлы. Времени на всё ушло чуть более двух суток, что конечно много, но приемлемо.

Копирование разделов жёсткого диска

Используется 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.

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

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

  • Наши клиенты:

    OOO Газпром межрегионгаз Оренбург    
    ООО "Газпром межрегионгаз Оренбург" Жилой комплекс Экодолье Оренбург Сеть магазинов бытовой техники "Айсберг"
  • Наши клиенты:

          
     Сеть магазинов мебели "Мягков" Администрация г.Орска Орский шпалопропиточный завод
  •   
     Сеть магазинов "Строительный БУМ" ЗАО "Орский завод синтетического спирта" Региональная торговая компания "ШАР"
  •    
     Телерадиокомпания "Евразия" Производственное объединение "Климатвентмаш" Оренбургская региональная сеть
    "Рекламная кампания"
  •  Оператор интернета и тв
    ООО "ОрскТелеком"
    МУП "Орская городская аптека" Автосалон "Вояж"
  • fort
    ozemi gost
    Отель "Фортеция" ЗАО "Завод электромонтажных изделий" Объединенная служба такси
  • novupak 
    logo ormash1  
    Производство и продажа полиэтиленовой пленки

    АО "Орский Машиностроительный завод"

     
Powered by Warp Theme Framework
������.
Яндекс.Метрика