Effizientes Zusammenführen von 2 ddrescue-Ergebnissen desselben Laufwerks

690
Dariel

Ich versuche, eine Partition auf einer fehlerhaften 500-GB-Festplatte bei der /dev/sdbVerwendung von ddrescue auf einem zweiten 1-TB-Laufwerk zu retten . Der Befehl ddrescue, den ich für den ersten Durchlauf verwende, lautet:

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

gefolgt von einem zweiten Durchgang:

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

Das Problem ist, ich habe versehentlich den Image-Namen für den zweiten Befehl falsch eingegeben. Stattdessen core.imgschreibe ich, core.ingund ich wusste es erst am nächsten Morgen, an dem der zweite Durchlauf seinen Lauf genommen hat, und core.log überschrieben wurde, um einen 100% igen Erfolg zu melden.

Jetzt stecke ich mit 2 massiven Dateien fest. Eine erneute Durchführung der gesamten Arbeit ist nicht möglich, da ich immer noch rette sdb3. Ich habe bereits geprüft hexeditund die 2 Datei ergänzt sich gegenseitig (dh wenn in Offset 0x5000 bis 0x7000 core.imgmit Null gefüllt ist, wird derselbe Offset in core.ingmit den realen Daten gefüllt, und umgekehrt.)

Ich denke an dd-ing das core.imgto /dev/sdc2(das Ersatzlaufwerk für sdbmich vorbereitet) und kopiere dann irgendwie nur die Nicht-Null-Bytes in core.ing, /dev/sdc2aber ich bin nicht sicher, wie ich nur die Nicht-Null-Bytes kopieren kann, und was als Lösung verwende Ich kann mir vorstellen, sind sehr umständlich und werden ewig dauern.

Als Referenz verwende ich Gentoo-basiertes SystemRescueCD 4.9.6, sdb2ist NTFS.

3
Hallo Dariel; Wie Sie sehen, haben Sie auch [auf der Unix- und Linux-Site gepostet] (https://unix.stackexchange.com/questions/359454/merging-2-ddrescue-output-of-the-same-drive-efficient); Dies ist laut FAQ nicht zulässig (https://meta.stackexchange.com/questions/64068/is-cross-posting-a-question-on-multiple-stack-exchange-sites-permitted-if- the-qu). Die Frage selbst ist gut, aber eigentlich sollte es nur das eine oder das andere sein. Wie in der FFAQ-Antwort heißt: Wenn Sie keine Antwort erhalten und Sie der Meinung sind, dass eine andere Website besser passt, können Sie einen Mod fragen, um die Frage zu migrieren. Hoffe das hilft :) bertieb vor 7 Jahren 2
Ah, danke, dass Sie mich benachrichtigt haben. Ich habe Crossposts geschrieben, weil ich denke, dass diese Frage besser in die SU-Site passt. Ich werde den auf der Unix- und Linux-Site löschen, um die Regeln einzuhalten Dariel vor 7 Jahren 0
Kein Problem, wenn dies Ihre Wahl ist, ist es eine positive Aussage wert, da es sich um eine gut formulierte Frage handelt (da es sich bei U + L um +3 handelt, wurde es gut angenommen; hat aber vorher nicht +1, da es unangenehm war, etwas gegen die Regeln zu stimmen.) . Es ist entweder auf einem Thema, also liegt die Wahl bei Ihnen :) bertieb vor 7 Jahren 0

1 Antwort auf die Frage

2
bertieb

Wie kann ich zwei verschiedene Rettungsaktionen zusammenführen?

(Dies setzt GNU voraus ddrescue)

tl; dr :

  1. Generieren Sie eine Mapdatei / Logdatei für die erste Kopie: ddrescue --generate-mode infile outfile mapfile

  2. Erstellen Sie eine zusammengeführte Kopie von 2nd → 1st, wie in einem Beitrag an die ddrescueMailingliste beschrieben :ddrescue -m logfile2 image2 image1 logfile1


1. Generieren Sie eine Protokolldatei für das erste Image

Dies ist etwas kompliziert, da Sie für den ersten Durchgang praktisch keine Protokolldatei haben. Sie können jedoch eine generieren:

Wenn ddrescue mit der --generate-modeOption aufgerufen wird, arbeitet es im "Generatormodus", was sich vom Standard "Rettungsmodus" unterscheidet. Das heißt, wenn Sie die Option "--generate-mode" verwenden, rettet ddrescue nichts. Es wird nur versucht, eine Map-Datei zur späteren Verwendung zu generieren.

...

Verzweifle nicht (noch). Ddrescue kann in einigen Fällen eine ungefähre Map-Datei erzeugen, aus infile und der (partiellen) Kopie in outfile, die fast so gut ist wie eine exakte Map-Datei. Dies geschieht, indem einfach davon ausgegangen wird, dass Sektoren, die alle Nullen enthalten, nicht gerettet wurden .

... Sie können mit diesem Befehl eine ungefähre Map-Datei erzeugen:

ddrescue --generate-mode infile outfile mapfile

(Hervorhebung meines)

