Wie kann ich zwei ddrescue-Bilder zusammenführen?

7

Ich habe zwei ddrescue-Bilder, die aus zusammenhängenden Wiederherstellungsversuchen desselben Mediums erstellt wurden. Die beiden Bilder sind gleich groß, haben jedoch ergänzende Daten:

$ od part-one/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 113056 016517 102014 074371 144073 000000 000000 000000
3242365233006 000000 000000 000000 000000 000000 000000 000000 000000
3242365233026
$ od part-two/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 000000 000000 000000 000000 000000 124616 163450 064251
3242365233006 074567 134433 012742 022160 044301 054235 140604 020633
3242365233026

Wie kann ich sie zu einem einzigen, vollständigen Bild zusammenführen?

Einzelheiten

  • Das zweite Bild ist einfach eine Fortsetzung des ersten Wiederherstellungsversuchs à la:

    $ ddrescue corrupt-partition part-one/ddrescue_image part-one/ddrescue_log
    $ mkdir part-two; cp part-one/ddrescue_log part-two/ddrescue_log
    $ ddrescue corrupt-partition part-two/ddrescue_image part-two/ddrescue_log
    
  • Das zweite Bild besteht fast ausschließlich aus Nullen, enthält jedoch 18 KB wiederhergestellter Daten, die auf 1847 isolierte Regionen verteilt sind.

  • Ich habe versucht, die auf dieser Mailingliste erwähnte Technik zu verwenden .

    $ ddrescue --domain-logfile=part-two/ddrescue_log part-two/ddrescue_image part-one/ddrescue_image part-one/ddrescue_log
    
    
    GNU ddrescue 1.16
    Press Ctrl-C to interrupt
    Initial status (read from logfile)
    rescued:   937286 MB,  errsize:   62976 B,  errors:     122
    Current status
    rescued:   937286 MB,  errsize:   62976 B,  current rate:        0 B/s
       ipos:         0 B,   errors:     122,    average rate:        0 B/s
       opos:         0 B,     time since last successful read:       0 s
    Finished
    

    aber es scheint nichts geändert zu haben.

ændrük
quelle

Antworten:

4

Wenn Sie genau wissen, welche Datenregion Sie kopieren möchten, können Sie Folgendes verwenden dd:

dd conv=notrunc if=input of=output seek=123456 skip=123456 bs=4k count=128

Das würde 128 4k-Blöcke von Eingabe zu Ausgabe ab 123456 kopieren.

Es wäre ratsam, die Blöcke zu sichern, die Sie zuerst überschreiben möchten:

dd if=output skip=123456 bs=4k count=128 of=output-backup-bs4k-pos123456

Wenn Sie NICHT wissen, welche Datenregion kopiert werden soll, oder sich nicht sicher sind, GNU ddwissen Sie es zufällig sparse.

dd conv=notrunc,sparse if=input of=output bs=4k

Das würde jeden 4k-Eingabeblock ungleich Null in die Ausgabe kopieren. Verwenden Sie, bs=512wenn Ihre Blöcke kleiner sind!

Beachten Sie, dass mit dieser Methode kein Backup erstellt wird. Kopieren Sie die Datei daher besser, wenn dies wichtig ist.

Frostschutz
quelle
1

Versuchen Sie so etwas?

dd if=part-one/ddrescue_image bs=1 count=227966006784 >result
dd if=part-two/ddrescue_image bs=1 seek=227966006785 >>result

Die kleine Blockgröße macht dies sehr langsam; Wenn Sie eine größere Blockgröße umgestalten können und dennoch im richtigen Versatz landen, sollte dies die Geschwindigkeit erheblich erhöhen.

Wenn Sie dies nicht tun können, ddist es wahrscheinlich eine gute Idee , den Vorgang in mehrere Aufrufe aufzuteilen. Lesen Sie mit einer großen Blockgröße wie 65536 bis zur nächsten 64-KB-Grenze und nehmen Sie es von dort aus langsam (möglicherweise bis zu einem 1-KB-Block) Größe auf die nächste 1K-Grenze, bevor Sie bis zu den einzelnen Bytes gehen), und dann wieder schneller, sobald Sie mit der feinkörnigen Manipulation fertig sind.

Tripleee
quelle
Mit den aktualisierten Informationen über die verstreuten Regionen gilt dies immer noch als Proof of Concept. Durchlaufen Sie eine Liste von Offsets und wechseln Sie zum zweiten Bild an den Offsets, an denen die gewünschten Daten enthalten sind.
Tripleee