
Ich habe eine Sammlung alter 3,5-Zoll-Disketten, von denen ich möglichst viele Daten wiederherstellen möchte.
Das Problem hängt mit der Struktur einiger Dateien zusammen. Ich muss die Länge aller Dateien beibehalten, d. h. alle fehlerhaften Sektoren müssen aufgefüllt werden (der Grund dafür ist, dass einige Dateien Acorn ADFS-Dateien sind, in denen Daten und Code kombiniert sind. Der Code verweist auf die Daten als Offset vom Anfang der Datei. Das Lesen des ADFS-Formats ist unter Linux kein Problem, das Auffüllen fehlerhafter Sektoren schon).
Da die Datenträger seit 25 Jahren nicht gelesen wurden, rechne ich mit unvorhersehbaren Lesevorgängen, regelmäßig fehlerhaften Sektoren und möglicherweise damit, dass die Datenträger unlesbar werden – was mir jedoch nichts ausmacht, solange die Datenwiederherstellung maximiert wird.
Dazu sind meiner Meinung nach mehrere Durchgänge erforderlich, um so viel wie möglich zu lesen.
dd
Ich habe mir dd angesehen und dieser Befehl war für einen ersten Durchlauf vielversprechend:
dd if=/dev/fd0 of=adfs.img conv=noerror,sync
Gefolgt von weiteren Anrufen von
dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc
Wo:
kein Fehlerbedeutet, dass Fehler ignoriert werden
synchronisierenbedeutet, dass fehlerhafte Sektoren mit dem Nullzeichen aufgefüllt werden
nichtruncbedeutet, dass die (bereits vorhandene) Ausgabedatei beim Aufruf von dd nicht abgeschnitten wird.
Doch als ich diemanpageund dasErklärung von notrunc, obwohl notrunc gesetzt ist, überschreibt dd die Ausgabe jedes Mal, was zu einer Ausgabe führt, die immer noch nur das darstellt, was beim letzten Durchgang gelesen wurde. Alle Sektoren, die zuvor korrekt gelesen wurden, jetzt aber fehlerhaft sind, z. B. aufgrund einer Verschlechterung der alten Diskette, werden mit Null überschrieben.
Also sieht dd nicht geeignet aus.
Abonnieren
Abonnierensieht vielversprechend aus, da es mit mehreren Durchläufen verwendet werden kann, solange eine Protokolldatei verwendet wird, um aufzuzeichnen, was erfolgreich geschrieben wurde, und dann beim nächsten Durchlauf darauf verwiesen wird.
Der erste Durchgang zum Lesen nur fehlerfreier Blöcke
ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile
für den ersten Durchgang und die nachfolgenden Durchgänge, um die Fehler auszufüllen
ddrescue -d -r3 /dev/fd0 output.img log/output.logfile
Wo
-Ddirekter Festplattenzugriff. Systemcache ignorieren
--kein Kratzenoder-NÜberspringen Sie die Scraping-Phase
-Ppreallocate reserviert vor der Wiederherstellung Speicherplatz, d. h. die Ausgabedatei hat die gleiche Größe wie die Eingabedatei/das Eingabegerät.
-r33-maliger Wiederholversuch fehlerhafter Sektoren (wird ab dem 2. Durchgang verwendet)
aber das Problem ist, dass ddrescue fehlerhafte Sektoren anscheinend nicht auffüllt, wenn sie auftreten. Wenn -p gesetzt ist, scheint dies dazu zu führen, dass alle Auffüllungen am Ende der Datei erfolgen und die Datenoffsets vom Anfang der Datei nicht wie erforderlich beibehalten werden.
Dies scheint der Fall zu sein, da ddrescue so geschrieben ist, dass es versucht, Speicherplatz zu sparen. Daher werden fehlerhafte Sektoren abgeschnitten und dann aufgefüllt, wenn die fehlerhaften Sektoren in nachfolgenden Durchläufen erfolgreich gelesen werden. Das Setzen von -p erstellt lediglich eine Ausgabedatei mit der gleichen Größe wie die Eingabedatei, um Speicherplatz zu sparen, nicht um die Daten aufzufüllen. Der Inhalt der Ausgabe mit -p gesetzt oder nicht gesetzt ist daher identisch, d. h. wird bis zum Ende der Datei nicht aufgefüllt.
Frage
Meine Frage besteht also aus drei Teilen
ist es richtig, dass ddrescue die wiederhergestellte Datei NICHT auffüllt, selbst wenn -p gesetzt ist?
Gibt es eine Möglichkeit, es aufzufüllen? Bei meiner Internetsuche habe ich einen Kommentar gelesen (werde ihn wiederfinden und hinzufügen), dass die von ddrescue erstellte Protokolldatei von einem Skript verwendet werden könnte, um die relevanten Stellen aufzufüllen. Irgendeine Idee, wie?
Und
- Kennen Sie einen besseren Befehl/ein besseres Programm/Skript für das, was ich versuche – maximale Datenwiederherstellung durch mehrere Lesedurchgänge einer beschädigten Festplatte mit Auffüllen fehlerhafter Sektoren?
Ich verwende Ubuntu 18.04, die dd-Version ist (coreutils) 8.28 und die GNU ddrescue-Version ist 1.22, beide aus den Ubuntu-Repositories.
Danke wie immer für jede Hilfe
Antwort1
GNU ddrescuedas richtige Tool für die von Ihnen versuchte Wiederherstellung ist.
1) Ist es richtig, dass ddrescue die wiederhergestellte Datei NICHT auffüllt, selbst wenn -p gesetzt ist?
Diese Annahme ist falsch. Sie könnten verwirrt sein durchdas Handbuchsagen:
Ddrescue schreibt keine Nullen in die Ausgabe, wenn es fehlerhafte Sektoren in der Eingabe findet, und kürzt die Ausgabedatei nicht, wenn es nicht dazu aufgefordert wird.
Es bedeutet nur, dass anstelle von fehlerhaften Sektoren keine Nullen geschrieben werden. Was auch immer in diesen fehlerhaften Sektoren stehen sollte, wird einfach nicht ausgefüllt. Wenn Sie auf eine leere Festplatte oder in eine Datei schreiben,die unbeschriebenen Bereiche am Ziel werden als Nullen zurückgelesen(Nullbytes).
Außerdem hat die Option -p
/ --preallocate
nichts mit „Padding“ zu tun. Sie bedeutet „Vorabzuordnen“. Auf unterstützten Dateisystemen stellt die Option sicher, dass Sie auf dem Ziel über genügend Speicherplatz verfügen, um die Quellfestplatte zu speichern.
2) Gibt es eine Möglichkeit, es aufzupolstern?
Die von GNU ddrescue ausgegebene Datei weist logisch dasselbe Layout auf wie die Quellfestplatte. Ein aus der Quelle gelesener Block wird im Ziel an die gleiche Position gesetzt. Sie können die gesamte Wiederherstellung sogar umkehren ( -R
/ --reverse
) und die Blöcke werden rückwärts, aber immer noch an den richtigen Stellen, eingefügt.
3) Kennen Sie einen besseren Befehl/ein besseres Programm/Skript für das, was ich versuche – maximale Datenwiederherstellung durch mehrere Lesedurchgänge einer beschädigten Festplatte mit Auffüllen fehlerhafter Sektoren?
GNU ddrescue macht genau das, was Sie wollen. Es kann mehrere Durchläufe durchführen ( -r
/ ), und das gewünschte "Auffüllen" von fehlerhaften Sektoren ist das Standardverhalten von GNU ddrescue. Von--retry-passes=n
das Handbuch:
Wenn die Ausgabedatei eine normale, von ddrescue erstellte Datei ist, enthalten die als fehlerhafte Sektoren markierten Bereiche Nullen.
Um es ganz klar zu sagen und auf Ihre Besorgnis einzugehen, dass ein erfolgreicher Lesevorgang, auf den ein fehlerhafter Lesevorgang folgt, mit Nullen „aufgefüllt“ würde,ddrescue wird nicht versuchen, einen erfolgreichen Lesevorgang erneut zu lesen„Das ist nicht nötig, da die Daten bereits wiederhergestellt wurden. Anhand der Map-Datei weiß ddrescue, was bereits wiederhergestellt wurde und was nicht.