Site Mascot
 

Не удивляйтесь, сайт переехал: был http://smacker.fatal.ru, стал http://smacker.heliohost.org.

dd_rescue & ddrescue

06.02.2007 15:07

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

 

CHORUS:
Bad blocks, bad blocks
Whatcha gonna do, whatcha gonna do
When they come for you
(Repeat)

 

Итак, ситуация довольно простая: есть носитель и есть сбойные блоки. Хорошо, если диск бросовый и о нём можно не думать. Однако если данные представляют определённый интерес, то встаёт вопрос о копировании. И тут мы сталкиваемся с тем, что стандартные утилиты Unix* (dd, к примеру) обладают крайне ограниченной устойчивостью по отношению к ошибкам при чтении исходного носителя. Приведу пример: мне доводилось копировать диск, на котором было битых секторов примерно на 50 мегабайт, компактно рассованных в три группы. dd в такой ситуации после некоторого времени просто начинал тупить, копировать не копировал, но и диск вынуть не давал, а readcd хотя и вгрызался в бэды, до конца даже первой группы так ни разу и не дошёл, несмотря на мои старания, вылетая с ошибкой.
Однако — хвала Пингвину — у нас есть утилиты повышенного класса устойчивости. Это dd_rescue и ddrescue. Не надо их путать и не надо думать, что между ними есть какая-то преемственность, это не так. Они просто были созданы для одной и той же задачи.

 

dd_rescue
Страница программы: http://www.garloff.de/kurt/linux/ddrescue/

 

Именно с этой программы началось моё знакомство с боевым софтом для борьбы с царапанными дисками и битыми винчами. Итак, dd_rescue копирует данные из одного файла (или блочного устройства) в другой. Синтаксис вызова отличается от dd, а именно:
 ИСПОЛЬЗОВАНИЕ: 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 не смогла осилить, но это была RW-болванка, записанная поверх пятен чего-то вроде варенья на защитном слое, т.е. всё равно что с пробитой гвоздём дыркой. Это, как говорится, не лечится;
- Возможность дозаписи в файл без лишних телодвижений — в то время как тот же dd очистит целевой файл перед использованием;
- Различный размер блоков для нормальных и сбойных областей носителя. Единственное, что меня смущает, так это периодическая привязка в документации меньшего размера блока к размеру блока устройства. Между тем, в моём понимании, при использовании, к примеру, -B 1 будет происходить побитное копирование носителя, т.е. указание значения, меньшего размера блока, так же имеет смысл. Поправьте меня, если я не прав, и указание hardbs меньше размера блока устройства — чушь;
- Можно заполнять сбойные блоки нулями, а можно их просто пропускать;
- Можно оставлять «дыры» в целевом файле (если это поддерживает ФС с целевым файлом);
- Можно копировать задом наперёд, от конца файла к началу.

 

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

 

ddrescue
Страница программы: http://www.gnu.org/software/ddrescue/ddrescue.html

 

Об этой программе я узнал практически на днях, так что толком попользоваться ей не успел. Однако умолчать о ней не могу.
Логика работы программы отличается от dd_rescue. Если там надо было самому подбирать размеры секторов, играть с направлением копирования и прочим, то здесь воплощён алгоритм автоматического восстановления данных. Сначала считывается лог-файл от предыдущего сеанса (если есть), затем считываются только здоровые блоки, затем программа пытается восстановить битые блоки, разбивая их на всё меньшие части, добиваясь безошибочного считывания максимума информации. Когда будет достигнут размер блока, равный размеру блока устройства, ddrescue начнёт восстанавливать информацию в них посредством многократного считывания.
 Использование: ddrescue [options] infile outfile [logfile]
 Options:
   -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                максимум подробностей 

 

Так же, как и dd_rescue, эта утилита по умолчанию не очищает целевой файл. Однако есть и интересная особенность, отличающая эту программу. Если использовать несколько повреждённых копий одного и того же носителя, считывая их одну за другой и используя тот же целевой файл и лог-файл, то в результате получим полностью (в идеале) восстановленную копию! Дело в том, что ddrescue умеет соотносить данные лога и носитель таким образом, чтобы считывать с каждой следующей копии только те блоки, которые не удалось восстановить в предыдущие заходы, достраивая ими целевой файл.
В отличие от dd_rescue, к этой программе есть куда более полное руководство, доступное по info ddrescue.

 

