Максимальное восстановление данных со старых дискет с заполненными плохими секторами и несколькими проходами

Максимальное восстановление данных со старых дискет с заполненными плохими секторами и несколькими проходами

У меня есть коллекция старых 3,5-дюймовых дискет, с которых я хочу восстановить как можно больше данных.

Проблема связана со структурой некоторых файлов. Мне нужно сохранить длину всех файлов, то есть все поврежденные сектора должны быть дополнены (краткая причина в том, что некоторые файлы являются файлами Acorn ADFS, в которых данные и код объединены. Код ссылается на данные как на смещение от начала файла. Чтение формата ADFS не является проблемой в Linux, проблема заключается в дополнении поврежденных секторов).

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

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

дд

Я посмотрел на dd, и вот эта команда обещала для первого запуска:

dd if=/dev/fd0 of=adfs.img conv=noerror,sync

Последовали последующие звонки

dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc

Где:

Нет ошибкиозначает, что ошибки игнорируются

синхронизироватьозначает, что плохие сектора дополняются нулевым символом

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

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

Так что dd не выглядит подходящим.

ddrescue

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

Первый проход для чтения только блоков без ошибок

ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile

для первого прохода и последующих проходов для заполнения ошибок

ddrescue -d -r3 /dev/fd0 output.img log/output.logfile

Где

Прямой доступ к диску. Игнорировать системный кэш

--без царапинилипропустить фазу очистки

-пpreallocate — предварительно выделяет дисковое пространство перед восстановлением, т.е. выходной файл будет иметь тот же размер, что и входной файл/устройство

-р3повторить проверку плохих секторов 3 раза (используется на 2-м проходе и далее)

но проблема в том, что ddrescue, похоже, не дополняет плохие сектора по мере их появления. С установленным -p, похоже, все дополнения будут в конце файла, а смещения данных от начала файла не будут сохранены, как требуется.

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

Вопрос

Итак, мой вопрос состоит из трех частей:

  1. верно ли, что ddrescue НЕ дополняет восстановленный файл даже с установленным параметром -p?

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

и

  1. Знаете ли вы какую-либо лучшую команду / программу / скрипт для того, чтобы сделать то, что я пытаюсь сделать - максимальное восстановление данных посредством нескольких проходов чтения поврежденного диска с заполнением поврежденных секторов?

Я использую Ubuntu 18.04, версия dd (coreutils) 8.28 и версия GNU ddrescue 1.22, обе из репозиториев Ubuntu.

Спасибо, как всегда, за любую помощь.

решение1

GNU-редактор восстановления— это правильный инструмент для восстановления, которое вы пытаетесь осуществить.


1) верно ли, что ddrescue НЕ дополняет восстановленный файл даже с установленным параметром -p?

Это предположение неверно. Вас может смутитьруководствоговоря это:

Ddrescue не записывает нули в выходные данные, когда находит плохие сектора на входных данных, и не обрезает выходной файл, если об этом не поступает запрос.

Это просто означает, что нули не записываются на место плохих секторов. То, что должно быть в этих плохих секторах, просто не заполняется. Если вы пишете на пустой диск или в файл,Незаписанные области в пункте назначения будут считаны как нули.(нулевые байты).

Кроме того, опция -p/ --preallocateне имеет ничего общего с "padding". Она означает "preallocate". В поддерживаемых файловых системах опция гарантирует, что на целевом диске достаточно места для хранения исходного диска.


2) Есть ли способ сделать так, чтобы он был мягким?

Файл, выводимый GNU ddrescue, логически имеет ту же структуру, что и исходный диск. Блок, считанный из источника, идет в ту же позицию в пункте назначения. Вы даже можете обратить все восстановление ( -R/ --reverse), и блоки будут заполнены в обратном порядке, все еще в правильных местах.


3) Знаете ли вы какую-либо лучшую команду/программу/скрипт для того, чтобы сделать то, что я пытаюсь сделать - максимальное восстановление данных посредством нескольких проходов чтения поврежденного диска с заполнением поврежденных секторов?

GNU ddrescue делает именно то, что вам нужно. Он может делать несколько проходов ( -r/ ), а желаемое "заполнение" плохих секторов является поведением GNU ddrescue по умолчанию. Из--retry-passes=nруководство:

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

Чтобы внести полную ясность и развеять вашу обеспокоенность тем, что успешное считывание, за которым следует неудачное считывание, будет «дополнено» нулем,ddrescue не будет пытаться перечитать успешно прочитанное―нет необходимости, потому что данные уже восстановлены. Mapfile — это то, как ddrescue узнает, что он уже восстановил, а что не смог восстановить.

Связанный контент