Erstellen Sie massiv fragmentierte Dateien mit einem Teilbild und einer Liste ihrer Sektoren neu

462
GabrielB

Bei dem Versuch, so viele Daten wie möglich von einer fehlerhaften 3-TB-Festplatte wiederherzustellen, ging ich folgendermaßen vor:

  • Ich habe mit HD Sentinel einen Oberflächenscan gemacht, bei dem zwei kleine beschädigte Bereiche und etwa 100 fehlerhafte Sektoren identifiziert wurden (davor waren es 16).
  • Dann habe ich anhand verschiedener Methoden ermittelt, welche Dateien von fehlerhaften Sektoren betroffen sind .
  • Ich habe diese Dateien (sechs große Videodateien) in einen speziellen Ordner verschoben und den Rest der Dateien und Ordner kopiert, indem die Reihenfolge der Wichtigkeit verringert wurde. Alles wurde erfolgreich kopiert, mit Ausnahme einer unwichtigen EML-Datei, die sich in der Nähe der bereits identifizierten fehlerhaften Sektoren befand.
  • Dann dachte ich mir, dass der sicherste Weg, um das Beste aus den verbleibenden Dateien (Fernsehsendungen, die nicht mehr online sind und für die ich kein Backup habe) zu rendern, der Einsatz von ddrescue wäre - aber da die einzige leere Festplatte, die ich hatte, eine 500-GB-Festplatte war Ich konnte mir nicht alles vorstellen. Einige dieser Dateien sind massiv fragmentiert (jeweils 6000 bis 12000 Fragmente - sie wurden gleichzeitig heruntergeladen. Vermutlich deshalb wurden sie in einem "Interlaced-Muster" geschrieben, das diese Fragmentierung verursacht, da sonst die Festplatte über ausreichend freien Speicherplatz verfügte) Ich konnte sie nicht einfach durch das Extrahieren der besetzten Sektoren wiederherstellen, aber ich dachte, durch das Imaging der ersten 10 GB, die normalerweise die gesamte MFT und alle anderen Systemdateien enthalten, sowie die vier Bereiche, in denen sich diese Dateien befanden, könnte ich das tun extrahieren Sie sie einfach mit WinHex oder R-Studio aus dem Bild.

Leider bekam ich nicht die gesamte MFT: Einige davon (wie ich später herausfand, als ich die vollständige nfi.exe-Auflistung dieser Partition, die ich zuvor gemacht hatte, untersuchte), befindet sich um die 200-GB-Marke, und ein dritter Block befindet sich bei Ganz am Ende der Partition, nahe der 3 TB Marke. Ich habe nicht gedacht, dass sich der Zustand der Festplatte während des Wiederherstellungsversuchs so schnell verschlechtern würde (jetzt wurden mehr als 12000 neu zugewiesene Sektoren plus 9000 ausstehende Sektoren nur wenige Stunden später!), Und ich habe keine Vorsichtsmaßnahme getroffen um die MFT von WinHex zu speichern, wenn ich konnte. Nun, mit ddrescue ist es schmerzhaft langsam geworden, ich bekomme wahrscheinlich nicht die gesamte MFT. Wenn ich dieses Teilbild mit WinHex öffne, wird derselbe Volume-Snapshot verwendet, der erstellt wurde, als ich das physische Gerät untersuchte. Die gewünschten Dateien werden mit ihrer korrekten Größe und Datum angezeigt.

Ich habe jedoch einen guten Teil der Datenblöcke mit diesen sechs Dateien wiederhergestellt, und ich habe für jede von ihnen eine detaillierte Liste der Sektoren / Cluster, die sie belegen (mit drei verschiedenen Tools erhalten: nfi.exe, Recuva, HD Sentinel). . Wie kann ich diese Dateien nun mithilfe eines automatisierten Skripts mit diesen Informationen neu erstellen? (Es wäre eine unmögliche Aufgabe, dies manuell durchzuführen.)

Mit ddrescue könnte ich die Schalter -i (Eingabeposition) -o (Ausgabeposition) und -s (Eingabegröße) verwenden, aber wie könnte ich den Prozess automatisieren und diese tausenden Befehle gleichzeitig ausführen?

