Мне нужно спасти данные с жесткого диска размером около 2 ТБ, и я делаю это в некоторых Live-Linux на некоторых виртуальных машинах, где проблемный жесткий диск подключен к USB 3, а виртуальная машина предоставляет виртуальный диск необходимого размера локально. получить данные. Затем я выполнил следующий вызов, просто чтобы посмотреть, как идут дела:

ddrescue -f /dev/sdc /dev/sdb /mnt/sda1/ddrescue.map

sdc - это испорченное устройство на USB, sdb - это виртуальный диск для получения данных, sda1 - для временного хранения и форматирования с использованием Ext4.

Все стало работать быстро, ddrescue смог прочитать ~ 45 ГБ данных за считанные минуты, затем все резко замедлилось, считывая только несколько байтов в секунду в течение нескольких дней. Таким образом, устройство было явно сломано в этих частях, и я попытался просто пропустить те, которые использовали несколько вызовов различных --input-position=[...]GB один за другим. В зависимости от того, куда я прыгнул, вещи снова начали быстро читаться, пока они снова не стали медленными, и я снова не прыгнул, используя другой вызов. Важно отметить, что позиция ввода и вывода, напечатанная ddrescue , всегда была синхронизирована! Я также ничего не менял вручную в предоставленном файле карты, не удалял его или что-то в этом роде, он всегда был одним и тем же файлом и управлялся только самим ddrescue .

После этого я немного изменил подход и решил больше не использовать --input-position вручную, а вместо этого следующее:

ddrescue -f --min-read-rate=1MB --skip-size=1MB /dev/sdc /dev/sdb /mnt/sda1/ddrescue.map

Поэтому всякий раз, когда ddrescue распознавал медленные части, он пропускал разумные битые блоки данных и продолжал чтение. Опять же, положение входа и выхода было синхронизировано, и счетчик считанных и восстановленных данных все время увеличивался. К моменту завершения ddrescue сказано, что он спас ~ 650 ГБ данных.

Проблема заключается в том, что после окончательного просмотра самих файлов виртуального диска кажется, что на самом деле хранится только ~ 160 ГБ данных. Кроме того, время последней записи было слишком старым. По какой-то причине ddrescue считал, что читает много данных, но, похоже, неправильно записал их в тех местах на виртуальном диске, где он считывал их с разбитого диска. В конце концов, насколько я понимаю, виртуальный диск должен был иметь, по крайней мере, размер ddrescue указанный для объема спасенных данных.

У меня такое ощущение, что ddrescue правильно прочитал все данные, которые он сказал, но просто переписал уже спасенные данные при последующих вызовах. Так что, хотя я предполагаю, что он распознал --input-position для чтения, он, кажется, записывал всегда, начиная с позиции 0 снова в цели.

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

-o bytes
--output-position=bytes
Starting position of the image of the rescue domain in outfile, in bytes.
Defaults to '--input-position'. The bytes below bytes aren't touched if 
they exist and truncation is not requested. Else they are set to 0.

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

-t
--truncate
Truncate outfile to zero size before writing to it. Only works for regular
files, not for drives or partitions.

Итак, есть идеи о том, что могло пойти не так? Были ли мои множественные вызовы с разными значениями для --input-position уже неправильными? Связано ли это с чтением и записью на диски вместо разделов или файлов?

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

Спасибо!

3 ответа3

0

Безопасно ли использовать несколько разных --input-position с ddrescue?

Похоже, я пропустил этот пример раньше, но на самом деле это то, что я сделал, и это говорит о том, что мой подход поддерживается:

Example 5: While rescuing a partition in /dev/sda1 to the file hdimage, /dev/sda1 stops responding and begins returning read errors, causing ddrescue to mark the rest of the partition as non-scraped.
     ddrescue -n /dev/sda1 hdimage mapfile        <-- /dev/sda1 fails here
       (restart /dev/sda or reboot computer)
     ddrescue -n -A -i<pos> -O /dev/sda1 hdimage mapfile
       (if /dev/sda1 fails again, restart /dev/sda or reboot computer and
        then repeat the above command as many times as needed until it
        succeeds. <pos> is the position where the drive stopped responding)
     ddrescue -d -r3 /dev/sda1 hdimage mapfile

https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Examples

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

Так что, похоже, высока вероятность того, что проблема в моем случае иная, особенно слишком старая отметка времени, которую, как мне кажется, я узнал, странно. Может быть, я просто пропустил сообщения о том, что ddrescue по какой-то причине не пишет на реальное целевое устройство. Сама виртуальная машина также находилась на другом USB-накопителе, возможно, были некоторые ошибки подключения, которые приводили к тому, что Live-Linux пропускал устройство во время работы или около того. Я мог легко пропустить такие ошибки в dmesg -T из-за всех зарегистрированных ошибок чтения.

Похоже, мне нужно повторить весь процесс ...

0

Я прочитал руководство по ddrescue , и нигде не умирает упоминание о возможности нескольких параметров input-position .

Этот параметр всегда упоминается как "a" или "the", поэтому кажется, что он должен быть уникальным.

Источником вашей проблемы может быть эта фраза из руководства:

Обратите внимание, что вы должны оставить исходное смещение между «--input-position» и «--output-position» исходного спасательного прогона.

Кажется, это согласуется со следующим другим пунктом:

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

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

Если части мета-таблиц диска были повреждены, вы можете увидеть меньше данных, чем было фактически спасено, потому что ни один файл не содержит этих частей.

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

-1

Поскольку man-страница ddrescue длинная, использование ddrescue сильно отличается в зависимости от цели и уровня пользователя. По сути, если вы используете Live Linux, вам лучше запустить его на физическом компьютере вместо ВМ, а также подключить диск к sATA без какого-либо адаптера sATA/USB.
Среди других функций ddrescue может обходить драйвер диска ядра и буферы, следовательно, он может уменьшить бесполезное повторное чтение сбойных кластеров. Файл map (ранее назывался logfile) хранит информацию обо всех кластерах un/success read, и поэтому вы можете просто повторить сбойный шаг. ddrescue ищет map-файл до того, как он начнет свою работу, создайте его, если он не существует, прочитайте его, если он доступен, и начните продолжить спасательную работу с последней записанной позиции. Вам не нужно перемещать начальную позицию вручную каждый раз, когда происходит сбой программы!

Вы можете использовать различные опции, чтобы сделать процесс спасения быстрее и безопаснее. Вы также можете, и рекомендуется, вы можете сделать процесс спасения в два или более шагов:

Первый шаг: быстро прочитать хорошие кластеры и сразу же пропустить плохие.

Второй шаг: разберитесь с непрочитанными кластерами из предыдущего шага и используйте специальные опции, чтобы обмануть особенности диска (NCQ, читай впереди ...) в том, чтобы считывать один сектор сразу. Адекватные команды (я использую):

ddrescue -n -p -d -r1    /dev/sdd $IMGPATH/disk.img $IMGPATH/disk.log;
ddrescue       -d -r3 -R /dev/sdd $IMGPATH/disk.img $IMGPATH/disk.log;
#         |  |  |  |   |
#         |  |  |  |   revers reading
#         |  |  |  retry read 1x (3x)
#         |  |  direct access to disk (bypass the kernel)
#         |  preallocate diskspace      
#         nonscrap

Если ваш диск нагревается слишком сильно или не любит много операций чтения / с, вы можете замедлить чтение с помощью опции: --max-read-rate=50M

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .