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

393
Thorsten Schöning

Мне нужно спасти данные с жесткого диска размером около 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уже неправильными? Связано ли это с чтением и записью на диски вместо разделов или файлов?

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

Спасибо!

0

3 ответа на вопрос

0
harrymc

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

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

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

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

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

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

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

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

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

Кажется, мне было неясно: я не указывал аргумент несколько раз за вызов, но всегда только один раз за вызов с разными значениями. Сначала, например, с 1 ГБ, затем с 2 или 500 и так далее. И `ddrescue` всегда начинал читать, где я сказал, что должен. Насколько я понимаю, как я указывал необработанные устройства, `ddrescue` также должен заботиться о файлах или знать о них, а вместо этого просто читать и записывать произвольные" вещи ". Thorsten Schöning 5 лет назад 0
Согласно документации, вы не должны указывать это несколько раз, но всегда используете одно и то же значение или ничего. Режим работы ddrescue предполагает несколько * идентичных * прогонов. Как я уже сказал, я не знаю, приняты ли во внимание многочисленные спецификации или нет. И он ничего не знает о файлах, только о секторах диска, таких же как `dd`. harrymc 5 лет назад 0
It does know about files: "infile and outfile may be files, devices or partitions." Example 5 clearly mentions different positions as well: " is the position where the drive stopped responding" https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Examples Thorsten Schöning 5 лет назад 0
Да, но вы не используете эту опцию. harrymc 5 лет назад 0
"-i bytes --input-position = bytes" https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Invoking-ddrescue Thorsten Schöning 5 лет назад 0
0
Thorsten Schöning

Безопасно ли использовать несколько разных --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из-за всех зарегистрированных ошибок чтения.

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

Я снова проверил 3 вызова, используя `--input-position = XGB`, начиная с 0, 2 и 5 ГБ данных, читая около 1 ГГ, и все это увеличило объем памяти виртуального целевого диска, на который я записывал. Поэтому я почти уверен, что использование множественного `--input-position` безопасно, и я сделал что-то еще неправильно. Thorsten Schöning 5 лет назад 0
Похоже, проблема снова возникла: после ~ 23 часов работы было спасено ~ 485 ГБ данных, ddrescue продолжает считывать и восстанавливать данные, но ни один из них больше не записывается на виртуальный диск. Нет ошибок в `dmesg -T` о виртуальном целевом диске, не в хосте, записи просто куда-то исчезают. А поскольку `ddrescue` считает, что данные были спасены, никто не знает, чего не хватает и где читать снова или что-то подобное. Thorsten Schöning 5 лет назад 0
-1
schweik

Поскольку страница руководства 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.

-1. OP raised few questions (including the one in the title). In my opinion you didn't give a direct answer to any of them. The discrepancy between allegedly rescued ~650 GB of data and a lot smaller virtual disk is still a mystery; we don't know what went wrong nor if `--input-position` is safe. Your answer may be technically right but it doesn't answer *the* question. Kamil Maciorowski 5 лет назад 1
Sorry, Kamil, I tried to show how to use the ddrescue in the better way to get results and not artefacts. You can post your answer to discover the mystery. Thanks for your help. schweik 5 лет назад 0

Похожие вопросы