Безопасно ли использовать несколько разных `--input-position` с ddrescue?
Мне нужно спасти данные с жесткого диска размером около 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 ответа
Безопасно ли использовать несколько разных
--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
Второй вызов четко задокументирован, чтобы повторяться с разных позиций. Относительно того, как ddrescue
работает с использованием своего файла карты, это также имеет смысл, просто потому, что он всегда знает, используя этот файл, какие блоки уже были прочитаны.
Так что, похоже, высока вероятность того, что проблема в моем случае другая, особенно слишком старая временная метка, которую, как мне кажется, я узнал, странно. Может быть, я просто пропустил сообщения, которые ddrescue
по какой-то причине не пишет в реальное целевое устройство. Сама виртуальная машина также находилась на другом USB-накопителе, возможно, были некоторые ошибки подключения, которые приводили к тому, что Live-Linux пропускал устройство во время работы или около того. Я мог бы легко пропустить такие ошибки в dmesg -T
из-за всех ошибок чтения вошли.
Похоже, мне нужно повторить весь процесс...
Я прочитал ddrescue
руководство, и нигде не умирает упомянуть возможность множественного input-position
параметры.
Этот параметр всегда упоминается как "a" или "the", поэтому кажется, что он должен быть уникальным.
Источником вашей проблемы может быть эта фраза из руководства:
Обратите внимание, что вы должны оставить исходное смещение между "--input-position" и "--output-position" исходного спасательного прогона.
Кажется, это согласуется со следующим другим пунктом:
Ddrescue не записывает нули в выходные данные, когда обнаруживает плохие секторы во входных данных, и не усекает выходной файл, если его не просят. Таким образом, каждый раз, когда вы запускаете его в одном и том же выходном файле, он пытается заполнить пробелы, не уничтожая уже восстановленные данные.
Это означает, что ddrescue
запоминает параметры из первого запуска, поэтому вы всегда должны сохранять те же параметры или просто не указывать их при последующих запусках (я не могу сказать, что правильно). Вполне возможно, что некоторые параметры были запомнены, а ваши новые были проигнорированы при следующих запусках.
Если части мета-таблиц диска были повреждены, вы можете увидеть меньше данных, чем было фактически спасено, потому что ни один файл, кажется, не содержит этих частей.
Данные, которые ddrescue
не может быть восстановлено другими продуктами восстановления. Это может занять много времени и может даже оказаться невозможным для продуктов в вашем распоряжении. Если данные абсолютно необходимо восстановить, профессиональная компания по восстановлению может сделать это с исходного диска, но эти услуги являются дорогостоящими.
Как справочная страница ddrescue
долго, использование ddrescue
сильно отличается в зависимости от цели и уровня пользователя. По сути, если вы используете Live Linux, вам лучше запустить его на физическом компьютере вместо ВМ, а также подключить диск к sATA без какого-либо адаптера sATA/USB.
Среди других особенностей ddrescue
может обойти драйвер диска и буферы ядра, следовательно, это может уменьшить бесполезное повторное чтение плохих кластеров. Файл map (ранее назывался logfile) хранит информацию обо всех кластерах un/success read, поэтому вы можете просто повторить сбойный шаг. ddrescue
ищет файл карты до того, как он начнет свою работу, создайте его, если он не существует, прочитайте его, если он доступен, и начните продолжить спасательную работу с последней записанной позиции. Вам не нужно перемещать начальную позицию вручную каждый раз, когда происходит сбой программы!
Вы можете использовать различные опции, чтобы сделать процесс спасения быстрее и безопаснее. Вы также можете, и рекомендуется, вы можете сделать процесс спасения в два или более шагов:
Первый шаг: быстро прочитать хорошие кластеры и сразу же пропустить плохие.
Второй шаг: разберитесь с непрочитанными кластерами из предыдущего шага и используйте специальные опции, чтобы обмануть особенности диска (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
,