aus dem GNU- ddrescueHandbuch ; Abschnitt 12, ' Erzeugungsmodus '.

So können Sie dies für das erste Bild tun (was ich zum Umbenennen empfehle, um Verwirrung zu vermeiden, z. B. core-1.img):

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

"Ich lese noch /dev/sdb, wird das Generieren eines Protokolls damit zusammenhängen?"

Beachten Sie, dass die ddrescueRekonstruktion aus outfile(in diesem Fall core-1.img) in erster Linie mit sehr wenigen Lesevorgängen erfolgt infile. Ich habe das getestet mit 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 

Daher ist es sicher, diesen Vorgang auszuführen, während ein anderer Prozess läuft sdb(im Falle eines anderen Rettungsversuches auf einer anderen Partition ), da die Lesevorgänge vernachlässigbar sind.

2. Führen Sie die beiden Teilkopien zusammen

Diese Art von Situation ist schon früher aufgetaucht :

Jetzt habe ich zwei Teilabbilder des Laufwerks, die sich meist nicht überlappen ... und zwei dazu passende Protokolldateien, die die guten und die ausgelassenen Bereiche definieren.

Glücklicherweise können sie mit folgendem zusammengeführt werden --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` 

Und die Lösung für das ähnliche Problem beinhaltete diese Option :

Sie können die Bilder zusammenführen, indem Sie Folgendes eingeben:

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

Dadurch werden die Dateien dir1 / logfile dir1 / image mit allen aktuell geretteten Daten erstellt. Dann können Sie die Rettung beispielsweise wie folgt fortsetzen:

In Ihrem Fall, vorausgesetzt, Sie haben eine Protokolldatei für sie erstellt core.imgund gekennzeichnet 1, und behalten Sie das core.ingund core.logals 2(damit es nicht zu mehr Verwirrung kommt!):

ddrescue -m core-2.log core-2.img core-1.img core-1.log 
Apropos Verwirrung: Diese Frage wurde [in U & L gepostet] (https://unix.stackexchange.com/questions/359454/merging-2-ddrescue-output-of-the-same-drive-efficient/359485#359485) , Ich habe meine Antwort von dort im Falle einer Löschung kopiert. Siehe [diesen Teil des Chats für Ref.] (Http://chat.stackexchange.com/transcript/message/36759388#36759388). Ich kann diese Antwort gerne entfernen, wenn das Quervergleichen von Richtlinien nicht erfüllt ist! bertieb vor 7 Jahren 0
Danke, eine Frage, wird ddrescue durch die Option "-G" erneut aus "/ dev / sdb2" gelesen? Da ich gerade eine andere Partition des gleichen Laufwerks wiederherzustellen. Und ich habe denjenigen, den ich auf Unix & Linux poste, gebeten, gelöscht zu werden, da diese Frage meiner Meinung nach besser zu dieser Website passt. Dariel vor 7 Jahren 0
Es sollte * nicht * sein, da es nur aus "outfile" gelesen wird, um die "mapfile" zu erzeugen; Ich gehe davon aus, dass die Verwendung von "infile" für Konsistenz / Verifizierung des Bildes für das "outfile" sinnvoll ist. Ich habe das jedoch nicht getestet; Ich kann es mit einer Image-Datei versuchen, die ich habe und sehe. ** Update **: AFAICT scheint es nur aus 'outfile' zu generieren. bertieb vor 7 Jahren 0
Ich habe die Antwort mit dieser "inotify" -Information aktualisiert. bertieb vor 7 Jahren 0
Danke für die aktualisierte Info und Antwort! Die von Ihnen angegebenen Methoden sollten auf jeden Fall funktionieren, daher werde ich Ihre Antwort als Lösung kennzeichnen Dariel vor 7 Jahren 0
Vielen Dank und viel Glück bei der Genesung :) bertieb vor 7 Jahren 0
Hmm, nachdem ich das core-1.log neu erstellt habe, ist mir aufgefallen, dass ich core-2.log auch mit `ddrescue -G / dev / sdb2 core-2.img core-2.log` neu erstellen muss dass der letzte Befehl funktionieren kann, bin ich richtig? Dariel vor 7 Jahren 0
Also, ich regeneriere auch core-2.log und verwende dann `ddrescue -C -m core-2.log core-2.img core-1.img core-1.log` (Die -C ist als core-2 notwendig .img ist kleiner als core-1.img (wegen fehlender Nullen am Ende). Das core-1.img ist jetzt das vollständige Bild, und alles ist in Ordnung (möglicherweise möchten Sie Ihre Antwort so bearbeiten, dass sie den core-2 enthält.) Log-Regeneration für zukünftige Leser). Danke noch einmal! Dariel vor 7 Jahren 0
Ich bin froh, dass es sortiert ist :) Ich hatte eigentlich vor, dass Sie das `core.log` aus dem * zweiten * Lauf als` core-2.log` verwenden sollten, tut mir leid, dass Sie unklar sind- Regenerierung, aber es funktioniert auch! bertieb vor 7 Jahren 0