Unter Windows kenne ich ein Befehlszeilentool namens dsfo, das mit einem Befehl wie folgt Daten aus einer beliebigen Quelle in eine Zieldatei extrahieren kann:

dsfo [source] [offset] [size] [destination] 

Ich könnte meine Liste von Sektoren / Clustern mit einer Kombination aus Calc und TEDNotepad bearbeiten, um eine Liste mit Dsfo-Befehlen zu erstellen, aber es würden Tausende von Blöcken erstellt, denen ich dann irgendwie beitreten müsste. Gibt es einen besseren Weg, dies in einem Schritt zu tun?



BEARBEITEN:

Also nahm ich die Liste der Cluster / Sektoren für eine dieser von HD Sentinel generierten Dateien, die folgendermaßen dargestellt wird:

R:\fichiers corrompus\2017_07_2223_58 - Arte - Pink Floyd - The Dark Side of the Moon Live.mp4 Total Size: 883 787 365 bytes Position: 0 Attributes: Arc Number of file fragments: 6040 VCN: 0 LCN: 516530293 Length: 4288 sectors: 4132506536 - 4132540839 VCN: 4288 LCN: 516534613 Length: 16 sectors: 4132541096 - 4132541223 VCN: 4304 LCN: 516534645 Length: 64 sectors: 4132541352 - 4132541863 VCN: 4368 LCN: 516534725 Length: 16 sectors: 4132541992 - 4132542119 VCN: 4384 LCN: 516534757 Length: 48 sectors: 4132542248 - 4132542631 VCN: 4432 LCN: 516534853 Length: 32 sectors: 4132543016 - 4132543271 VCN: 4464 LCN: 516534901 Length: 16 sectors: 4132543400 - 4132543527 VCN: 4480 LCN: 516534933 Length: 48 sectors: 4132543656 - 4132544039 VCN: 4528 LCN: 516535013 Length: 16 sectors: 4132544296 - 4132544423 ... VCN: 215760 LCN: 568126709 Length: 9 sectors: 4545277864 - 4545277935 

Das erste Feld steht wahrscheinlich für „Virtual Cluster Number“ (in der integrierten Hilfe wurde keine detaillierte Beschreibung gefunden). Dieser Wert stellt offensichtlich die Clusternummer relativ zum Dateianfang dar. Der zweite Wert muss die "Logical Cluster Number" sein und ist die Clusternummer relativ zum Beginn der Partition (siehe unten, ich hatte es zuerst falsch, weil ich dachte, dass dieser Wert relativ zum gesamten Gerät war). Der dritte Wert gibt die Länge jedes Fragments an, auch in Clustern gemessen. Diese drei Werte sollten für meine Absichten und Zwecke ausreichen.

Ich habe das in TED Notepad importiert und die Funktion "Extras"> "Zeilen"> "Spalten, Zahlen" verwendet, ausgewählte Spalten 2, 3, 1 mit Tabulatoren als Trennzeichen, die diese Ausgabe erzeugten:

LCN: 516530293 Length: 4288 VCN: 0 LCN: 516534613 Length: 16 VCN: 4288 LCN: 516534645 Length: 64 VCN: 4304 LCN: 516534725 Length: 16 VCN: 4368 LCN: 516534757 Length: 48 VCN: 4384 LCN: 516534853 Length: 32 VCN: 4432 LCN: 516534901 Length: 16 VCN: 4464 LCN: 516534933 Length: 48 VCN: 4480 LCN: 516535013 Length: 16 VCN: 4528 ... LCN: 568126709 Length: 9 VCN: 215760  

Dann importierte ich das in Calc mit Tabulatoren und Leerzeichen als Trennzeichen, fügte eine Spalte hinzu, um den Eingangsversatz aus der Clusternummer (= LCN * 8 * 512) zu berechnen, eine andere, um die Länge in Bytes aus der Länge in Clustern (= Länge *) zu berechnen. 8 * 512) und schließlich noch einen, um den Versatz der Ausgabe vom VCN-Wert (= VCN * 8 * 512) zu erhalten, die Formeln in alle anderen Zeilen eingefügt, die zusätzlichen Spalten entfernt und "LCN:" durch "ddrescue / media /" ersetzt. sdb1 / ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i ", ersetzt" Länge: "durch" -s ", ersetzt" VCN: "durch" -o "...
Nun habe ich dieses ( außer es gibt 6000-12000 Zeilen für jede Datei):

ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115708080128 -s 17563648 -o 0 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115725774848 -s 65536 -o 17563648 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115725905920 -s 262144 -o 17629184 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726233600 -s 65536 -o 17891328 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726364672 -s 196608 -o 17956864 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726757888 -s 131072 -o 18153472 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726954496 -s 65536 -o 18284544 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115727085568 -s 196608 -o 18350080 ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115727413248 -s 65536 -o 18546688 ... ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2327047000064 -s 36864 -o 883752960 