Послесловие
Итак, я всего лишь указал на существование таких замечательных утилит, поэтому на звание «обзора месяца» никоим образом не претендую. Как говорит автор dd_rescue, «надеюсь, эта программа вам никогда не понадобится, а если понадобится — надеюсь, вы найдёте её полезной».
  1. Галабурдин Сергей
    Email: galaburdin гав-гав mail.ru  
    Кое что из опыта ...
    Я давно слежу за Вашим творчеством, рад, что оно не глохнет, более того набирает силу и даже матереет, что заметно в нахождении "генеральной" линии сайта. Но, ближе к телу. Я недавно прочел про dd_rescue и ddrescue. И как раз у меня появился DVD диск с кучей нечитаемых данных. История проста - польстился на дешевку и купил (в магазине!) мультики дочке, хотел порадовать "Незнайка на Луне!" - моё детство, пусть посмотрит на чем рос папка! Так это х#$%@ь не читается, к сожалению чек уже был выброшен, вернуть невозможно(как назло!) И тут такое дело - Ваш обзор! У меня АСПЛинукс 11.2, скачал програмульки, установил, даже не знаю как сказать. Скорость считывания 512 байт в секунду, файл 1Гб будет читаться почти 600 часов! К качеству претензий нет - то, что прочитано более чем великолепно, мелкие помехи (или как их называет дочка фокусы-мокусы!) не в счет, смотреть можно (я куплю нормальный диск попозже), но дело чести прочитать эту пакость, жена уже косо смотрит на Линукс! Вот в чем беда ddrescue я тоже еще не пробовал, попробую сегодня, а вот dd_rescue даёт такой глю, или я что-то делаю не так: при старте с указаной позиции он быстренько читает файл сначала, но по мере нарастания ошибок он начинает скидывать скорость и я уже третий день не могу продвинутся не на мегабайт, я застрял на 612.7Мб и далее не с места, оставить включенной машину на целый месяц включенной я не могу - ИБП нет, пожарную безопасность никто не отменял(дом старый, проводка гнилая!) Праздники он у меня отпахал, а сейчас затык. Я даже начал читать файл с конца, там получше, то есть максимальное количество повреждений в середине. Но старт с указанной позиции при реверсивном чтении не работает, уменьшение размера считываемого блока только замдлило работу, скорость растет при забое нулями, но сразу падает качество восстановления! Может чего посоветуете?
    [ Запись от 14.05.2007, отправлена в 4:45 ]
  2. Галабурдин Сергей
    Email: galaburdin гав-гав mail.ru  
    Упсссс...
    Мои извинения за размножение, тут у Вас какая-то заминка с большими комментариями из Оперы. Я в Опере пытался написать комментарий, Опера запросила файл comment.txt я его создал, да вот беда до этого нажал на вставку три раза, пока сообразил почему ничего не происходит. Вот такая байда.
    [ Запись от 14.05.2007, отправлена в 4:48 ]
    Ничего страшного
  3. лала
    Email: pokemonius гав-гав mail.ru  
    срочно
    Здравствуйте уважаемый.. Статья очень интересная и познавательная.. сам ничего об этой программе не знал, прочел впервые на этом самом сайте..
    У меня тоже случилась беда.. очень нужна помощь понимающего человека в этом всем..
    очень прошу, напишите мне если у вас будет такая возможность.. мыло pokemonius@mail.ru.. это очень важно и срочно для меня.. надеюсь поможите! заранее спасибо!
    [ Запись от 10.06.2011, отправлена в 17:15 ]
  4. Я буду рад, если вы оставите свой отзыв об этой заметке:

    Никнейм

    Email

    URL

    Заголовок комментария

    Проверка на человечность
    - Введите буквы:
    The CAPTCHA image