Эффективное объединение двух ddrescue выходов одного и того же диска

606
Dariel

Я пытаюсь спасти раздел жесткого диска на 500 ГБ при /dev/sdbиспользовании ddrescue для второго диска емкостью 1 ТБ. Команда ddrescue, которую я использую для первого прохода:

ddrescue -n /dev/sdb2 core.img core.log 

с последующим вторым проходом:

ddrescue -d -r 3 /dev/sdb2 core.img core.log 

Проблема в том, что я случайно набрал неверное имя для второй команды. А core.imgне пишуcore.ing и я не осознавал этого до следующего утра, когда второй проход прошел, и файл core.log был перезаписан, чтобы сообщить о 100% -ом успехе.

Теперь я застрял с 2 массивными файлами. Повторное выполнение всей хозяйственной работы неосуществимо, поскольку я все еще спасаю sdb3. Я уже проверил, hexeditи 2 файла дополняют друг друга (т. Е. Если смещение от 0x5000 до 0x7000 core.imgзаполнено нулем, то такое же смещение core.ingзаполнено реальными данными, и наоборот.)

Я имею в виду dd-ную core.imgк /dev/sdc2(замены привода для sdbменя готовили), а затем каким - то образом скопировать только ненулевые байты core.ingдля/dev/sdc2, но я не знаю, как я могу только скопировать ненулевых байт, и используя то, что, как решения I Можно думать, что это очень громоздко и займет целую вечность.

Для справки, я использую Gentoo на основе SystemRescueCD 4.9.6, sdb2это NTFS.

3
Привет Дариэль; Я вижу, вы также [разместили это на сайте Unix и Linux] (https://unix.stackexchange.com/questions/359454/merging-2-ddrescue-output-of-the-same-drive-efficiently); это [запрещено согласно FAQ] (https://meta.stackexchange.com/questions/64068/is-cross-posting-a-question-on-multiple-stack-exchange-sites-permitted-if- заместитель Qu). С самим вопросом все в порядке, но на самом деле он должен касаться только одного или другого. Как говорится в ответе FFAQ, если вы не получили ответ и чувствуете, что другой сайт подойдет лучше, вы можете попросить мод перенести вопрос. Надеюсь это поможет :) bertieb 7 лет назад 2
Ах, спасибо, что уведомили меня, я кросс-постил, потому что я думаю, что этот вопрос лучше подходит для сайта SU. Я удалю один на сайте Unix & Linux, чтобы соответствовать правилам Dariel 7 лет назад 0
Нет проблем, если это ваш выбор, стоит поднять голос, так как это хорошо сформулированный вопрос (так как он на +3 на U & L, он был хорошо принят, но не +1 заранее, потому что было нечестно поднять голос против правил) , Это по теме либо выбор за вами :) bertieb 7 лет назад 0

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

2
bertieb

Как я могу объединить два разных спасения?

(Это предполагает GNU ddrescue)

тл; др :

  1. Создайте mapfile / logfile для первой копии: ddrescue --generate-mode infile outfile mapfile

  2. Создайте объединенную копию от 2-го → 1-го, как описано в сообщении в ddrescueсписок рассылки :ddrescue -m logfile2 image2 image1 logfile1


1. Создайте файл журнала для первого изображения

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

Когда ddrescue вызывается с --generate-modeпараметром, он работает в «режиме генерации», который отличается от «режима восстановления» по умолчанию. То есть, если вы используете опцию --generate-mode, ddrescue ничего не спасет. Он только пытается сгенерировать файл-файл для последующего использования.

...

Не отчаивайтесь (пока). В некоторых случаях Ddrescue может генерировать приблизительный файл карты из infile и (частичной) копии в файле outfile, что почти так же хорошо, как точный файл карты. Это можно сделать, просто предполагая, что сектора, содержащие все нули, не были спасены .

... вы можете создать приблизительный файл карты с помощью этой команды:

ddrescue --generate-mode infile outfile mapfile

(акцент мой)

от GNU ddrescueруководства ; раздел 12 « Режим генерации ».

Таким образом, вы можете сделать это для первого изображения (которое я предлагаю переименовать, чтобы избежать путаницы, например core-1.img):

ddrescue -G /dev/sdb2 core-1.img core-1.log 