Was ist der einfachste Weg, um diese riesige Befehlsfolge auf einem Live-System von Knoppix auszuführen? Was ist in Linux das Äquivalent eines Batch-Skripts für die Eingabeaufforderung in Windows?

(Ich könnte diese bestimmte Datei in einem P2P-Netzwerk finden, so dass ich testen kann, ob diese Methode fehlerfrei funktioniert, und wenn ja, um die Höhe des Schadens zu bestimmen. Kein Glück für die fünf anderen. Eine davon ist es nicht Fragmentiert, sodass ich es als einen Datenblock extrahieren könnte: Am Ende gibt es viele leere Sektoren, aber der Rest ist lesbar. Es bleiben also vier Dateien, die auf diese Weise extrahiert werden können.)

1
Indem Sie darauf bestehen, auf dem betroffenen Laufwerk zu arbeiten, machen Sie die Sache noch schlimmer. Ich schlage vor, dass Sie sich die Zeit nehmen, ein neues 3-TB-Laufwerk zu kaufen und eine vollständige Kopie des beschädigten Laufwerks zu retten. Dann können Sie die Dateien mit RecuperaBit extrahieren (Offenlegung: Ich bin der Autor). Andrea Lazzarotto vor 6 Jahren 0
An diesem Punkt ist es möglicherweise zu spät, um eine vollständige Kopie zu erstellen, und ich kann nicht einmal die Bereiche ermitteln, in denen sich die MFT befindet (was erforderlich ist, um fragmentierte Dateien aus einer Datenwiederherstellungssoftware zu extrahieren). Ich habe R-Studio ausprobiert umsonst). Außerdem habe ich fast alles kopiert, als das Laufwerk noch nicht so schlecht war. Deshalb versuche ich zu retten, was von diesen 6 verbleibenden Dateien zu retten ist, indem ich sie aus dem Bild extrahiere, so wie es ist, nur mit einer Liste der Sektoren, die sie belegen. Ich bin mir ziemlich sicher, dass es so geht, ich brauche nur eine Antwort auf die fett gedruckten Fragen. GabrielB vor 6 Jahren 0
Ich verstehe. Das Linux-Äquivalent eines Batch-Skripts ist ein ** Shell-Skript **. Die häufigste Hülle heißt Bash. Andrea Lazzarotto vor 6 Jahren 0
Außerdem sollten Sie in Betracht ziehen, die Ausgabedateien zusammen mit einem abschließenden Befehl zu "cat" hinzuzufügen. Andrea Lazzarotto vor 6 Jahren 0
Ich habe in der Zwischenzeit eine kurze Recherche durchgeführt: Tatsächlich scheint ein Shellskript recht einfach zu verwenden (der einzige Unterschied bei Windows ist, dass es ausführbar gemacht werden muss und vor dem Namen mit "./" ausgeführt werden muss, ansonsten handelt es sich lediglich um eine Liste von Befehlen im Klartext). Normalerweise sollte die Art und Weise, wie diese Befehle eingegeben werden, und die Funktionsweise von ddrescue, alle Fragmente zusammen in dieselbe Ausgabedatei schreiben, oder? Deshalb scheint diese Methode der Windows-Methode mit dsfo vorzuziehen, obwohl ich mit Linux weniger vertraut bin. Wenn jemand ein Windows-Tool kennt, das dies in einem Schritt tun kann, lassen Sie es mich wissen. GabrielB vor 6 Jahren 0
Richtig, ignoriere einfach meinen vorherigen Kommentar über das Zusammenführen der Dateien. Ich dachte, Sie würden in verschiedene Dateien ausgeben. : D Andrea Lazzarotto vor 6 Jahren 0
Übrigens, ich werde auf jeden Fall Ihr RecuperaBit-Tool ausprobieren - immer daran interessiert, neue Tricks in der Datenwiederherstellung zu lernen, um mit unerwarteten Problemen fertig zu werden. Da Sie auf diesem Gebiet ein Experte zu sein scheinen, hätten Sie ein paar Ideen bezüglich der verknüpften Frage # 1267334, bei der ich nach einem geeigneten Weg gefragt habe, um eine Liste von Dateien mit mindestens einem Sektor innerhalb eines bestimmten Bereichs zu erhalten? Wissen Sie über nfi.exe und seine Macken, wenn Sie Informationen zu einer stark fragmentierten Datei melden? (Anscheinend kann es manchmal nur den Kurznamen geben und nur einen Dateidatensatz melden, wenn der MFT mehrere Dateien für dieselbe Datei enthält.) GabrielB vor 6 Jahren 0
Nicht wirklich, aber eine Lösung könnte darin bestehen, das NTFS-Modul von RecuperaBit zu patchen, um nur die Sektorbereiche auszudrucken, die es liest, anstatt Dateien tatsächlich wiederherzustellen. Es kann funktionieren. Andrea Lazzarotto vor 6 Jahren 0

