Это руководство - свободный документ: можете без ограничений копировать, распространять и изменять его.
This manual was translated by Joe Kickman.
GNU ddrescue - это инструмент восстановления данных. Копирует данные из одного файла или блочного устройства (жёсткий диск, оптический диск, твёрдотельный носитель) на другое, а в случае ошибок чтения - сначала считывать хорошие части.
Основные действия в программе автоматизированы. То есть, от Вас не требуется ждать до появления ошибки, останавливать программу, перезапускать копирование с новой позиции и т.п.
При использовании возможности mapfile (журналирования), данные считываются очень эффективно (только требуемые участки). В любой момент можно прервать восстановление - и продолжить позже с того же или с любого другого места. Mapfile (журнал) - важная часть эффективности ddrescue. Рекомендуется обязательно использовать журнал (кроме случаев, когда Вы точно знаете, что сможете работать без него).
Ddrescue, найдя нечитаемый сектор на входе, не пишет нули на выходе, и без запроса не сбрасывает содержимое выходного файла. Поэтому, каждый раз, при запуске на одном и том же выходном файле, программа старается заполнить пропущенные места, без стирания того, что уже скопировано.
Автоматическое объединение резервных копий. Если есть две или больше повреждённые копии одного файла (на CD, DVD и т.п.) - и запустить ddrescue на них по очереди с указанием одного и того же выходного файла, то, возможно, удастся получить целостный файл, без ошибок - потому что вероятность повреждения одних и тех же участков во всех копиях очень низка (если ошибки размещены случайным образом). С использованием mapfile (журнала) программа будет считывать только не скопированные ранее блоки из второй и следующих копий источника.
Ddrescue рекомендует сжимать резервные копии с помощью lzip, потому что формат lzip предназначен для долговременного архивирования и предоставляет возможности восстановления данных, отлично дополняющие возможности ddrescue. (Ddrescue заполняет нечитаемые секторы данными из других копий, а lziprecover исправляет повреждённые секторы с помощью данных других копий). В случае повреждения файла или носителя, сочетание ddrescue + lziprecover является наилучшим для восстановления данных из множества повреждённых копий. См. пример-lziprecover.
Ddrescue требуется произвольный доступ для работы с носителем, поэтому работа с устройствами последовательного, а не произвольного доступа - невозможна.
Ddrescue может использовать для чтения источника прямой доступ, в обход кэша ядра - если Ваша система поддерживает такую возможность.
У ddrescue есть ещё «режим заполнения», в котором можно выборочно перезаписывать части выходного файла. Несколько интересных применений: стирание данных, выявление и пометка плохих участков, а в некоторых случаях, «восстановление» «плохих» секторов.
Одна из сильных сторон ddrescue - безразличие к интерфейсу передачи данных, поэтому программа может работать с любым носителем, который поддерживает Ваше ядро: P-ATA, S-ATA, SCSI, старые MFM-диски, дискеты, твёрдотельные носители, карты памяти (например SD).
Ddrescue никогда не станет читать данные за пределами заданной рабочей области, кроме запросов на прямой доступ к диску, не выровненных по границам секторов (см. Прямой доступ). А если станет - сообщайте об ошибке.
Объём скопированных данных, число ошибок и т.п. сведения, отображаемые программой, могут меняться, даже стать = 0, если Вы ограничили заданную рабочую область. Спокойствие! Ничего не пропало, просто часть сведений выходит за пределы заданной рабочей области. На полной увидите всё.
Ddrescue является одним из мощнейших инструментов. Чтобы применять её безопасно, следует понимать, что она делает, и ещё понимать кое-что о машинах, с которыми она работает.
Никогда не пытайтесь копировать раздел, смонтированный в режиме чтения-записи, т.к. результат может оказаться безполезным. Наилучший вариант копирования устройства или раздела - когда они не примонтированы даже в режиме «только для чтения».
Никогда не пытайтесь восстанавливать файловую систему на устройстве с ошибками ввода-вывода, т.к. это может привести к ещё бОльшим потерям.
Если в качестве назначения используется целое устройство или любой его раздел, то там будут перезаписаны все данные.
Некоторые системы могут менять имена устройств при перезагрузках (например, системы на основе udev). После перезагрузки системы или обновления списка устройств хранения данных проверяйте имена устройств перед каждым новым запуском ddrescue.
Если копирование прервано, то перед перезагрузкой следует скрыть от ОС частично скопированные разделы, чтобы ОС не смогла их увидеть, примонтировать и автоматически применить «исправления».
GNU ddrescue не является производной от dd, и ни в какой степени не связана с ней - кроме, разве что, возможности копировать данные с одного устройства на другое. Ключевое отличие в том, что ddrescue использует разветвлённый алгоритм для копирования с повреждённых носителей, причиняя им как можно меньше вреда.
Ddrescue эффективно обрабатывает состояние текущего процесса копирования и старается сначала считывать хорошие части, откладывая чтение областей с задержками и ошибками. Это увеличивает объём данных, которые в итоге можно скопировать с повреждённого устройства.
Стандартную утилиту dd можно использовать для копирования данных с повреждённого носителя, но она читает данные последовательно, что может привести к износу/повреждению носителя и вообще не дать результата, если ошибки находятся в самом начале.
Другие программы считывают данные последовательно, но при ошибках чтения уменьшают размеры читаемых блоков. Это не есть хорошо, так как приводит к тратам времени на чтение областей с ошибками и задержками, к повреждению поверхности, головок и механики, вместо того, чтобы как можно скорее пропустить эти участки. Такое поведение снижает шансы на успешное копирование данных, оставшихся в хороших областях.
Алгоритм работы ddrescue следующий (можно прервать процесс в любой момент, нажав CTRL+C, но имейте в виду, что повреждённый носитель может надолго задержать отмену и выход, пока ядро не сообщит об ошибке):
1) (Необязательно) считывает mapfile (журнал), описывающий состояние остановленного процесса или multi-part rescue. Если журнал не указан, пуст или отсутствует, вся рабочая область будет помечена как непроверенная.
2) (Первая фаза; Копирование). Чтение всех непроверенных областей исходного файла, пометка несчитанных из-за ошибок блоков как "non-trimmed" и их пропуск. Пропуск медленных областей. (Пропущенные области будут прочитаны позже, в 4 дополнительных прохода (до зачистки), меняя направление чтения каждого прохода, до конца рабочей области.)
Второй проход разграничивает блоки, пропущенные первым проходом. Третий и четвёртый проходы читают блоки, пропущенные из-за медленного чтения (если таковые были) в том же направлении, в котором блоки были пропущены. Эти три прохода пропускают остаток блока при первой же ошибке. Последний проход - зачистка, проходит без пропусков. Цель многопроходности - сначала выделить большие ошибочные зоны для считывания в первую очередь хороших, ограничить размер журнала и предоставить адреса точек для уточнения границ ошибок (trimming).
Только непроверенные области считываются большими блоками. Trimming (уточнение границ), scraping (вычитывание) и retrying (перечитывание) выполняются по одному сектору. Каждый сектор считывается максимум 2 раза; сначала в этой фазе, как часть большого блока, а повторно в одной из следующих фаз - чтение одного сектора.
3) (Вторая фаза; Уточнение границ) Происходит в один проход. Для каждого необрезанного блока читает по одному сектору от начала вперёд до первой ошибки (bad sector). Затем читает по одному сектору обратно от конца блока до нахождения ошибки (bad sector). При нахождении плохих секторов помечает их как плохие, а всю область между ними как невычитанную, не пытаясь её читать. Если на границе уже находится bad sector, то участок признаётся уже уточнённым, далее не уточняется.
4) (Третья фаза; Вычитывание) Вычитывает все данные, не прочитанные при копировании или уточнении. Происходит в один проход. Каждый невычитанный блок читается вперёд, по одному сектору. Все найденные ошибки будут помечены как плохие сектора (bad sector).
5) (Чётвёртая фаза; Повторные попытки) Необязательно пробует заново считывать плохие секторы до достижения заданного числа повторов чтения. Направление чтения меняется при каждом следующем проходе. Каждый плохой сектор программа пробует читать только один раз за проход. Ddrescue не знает, сектор необратимо испорчен, или же он может быть случайно считан с нескольких попыток.
6) Необязательно ведёт журнал (mapfile) для использования позже.
Общий размер ошибок (errsize) - это сумма размеров всех блоков с плохими секторами. Увеличивается в фазах уточнения границ и вычитывания, и может уменьшаться в фазе повторных попыток. Не уточнённые и не вычитанные блоки ошибками не считаются. Ddrescue перечитывает блоки с ошибками, и успешно считанные данные могут разделить ошибочные блоки на меньшие части, уменьшая общий размер ошибок, но увеличивая их число.
«Оставшееся время» вычисляется по средней за последние 30 секунд скорости и не учитывает, что некоторые участки могут быть исключены из работы (например, параметром ‘--no-trim’), а некоторые области, возможно, невосстановимы. Поэтому оценка может быть очень неточной, значительно меняться во время работы и быть больше нуля в конце работы. В частности, может показать несколько секунд в начале работы и вырасти до часов и дней в следующих проходах. Такова природа ddrescue; хорошие части обычно считываются быстро, а остаток может занять долгое время.
Журнал периодически сохраняется на диске, сохраняется он и при завершении или прерывании работы ddrescue. Поэтому при сбоях можно продолжить копирование, считав минимум заново. По умолчанию, интервал сохранения меняется от 30 секунд до 5 минут в зависимости от размера файла журнала (большие сохраняются реже), но может быть задан прямо параметром '--mapfile-interval'.
Также, один и тот же журнал можно использовать для нескольких команд копирования разных участков с одного источника и для многих попыток копирования с разных участков. Смотрите вот этот пример:
Сначала прочитать наиболее важную область диска. ddrescue -i0 -s50MiB /dev/hdc hdimage mapfile ddrescue -i0 -s1MiB -d -r3 /dev/hdc hdimage mapfile Затем прочитать некоторые ключевые участки диска. ddrescue -i30GiB -s10GiB /dev/hdc hdimage mapfile ddrescue -i230GiB -s5GiB /dev/hdc hdimage mapfile И прочитать остальное (не читает заново всё то, что уже прочитано). ddrescue /dev/hdc hdimage mapfile ddrescue -d -r3 /dev/hdc hdimage mapfile
Формат запуска программы следующий:
ddrescue [параметры] INFILE OUTFILE [MAPFILE]
INFILE и OUTFILE могут быть файлами, устройствами или разделами. MAPFILE - это обычный файл, который должен находиться в существующей директории. Если файла нет, программа создаст его.
Всегда используйте MAPFILE (журнал копирования), кроме тех случаев, когда он Вам ТОЧНО не понадобится. Без него ddrescue не сможет продолжать прерванное / завершённое частично копирование, но сможет только лишь начать его заново.
ddrescue поддерживает работу со следующими параметрами:
Если BYTES = 0 (авто), минимальная скорость чтения пересчитывается для каждого блока как (средняя_скорость / 10). Значения за пределами возможностей устройства игнорируются.
Если Ваша система не поддерживает прямой доступ к диску, ddrescue предупредит об этом. Если размер сектора указан неверно, то программа выдаст ошибку "unaligned read error" и выйдёт с кодом завершения = 1.
Если Ваша система не поддерживает прямой доступ к диску, ddrescue предупредит об этом. Если размер сектора указан неверно, то программа выдаст ошибку записи, при этом не скопировав нисколько данных. В некоторых ОС есть ошибка, которая мешает им (верно или даже вообще) распознавать ошибки записи на некоторых устройствах, если не указан данный параметр.
Этот параметр производит одно дополнительное чтение после каждой ошибки, быстрее изнашивая устройство. Используйте только для устройств, которые перестают отвечать или выдают мусорные данные после ошибок. Возможно, перед повторным запуском ddrescue придётся выключить и заново включить устройство.
INITIAL - размер пропуска при первой ошибке или медленном чтении, в байтах, по умолчанию равно 64 KiB (65536). MAX - максимальный размер пропуска. Указанные значения будут округлены до кратных размеру сектора, вверх. Размер пропуска будет удвоен при каждой следующей ошибке или медленном чтении - до достижения значения MAX, а если MAX не указано, то либо до 1% размера исходного файла либо до 1 Гб (что меньше); будет восстановлен до INITIAL при успешном чтении блока. Допустимые значения - от 64 KiB до 1 GiB. Начальное значение 0 совсем отключит пропуск блоков.
Если у ddrescue проблемы с пропуском большой зоны с разрозненными ошибками или если на устройстве есть большие области с ошибками через повторяющиеся промежутки, этим параметром можно увеличить начальный размер пропуска. Наоборот, если ddrescue пропускает слишком много, оставляя большие непроверенные области после каждой ошибки (которые будут затем прочитаны в обратном направлении, обычно медленнее), можно уменьшить максимальный размер или совсем отменить пропускание.
'--skip-size' не зависит от '--cluster-size'. Размер пропускаемого участка вычисляется от конца нынешнего блока, прочитанного с ошибкой.
Этот параметр не задаёт размер выходного файла. Например, следующая команда создаст выходной файл размером 300 байт, но запишет в него только последние 200 байт данных:
ddrescue -i 100 -s 200 infile outfile mapfile
Заметим, что в режиме копирования ошибки записи являются критическими и заставят либо повторить копирование, либо скопировать выходной файл в другое место (третий носитель) с использованием журнала в качестве указателя рабочей области (см. --domain-mapfile) и продолжать уже там.
Похоже на '--timeout=0' (при котором программа ожидает обновления экрана статистики (как минимум, 1 секунду)), но и отличается. Если за 1 секунду был успешно прочитан хотя бы 1 сектор, ddrescue не завершит работу при указании '--timeout=0'.
Также похоже на '--max-errors=+0' (когда происходит выход при обнаружении новой области с ошибкой), но и отличается. Если области с ошибками чтения примыкают к уже существующим, то не будут созданы новые области с ошибками, а только лишь будут расширены имеющиеся, и '--max-errors=+0' не приведёт к завершению программы.
При возможности получения таковых, ddrescue покажет модели и серийные номера для входного и выходного устройств. Показывает ещё размеры в байтах для соответствующих файлов или устройств.
Примеры Запускаемые | СПИСКА проходы |
1 | 1 |
1,2,3 | 1, 2, и 3 |
2-4 | 2, 3, и 4 |
1,3-5 | 1, 3, 4, и 5 |
1-3,5 | 1, 2, 3, и 5 |
Также пишется строка в начале каждой фазы (копирование, уточнение границ, вычитывание, повторное чтение). Также, ежесекундно пишется строка с отметкой времени (если чтение не заняло более секунды). Применять осторожно, потому что ФАЙЛ может очень быстро стать огромным! Используйте lzip для сжатия ФАЙЛа при необходимости его хранения или передачи.
Числовые аргументы для параметров (адреса, размеры, скорости и т.п.) могут быть указаны в десятичном, шестнадцатиричном или восьмиричном виде (using the same syntax as integer constants in C++), и могут иметь множитель и необязательное 'B', означающее «байт». Множитель 's' может быть добавлен и к любому другому. Например, 'ks' обозначает килосекторы (1000 * sector_size), а 'Kis' означает кибисекторы (1024 * sector_size).
Таблица множителей (системы СИ и двоичных), для единиц измерения:
Prefix | Value | | | Prefix | Value |
s | sectors | | | ||
k | kilobyte (10^3 = 1000) | | | Ki | kibibyte (2^10 = 1024) |
M | megabyte (10^6) | | | Mi | mebibyte (2^20) |
G | gigabyte (10^9) | | | Gi | gibibyte (2^30) |
T | terabyte (10^12) | | | Ti | tebibyte (2^40) |
P | petabyte (10^15) | | | Pi | pebibyte (2^50) |
E | exabyte (10^18) | | | Ei | exbibyte (2^60) |
Z | zettabyte (10^21) | | | Zi | zebibyte (2^70) |
Y | yottabyte (10^24) | | | Yi | yobibyte (2^80) |
Статус/Код завершения:
0 при нормальном завершении,
1 для ошибок среды исполнения (файл не
найден, неправильные флаги, ошибки
ввода-вывода и т.п.),
2 при ошибке доступа к файлу-источнику
(повреждён или неверен),
3 при внутренней ошибке целостности (bug),
приведшей к панике и аварийному завершению
ddrescue.
Если работа ddrescue прервана по сигналу ОС, то ddrescue обновит файл журнала - и завершит работу с указанием полученного кода сигнала.
Структура файла журнала - не переведено - КРАТКО смысл:
# Комментарии - эти строки не значимы для программы, начинаются с "#"
Первая значимая строка:
адрес_текущего_блока состояние_работы номер_прохода
Коды состояний работы:
Символ | Значение |
'?' | копирование того, что ранее не пробовали читать |
'*' | уточнение границ блоков |
'/' | посекторное вычитывание внутри блоков, у которых начало и конец ограничены плохими секторами |
'-' | повторное чтение плохих секторов |
'F' | заполнение указанных блоков |
'G' | создание приблизительного файла журнала |
'+' | успешно завершённый блок |
Строки журнала (кроме первой значимой) строятся так:
адрес_начала_блока длина_блока код_состояния
Коды состояний блоков:
Символ | Значение |
'?' | блок, который не пробовали читать (non-tried) |
'*' | непрочитанный из-за ошибки блок, границы не уточнены (non-trimmed) |
'/' | непрочитанный из-за ошибки блок, не вычитано читаемое (non-scraped) |
'-' | непрочитанный из-за ошибки блок, нечитаемые секторы (bad-sector(s)) |
'+' | успешно скопированный блок |
Пример файла журнала:
# Mapfile. Created by GNU ddrescue version 1.22-pre3 # Command line: ddrescue -d -c18 /dev/fd0 fdimage mapfile # Start time: 2015-07-21 09:37:44 # Current time: 2015-07-21 09:38:19 # Copying non-tried blocks... Pass 1 (forwards) # current_pos current_status current_pass 0x00120000 ? 1 # pos size status 0x00000000 0x00117000 + 0x00117000 0x00000200 - 0x00117200 0x00001000 / 0x00118200 0x00007E00 * 0x00120000 0x00048000 ?
При редактировании файла можно использовать как десятичные, так и шестнадцатеричные, и восьмеричные значения - соблюдая синтаксис, как у целых констант языка C++, кроме значения current_pass (номер текущего прохода; оно должно быть в десятичном целом формате, т.е. одна цифра от 1 до 5).
Журнал нужен для продолжения копирования, а иногда требуется несколько дней для считывания с повреждённого носителя, поэтому ВАЖНО СОХРАНЯТЬ и ОБЕРЕГАТЬ :) журнал, например, от недостатка свободного места на диске, куда программа его пишет (его=журнал). При невозможности записи файла журнала программа выдаст сообщение с просьбой устранить проблемы и нажать ENTER. Можно попробовать выполнить аварийное сохранение, нажав E, затем ENTER. При невозможности записи программа повторно выдаст предупреждение.
Ddrescue может быть лучше, чем dd при копировании с записываемых оптических дисков, потому что два сектора lead-out в конце некоторых из них могут вызвать ошибку чтения, которая помешает dd прочитать ВСЮ ЦЕЛИКОМ последнюю запись, потенциально приводя к потере данных. Также dd может создать образ размером больше оригинального при указании 'sync' conversion и размера блока больше, чем размер сектора.
В некоторых случаях, специализированная программа наподобие dvdisaster может оказаться лучше, чем ddrescue - для восстановления данных с CD-ROM - так как dvdisaster может читать и анализировать CD-секторы в «сыром» режиме, чего не умеет делать ddrescue.
Записываемые диски CD и DVD хранят информацию ограниченное время (обычно несколько лет). По истечении этого времени развиваются процессы искажения данных (растущие ошибки чтения), от наружного края к внутреннему. Сделайте хотя бы 2 (а то и больше) копии каждого из записанных важных дисков, чтобы потом иметь возможность восстановить их с помощью ddrescue.
Если есть только одна копия CD-ROM/DVD (с ошибками чтения), но есть доступ к нескольким разным приводам, то шансы прочитать плохие секторы увеличиваются, т.к. один привод может иметь проблемы при чтении сектора, а другой может и «выжать» из него данные, в зависимости от частоты работы лазера и чувствительности лазерного приёмника, принимающего отражённый от диска луч.
Пример 1. Копирование с диска, примонтированного как /dev/cdrom
ddrescue -n -b2048 /dev/cdrom cdimage mapfile ddrescue -d -r1 -b2048 /dev/cdrom cdimage mapfile (если размер ошибок будет = 0, то файл cdimage содержит полный образ исходного диска CD-ROM - и можно записать его на новый пустой диск)
Пример 2. Копирование диска в /dev/cdrom с двух копий
ddrescue -n -b2048 /dev/cdrom cdimage mapfile ddrescue -d -b2048 /dev/cdrom cdimage mapfile (теперь вставить вторую копию в привод) ddrescue -d -r1 -b2048 /dev/cdrom cdimage mapfile (если размер ошибок будет = 0, то файл cdimage содержит полный образ исходного диска CD-ROM - и можно записать его на новый пустой диск)
Пример 3. Копирование диска в /dev/cdrom на двух разных компьютерах с сохранением образа на USB-устройстве, примонтированном как /mnt/mem
ddrescue -n -b2048 /dev/cdrom /mnt/mem/cdimage /mnt/mem/mapfile ddrescue -d -r1 -b2048 /dev/cdrom /mnt/mem/cdimage /mnt/mem/mapfile (размонтировать USB-устройство и перенести его и диск на второй компьютер) ddrescue -d -r1 -b2048 /dev/cdrom /mnt/mem/cdimage /mnt/mem/mapfile (если размер ошибок будет = 0, то файл cdimage содержит полный образ исходного диска CD-ROM - и можно записать его на новый пустой диск)
Пример 4. Объединение частично скопированных образов 3 одинаковых DVD дисков, используя журналы для задания рабочих областей
ddrescue -m mapfile1 dvdimage1 dvdimage mapfile ddrescue -m mapfile2 dvdimage2 dvdimage mapfile ddrescue -m mapfile3 dvdimage3 dvdimage mapfile (если размер ошибок будет = 0, то файл dvdimage содержит полный образ исходного DVD-диска - и можно записать его на новый пустой DVD-диск)
Пример 5. Копирование сжатой с помощью lzip резервной копии с двух копий CD, с проверкой ошибок и объединением копий (См. руководство по lziprecover для получения более подробных сведений)
ddrescue -d -r1 -b2048 /dev/cdrom cdimage1 mapfile1 mount -t iso9660 -o loop,ro cdimage1 /mnt/cdimage cp /mnt/cdimage/backup.tar.lz rescued1.tar.lz umount /mnt/cdimage (вставить в привод диск со второй копией) ddrescue -d -r1 -b2048 /dev/cdrom cdimage2 mapfile2 mount -t iso9660 -o loop,ro cdimage2 /mnt/cdimage cp /mnt/cdimage/backup.tar.lz rescued2.tar.lz umount /mnt/cdimage lziprecover -m -v -o backup.tar.lz rescued1.tar.lz rescued2.tar.lz Input files merged successfully. lziprecover -tv backup.tar.lz backup.tar.lz: ok
Это руководство для тех, кто уже умеет использовать dd. Если Вам не знакома dd, лучше сначала поискать [в интернете] вводные материалы по dd и GNU ddrescue.
Повреждённый носитель часто с течением времени увеличивает число ошибок чтения при работе с ним. Из-за этого после того, как замечена первая ошибка, следует как можно скорее скопировать данные. Будьте прилежны, ибо при каждом включении повреждённого диска и чтении с него данных, это включение и работа могут стать для него последними.
Следует сделать копию проблемного носителя с помощью ddrescue, а затем уже работать с этой копией (для логического восстановления). Если данные очень важные, то сделайте ещё и вторую копию с первой копии. Если что-то пойдёт «не так», можно восстановиться из первой копии и пробовать ещё.
При попытке восстановления целого раздела, сначала исправьте полученную копию раздела подходящей для его ФС программой, затем примонтируйте исправленную копию и пробуйте восстанавливать с неё файлы.
А если исходный носитель настолько повреждён, что файловая система скопированного раздела не может быть восстановлена или примонтирована, придётся смотреть данные в шестнадцатеричном редакторе и вручную восстанавливать нужное, или пробовать использовать программы типа photorec.
Если повреждена таблица разделов, можно пробовать скопировать весь диск, затем восстановить таблицу разделов и сами разделы.
Если исходный носитель отсутствует как диск в списке устройств системы
(/dev/ для Linux; "Диспетчер устройств - Диски" для Windows), то скопировать с него ничего нельзя. По крайней мере, с помощью ddrescue.
Для примеров восстановления информации с оптических дисков - см. главу 8.
Пример 1: Копирование всего диска /dev/hda с
двумя разделами ext2 - на диск /dev/hdb.
Примечание: не требуется заранее создавать
разделы на /dev/hdb; если таблица разделов на
/dev/hda повреждена, придётся её как-то
реконструировать уже после копирования на
/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: Копирование раздела ext2 с /dev/sda2 на
/dev/sdb2.
Примечание: Следует заранее создать раздел
/dev/sdb2 в таблице разделов на /dev/sdb -
соответствующего типа и размера.
ddrescue -f -n /dev/sda2 /dev/sdb2 mapfile ddrescue -d -f -r3 /dev/sda2 /dev/sdb2 mapfile e2fsck -v -f /dev/sdb2 mount -t ext2 -o ro /dev/sdb2 /mnt (и читать восстанавливаемые файлы из /mnt)
Пример 3: При копировании всего диска /dev/hda на диск /dev/hdb - /dev/hda застыл на позиции 12345678.
ddrescue -f /dev/hda /dev/hdb mapfile # /dev/hda застыл (перезапустить /dev/hda или выключить и включить компьютер) (перезапустить копирование на безопасном расстоянии от проблемы) 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 перестал отвечать и исчез из списка устройств.
ddrescue -f -n /dev/hda /dev/hdb mapfile # /dev/hda здесь исчез (перезапустить /dev/hda или выключить и включить компьютер и перезапустить копирование той же командой столько раз, сколько потребуется, вплоть до успешного завершения) ddrescue -d -f -r3 /dev/hda /dev/hdb mapfile
В последнее время часто не срабатывал (изменения в ядре или в прошивках новых дисков???).
Когда ddrescue запущена с параметром --fill-mode - она действует в «режиме заполнения», который отличается от обычного режима копирования. А именно, при использовании параметра "--fill-mode" ddrescue ничего не читает и не копирует. Она только лишь заполняет данными из входного файла INFILE блоки в выходном файле OUTFILE, у которых в журнале MAPFILE статус совпадает с одним из типов, указанных в качестве аргументов к параметру "--fill-mode".
Если аргумент у параметра "--fill-mode" содержит "l", ddrescue запишет в каждый заполняемый сектор сведения о его размещении (позицию, номер сектора и статус). Когда таким образом будут заполнены нечитаемые секторы, возможно будет попробовать повторить чтение областей, где расположены важные данные, т.к. при просмотре частично скопированных файлов будут видны адреса непрочитанных секторов.
В режиме заполнения входной файл INFILE может быть любого размера. Если он слишком мал, то его данные будут записаны несколько раз - столько, сколько нужно, чтобы заполнить буфер для записи в выходной файл. Если входной файл слишком велик, то из него будет прочитано только нужное количество байтов. Затем данные из буфера будут записаны в каждый требуемый сектор или кластер выходного файла.
В режиме заполнения исходный файл всегда читается с позиции 0, то есть, с начала. Если будет указан параметр "--input-position", то он будет использован для исходного входного файла, с которого шло копирование и запись журнала - и этот параметр будет использован лишь для вычисления смещения между входным и выходным файлом.
Заметьте также, что при заполнении того (исходного) файла, с которого шло первоначальное считывание данных, не следует указывать "--output-position", а при заполнении выходного файла OUTFILE (содержащего скопированную информацию), следует использовать то же смещение между "--input-position" и "--output-position".
Параметр "--fill-mode" включает действие параметра "--complete-only".
В режиме заполнения файл журнала MAPFILE обновляется, чтобы позволить продолжать работу после сбоя. Но поскольку ничего не копируется, то журнал не портится и не уничтожается. Единственное, что меняется в журнале, это строка статуса (текущая обрабатываемая позиция).
У режима заполнения есть несколько интересных применений.
Может пригодиться для стирания личных данных перед отправкой диска для замены по гарантии; для попыток "лечения" "плохих" секторов с неверными контрольными суммами (soft-bad-sectors), для заполнения нескопированной зоны в выходном файле узнаваемым образцом, чтобы облегчить поиск пострадавших файлов.
Рассмотрим следующие примеры:
Пример 1. Пометить части в полученной копии, чтобы иметь возможность найти их в шестнадцатеричном редакторе или поиском по файлам. Например, следующая команда заполнит все блоки, помеченные как "-" (нечитаемый сектор) копиями строки "BAD SECTOR ":
printf "BAD SECTOR " > tmpfile ddrescue --fill-mode=- tmpfile outfile mapfile
Пример 2: Затереть только хорошие секторы, не трогая плохие. Таким образом, диск будет при проверке иметь плохие (нечитаемые) секторы. Это самый быстрый способ стирания данных с проблемного диска, и он особенно хорош при отправке диска для замены по гарантии.
ddrescue --fill-mode=+ --force /dev/zero bad_drive mapfile
Пример 3: Заставить диск переписать или
переназначить плохие секторы, чтобы он
снова стал пригодным для работы (убрать
«нестабильные секторы», атрибут «Pending Sectors»
в SMART). Если у диска всего лишь несколько
нечитаемых секторов, и они возникли не от
износа по старости диска, можно
попробовать просто перезаписать эти
секторы, и диск сам с ними справится
(поправит контрольную сумму или
переназначит их резервными секторами,
которые есть у дисков как раз для таких
случаев).
ПРЕДУПРЕЖДЕНИЕ: работает не для всех диков.
ddrescue --fill-mode=- -f --synchronous /dev/zero bad_drive mapfile
Также, режим заполнения может помочь выяснить, независимо от файловой системы, какие файлы пострадали (частично или полностью). Выполните следующие шаги:
1) Скопируйте с помощью ddrescue с повреждённого диска всё, что сможете, пока не получите сообщение о завершении. Не используйте разреженную запись (sparse). Таким образом, в журнале будут только завершённые блоки (+) и нечитаемые (-).
2) На копии (это диск, раздел или файл-образ) заполните блоки с плохими секторами строкой, не присутствующей ни в одном файле, например, "DEADBEEF". Используйте '--fill-mode=l-', если требуется вписать ещё данные о размещении.
3) Смонтируйте полученный клон (диск/раздел/образ) в режиме только чтения.
4) С помощью grep ищите заданный в заполнении образец во всех файлах. Файлы, содержащие заданный образец, находятся (как минимум частично) в повреждённых областях диска. Но если все повреждённые/нечитаемые секторы не были заняты файлами, grep не найдёт указанный образец ни в одном файле, что означает, что ни один файл не пострадал.
5) Запишите данные о размещении тех файлов, которые хотите попробовать дочитать.
6) Размонтируйте клон/диск/раздел/образ.
7) Пробуйте с помощью ddrescue повторно читать секторы, принадлежащие нужным файлам, до тех пор, пока они либо будут прочитаны, либо станет ясно, что их не прочитать.
8) При желании можно заполнить нескопированные участки клона/образа вместо ранее указанного текстового образца шестнадцатеричными нулями.
Пример 4. Выяснить, в каких файлах были нечитаемые секторы:
ddrescue -b2048 /dev/cdrom cdimage mapfile printf "DEADBEEF" > tmpfile ddrescue --fill-mode=l- tmpfile cdimage mapfile rm tmpfile mount -t iso9660 -o loop,ro cdimage /mnt/cdimage find /mnt/cdimage -type f -exec grep -l "DEADBEEF" '{}' ';' (note that my_thesis.txt has a bad sector at pos 0x12345000) umount /mnt/cdimage ddrescue -b2048 -i0x12345000 -s2048 -dr9 /dev/cdrom cdimage mapfile ddrescue --fill-mode=- /dev/zero cdimage mapfile mount -t iso9660 -o loop,ro cdimage /mnt/cdimage cp -a /mnt/cdimage/my_thesis.txt /safe/place/my_thesis.txt
Если имеется образ/клон после работы другой программы, то ddrescue может создать файл журнала, считая, что все секторы, содержащие только 00h (0x00) - не прочитаны.
Помогает при обработке файлов журналов от/для ddrescue.
To be translated.
В работе ddrescue могут быть ошибки. И конечно же, имеются неточности и упущения в данном руководстве. Если Вы о них сообщите, они будут исправлены. Если не Вы, то никто и никогда о них не узнает - и они будут оставаться тут веки-вечные, если не больше.
Итак, о найденных ошибках: пишите письма электронной почтой на адрес: bug-ddrescue@gnu.org. Сообщите и номер версии (его можно увидеть, запустив 'ddrescue --version').
Автор, Антонио Диаз, быстро и охотно отвечает, внедряет дельные предложения, выпускает новые доработанные улучшенные версии.