"Я все еще читаю /dev/sdb, будет ли создание журнала мешать этому?"

Обратите внимание, что ddrescueвосстанавливаются из outfile(в данном случае core-1.img) в основном, с очень небольшим чтением из infile. Я проверил это с inotifywatch:

$ inotifywatch 840-linux.img # infile $ inotifywatch 840-linux2.img # outfile $ inotifywatch 840-linux2.log $ ddrescue -G 840-linux.img 840-linux2.img 840-linux2.log  total close_nowrite open filename 6 3 3 840-linux.img 17467 17465 1 1 840-linux2.img  total access modify close_write close_nowrite open filename 196 1 189 2 1 3 840-linux2.log 

Так что это безопасно выполнять, когда запущен другой процесс sdb(в случае OP - еще одна попытка восстановления в другом разделе ), так как чтение незначительно.

2. Объединить две частичные копии

Такая ситуация возникла раньше :

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

К счастью, их можно объединить с помощью --domain-mapfile:

--domain-mapfile=file Restrict the rescue domain to the blocks marked as  finished in the mapfile file. This is useful for  merging partially recovered images of backups, or if  the destination drive fails during the rescue. Use  '-' as file to read from standard in` 

И решение аналогичной проблемы включало этот вариант :

Вы можете объединить изображения, набрав:

cd dir1 ddrescue -m dir2/logfile dir2/image image logfile 

Это создает файлы dir1 / logfile dir1 / image со всеми данными, которые были спасены в данный момент. Затем вы можете продолжить спасение, например, так:

В вашем случае, предполагая, что вы сгенерировали файл журнала для core.imgи пометили их 1, и сохранили core.ingи core.logкак 2(чтобы не было путаницы!):

ddrescue -m core-2.log core-2.img core-1.img core-1.log 
Говоря о путанице, этот вопрос был [кросс опубликован в U & L] (https://unix.stackexchange.com/questions/359454/merging-2-ddrescue-output-of-the-same-drive-efficiently/359485#359485) Я скопировал свой ответ оттуда в случае удаления. См. [Эту часть чата для ссылки] (http://chat.stackexchange.com/transcript/message/36759388#36759388). Я рад удалить этот ответ, если перекрестный ответ не соответствует каким-либо рекомендациям! bertieb 7 лет назад 0
Спасибо, вопрос, однако, опция `-G` заставит ddrescue снова прочитать из` / dev / sdb2`? Как я сейчас восстанавливаю другой раздел того же диска. И я попросил удалить тот, который я публикую в Unix & Linux, так как я думаю, что этот вопрос лучше подходит для этого сайта. Dariel 7 лет назад 0
Это * не должно *, поскольку это просто чтение из `outfile` для генерации` mapfile`; Я предполагаю, что использование «infile» предназначено для согласованности / проверки правильности изображения для «outfile». Однако я не проверял это; Я могу попробовать это на файле изображения, который у меня есть, и посмотреть. ** Обновление **: AFAICT, кажется, генерируется только из `outfile`. bertieb 7 лет назад 0
Я обновил ответ этой информацией inotify. bertieb 7 лет назад 0
Спасибо за обновленную информацию и ответ! Методы, которые вы укажете, обязательно должны работать, поэтому я буду отмечать ваш ответ как решение Dariel 7 лет назад 0
Большое спасибо и удачи в восстановлении :) bertieb 7 лет назад 0
Хм, после того, как я заново создал core-1.log, я заметил, что мне нужно будет заново создать core-2.log с помощью `ddrescue -G / dev / sdb2 core-2.img core-2.log`, поэтому что последняя команда может работать, я прав? Dariel 7 лет назад 0
Так что да, я также регенерирую core-2.log и затем использую `ddrescue -C -m core-2.log core-2.img core-1.img core-1.log` (-C необходим как core-2 .img меньше, чем core-1.img из-за пропущенных нулей на заднем конце). core-1.img теперь является полным изображением, и все хорошо (вы можете отредактировать свой ответ, включив в него core-2. журнал регенерации для будущих читателей). Еще раз спасибо! Dariel 7 лет назад 0
Рад, что это отсортировано :) Я на самом деле хотел, чтобы вы использовали `core.log` из * второго * запускаемого как` core-2.log`, извините за неясность - регенерирование тоже работает! bertieb 7 лет назад 0

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