1 Antwort auf die Frage

2
GabrielB

Also habe ich diese ddrescue-Skripts ausgeführt (zuerst mit dem Befehl "chmod + x" ausführbar gemacht und dann mit ./name_of_the_script aufgerufen):

- Die Befehle funktionierten zunächst nicht, ddrescue gab nur Fehler an, ich musste die Skripts erneut bearbeiten, damit die Parameter vor den Namen der Eingabe- und Ausgabedateien stehen. Die Befehle sahen dann so aus:

ddrescue -P -i 2115843346432 -s 17563648 -o 0 ST3000DM001-2.dd 201707222358.mp4 ddrescue -P -i 2115861041152 -s 65536 -o 17563648 ST3000DM001-2.dd 201707222358.mp4 ddrescue -P -i 2115861172224 -s 262144 -o 17629184 ST3000DM001-2.dd 201707222358.mp4 ddrescue -P -i 2115861499904 -s 65536 -o 17891328 ST3000DM001-2.dd 201707222358.mp4 ddrescue -P -i 2115861630976 -s 196608 -o 17956864 ST3000DM001-2.dd 201707222358.mp4 ddrescue -P -i 2115862024192 -s 131072 -o 18153472 ST3000DM001-2.dd 201707222358.mp4 ... ddrescue -P -i 2327182266368 -s 36864 -o 883752960 ST3000DM001-2.dd 201707222358.mp4  (Total size of that file : 883787365, or 883789824 with the slack space.) (“-P” stands for “preview”, “-i” for “input position”, “-s” for “size”, “-o” for “output position”.) (The paths could be omitted as the scripts, the image file and the expected output files were all in the same directory.) 

- Beim ersten Versuch wurde eine nicht lesbare Datei ohne korrekten MP4-Header erstellt. Warum ? Da die von Hard Disk Sentinel bereitgestellte Liste zwar die physikalischen / absoluten Sektornummern, aber die logischen Clusternummern angibt (ich habe sie durch Öffnen der Image-Datei mit WinHex überprüft), musste ich der Eingabe-Offset-Berechnung 264192x512 hinzufügen (der Partitions-Offset betrug 264192) Sektoren oder 129 MB).

- Dann hat es funktioniert. Es dauerte nur ein paar Minuten und produzierte fünf Videodateien, die meistens lesbar sind und bis zum Ende übersprungen werden können - mit ihrem erwarteten Inhalt. Ich habe sie nicht vollständig angesehen, scheint jedoch so fehlerlos wie möglich zu sein.

(Ich habe all dies auf einem Sekundärcomputer gemacht, der auf Knoppix live von einer Speicherkarte ausgeführt wird, und habe TeamViewer verwendet, um es von meinem Hauptcomputer unter Windows 7 aus zu steuern und auch die Skriptdateien problemlos übertragen zu können. Möglicherweise gibt es eine einfachere Konfiguration für solche Zwecke, aber gut funktioniert es!: ^ p)

- Aber natürlich gibt es beschädigte Teile, da sich in diesem Teilbild unlesbare Sektoren befinden. Woher weiß ich wo, schnell und zuverlässig? Nun ...
Ich hatte die Idee, den Generierungsmodus von ddrescue zu verwenden, der Protokolldateien (oder Mapfiles, wie sie jetzt genannt werden) erstellt, indem die Ausgabe analysiert wird und in Betracht gezogen wird, dass vollständig leere Sektoren ungelesene Sektoren sind, der Rest ist "?" als "+" markiert. Da ddrescue eine Eingabedatei und eine Ausgabedatei erwartet, aber nur die Ausgabedatei tatsächlich in diesem Modus analysiert wird, erstellte ich mit diesem Befehl Dummy-Eingabedateien, die nur 1 MB kopieren, aber die Größe auf die Größe der Ausgabedateien (nur auf Zeit und Platz sparen):

ddrescue -s 1048576 -x 883789824 201707222358.mp4 201707222358copy.mp4 

Dann habe ich den Befehl "Generieren" ausgeführt:

ddrescue -G 201707222358copy.mp4 201707222358.mp4 201707222358-generate.log 

Und dann habe ich diese Dateien mit ddrescueview geöffnet:

(Drei der sechs Dateien sind wie die erste oben schwer beschädigt, mit großen leeren Datenblöcken, die anderen drei haben nur wenige beschädigte Sektoren wie der zweite. Der zweite ist der, der nicht fragmentiert war. Ich habe ihn extrahiert mit einem einzigen ddrescue-Befehl.)

Und dann klopfte ich mir mit einer Hand auf den Rücken, während ich mit der anderen auf mein Gesicht schlug, weil ich diese 3TB-Festplatte monatelang ohne Backup verwendet hatte ... (Zunächst sollte es nur temporäres Material speichern Ich würde auf anderen Festplatten Platz schaffen, aber es dauerte länger als erwartet, und ich hatte nicht mehr genug Platz, um solche Videos und sogar meine persönlichen Bilder und Videos zu speichern. Das hätte zu einer großen Katastrophe führen können, aber „es ist nur eine Panne ”, wie Dick Jones gesagt hätte.)

Sie können Ihre Frage und die Antwort neu ordnen, so dass die Frage eindeutig das anfängliche Problem darstellt und die Antwort eine schrittweise Lösung als Ganzes ist. Im Moment scheint die Frage einen Teil der Lösung zu enthalten und die Antwort geht einfach weiter. Versteht mich nicht falsch; Wenn Sie Ihre Frage bearbeiten, um einige Fortschritte anzuzeigen, war es richtig *, dann die Dinge aufzuschlüsseln. ** Aber ** unabhängig davon, ob Sie es tun oder nicht, Sie haben +1 von mir. Ich arbeite fast nie mit NTFS, ich werde Ihre Lösung wahrscheinlich nie verwenden oder testen, aber ich glaube, dass sie funktioniert und ich schätze, dass Sie sie teilen. Kamil Maciorowski vor 6 Jahren 1
Danke für den schönen Kommentar! Zumindest meine Bemühungen der Nacht waren nicht völlig sinnlos ... Was Ihren Vorschlag betrifft, frage ich mich, ob es die Mühe wert ist, jetzt eine Schritt-für-Schritt-Anleitung zu erstellen: Dies war ein sehr spezifisches Thema, bei dem ich Ich war sowohl besonders vorsichtig (zum Speichern der Listen von Sektoren / Clustern) als auch extra unvorsichtig (weil ich keine Sicherungskopie hatte und das gesamte MFT nicht speichern konnte, wenn ich konnte, bevor ich eine ernsthafte Wiederherstellung der problematischen Dateien versuchte, die mir bekannt waren waren stark fragmentiert). Trotzdem ist dies ein interessantes Problem, und die Lösung könnte auf andere Aufgaben anwendbar sein. GabrielB vor 6 Jahren 0
OK, vielleicht lohnt es sich nicht. Auf die eine oder andere Weise ist diese Frage und Antwort (als Ganzes gelesen) eine gute Arbeit. Kamil Maciorowski vor 6 Jahren 0