Ist es sicher, mehrere verschiedene "--input-position" mit ddrescue zu verwenden?

632
Thorsten Schöning

Ich muss Daten von einer 2 TB großen Festplatte retten, und zwar bei einigen Live-Linux in einigen VMs, wo die problematische Festplatte über USB 3 angeschlossen ist und die VM eine virtuelle Festplatte der erforderlichen Größe lokal bereitstellt um die Daten zu erhalten. Ich habe dann den folgenden Aufruf ausgeführt, einfach um zu sehen, wie die Dinge laufen:

ddrescue -f /dev/sdc /dev/sdb /mnt/sda1/ddrescue.map 

sdcist das defekte Gerät bei USB, sdbist die virtuelle Festplatte zum Empfangen der Daten, sda1ist für die temporäre Speicherung und wird mit Ext4 formatiert.

Die Dinge begannen schnell zu funktionieren, ddrescuekonnten innerhalb von Minuten ~ 45 GB an Daten lesen, dann verlangsamten sie sich massiv und lasen tagelang nur einige Bytes pro Sekunde. Das Gerät war offensichtlich an diesen Stellen defekt und ich versuchte, diese einfach zu überspringen, indem sie mehrere Aufrufe --input-position=[...]GBnacheinander verwendeten. Je nachdem, wo ich angesprungen war, lasen die Dinge wieder schnell, bis sie wieder langsam wurden und ich erneut mit einem anderen Aufruf sprang. Das Wichtigste ist, dass die Ein- und Ausgabeposition, die von gedruckt ddrescuewurden, immer synchron waren! Ich habe auch nichts in der bereitgestellten Map-Datei manuell geändert oder gelöscht oder was auch immer, es war immer eine und dieselbe Datei und wurde nur von ddrescueselbst verwaltet.

Danach habe ich den Ansatz etwas geändert und beschlossen, nicht --input-positionmehr manuell zu verwenden, sondern stattdessen Folgendes:

ddrescue -f --min-read-rate=1MB --skip-size=1MB /dev/sdc /dev/sdb /mnt/sda1/ddrescue.map 

Immer wenn ddrescuelangsame Teile erkannt wurden, wurden vernünftige Datenblöcke übersprungen und das Lesen fortgesetzt. Die Eingabe- und Ausgabeposition war wieder synchron und der Zähler der gelesenen und geretteten Daten wurde ständig erhöht. Bis zu diesem Zeitpunkt waren sie ddrescuefertig und sollen ~ 650 GB Daten gerettet haben.

Das Problem ist, dass nach dem letzten Blick auf die Dateien der virtuellen Festplatte scheinbar nur ~ 160 GB Daten tatsächlich gespeichert werden. Außerdem war der letzte Schreibzeitstempel einige Tage zu alt. Aus irgendeinem Grund ddrescuedachte ich, es würde eine Menge Daten lesen, aber es schien nicht richtig an den Stellen auf der virtuellen Festplatte geschrieben zu werden, an denen sie von der defekten Festplatte gelesen wurden. Am Ende sollte meines Erachtens die virtuelle Festplatte mindestens die Größe ddrescueder Datenmenge haben, die sie gerettet hat.

Ich habe das Gefühl, ddrescuealle Daten korrekt gelesen zu haben, aber bereits gerettete Daten bei nachfolgenden Aufrufen einfach überschrieben. Ich schätze, dass es erkannt wurde, --input-positionum gelesen zu werden, aber es scheint immer wieder von Position 0 aus am Ziel geschrieben zu sein.

Offensichtlich habe ich nicht die Startposition angegeben, in die Daten geschrieben werden sollen, aber gemäß den Dokumenten sollte dies nicht notwendig sein, und ddrescuedie Eingabe- und Ausgabeposition sollte immer gedruckt werden, damit sie sowieso gleich ist.

-o bytes --output-position=bytes Starting position of the image of the rescue domain in outfile, in bytes. Defaults to '--input-position'. The bytes below bytes aren't touched if  they exist and truncation is not requested. Else they are set to 0. 

Natürlich habe ich keine Abschneidung angefordert, da die Dokumente standardmäßig nicht aktiviert sind und auch nicht für das von mir angegebene Ziellaufwerk geeignet waren:

-t --truncate Truncate outfile to zero size before writing to it. Only works for regular files, not for drives or partitions. 

Also, eine Idee, was falsch gelaufen sein könnte? Waren meine mehrfachen Aufrufe mit unterschiedlichen Werten --input-positionschon falsch? Hat es mit dem Lesen und Schreiben von Laufwerken zu tun, anstatt mit Partitionen oder Dateien?

Vielleicht ein Problem beim Schreiben auf eine virtuelle Festplatte? Ich verstehe nicht, warum das einen Unterschied machen sollte, und ich muss auf ein virtuelles Laufwerk schreiben und kann keinen rohen Gerätespeicher in der erforderlichen Größe bereitstellen.

Vielen Dank!

0

3 Antworten auf die Frage

0
harrymc

Ich habe das ddrescueHandbuch gelesen und nirgends die Möglichkeit mehrerer input-positionParameter erwähnt.

Dieser Parameter wird immer als "a" oder "the" bezeichnet, daher muss es eindeutig sein.

Die Ursache Ihres Problems kann dieser Satz aus dem Handbuch sein:

Beachten Sie, dass Sie den ursprünglichen Versatz zwischen '--input-position' und '--output-position' des ursprünglichen Rettungslaufs beibehalten müssen.

Dies scheint mit dem folgenden anderen Absatz übereinzustimmen:

Ddrescue schreibt keine Nullen in die Ausgabe, wenn fehlerhafte Sektoren in der Eingabe gefunden werden, und schneidet die Ausgabedatei nicht ab, wenn dies nicht verlangt wird. Jedes Mal, wenn Sie es in derselben Ausgabedatei ausführen, versucht es, die Lücken zu füllen, ohne die bereits geretteten Daten zu löschen.

Das bedeutet, dass ddrescuesich die Parameter vom ersten Lauf an merken, so dass Sie immer die gleichen Parameter beibehalten oder in späteren Läufen nicht angeben sollten (ich kann nicht sagen, welcher der richtige ist). Es ist durchaus möglich, dass einige Parameter gespeichert wurden und Ihre neuen Parameter bei den folgenden Läufen ignoriert wurden.

Wenn Teile der Metatabellen des Datenträgers beschädigt wurden, werden möglicherweise weniger Daten angezeigt, als tatsächlich gerettet wurden, da diese Teile in keiner Datei enthalten sind.

Die Daten, ddrescuedie nicht gerettet werden können, müssen von anderen Wiederherstellungsprodukten wiederhergestellt werden. Dies kann einige Zeit in Anspruch nehmen und für die zur Verfügung stehenden Produkte sogar unmöglich sein. Wenn die Daten unbedingt wiederhergestellt werden müssen, kann ein professionelles Wiederherstellungsunternehmen dies möglicherweise von der Originalfestplatte aus tun. Diese Dienste sind jedoch teuer.

Scheint mir unklar zu sein: Ich habe das Argument nicht mehrmals pro Aufruf angegeben, sondern immer nur einmal pro Aufruf mit unterschiedlichen Werten. Zuerst mit zB 1 GB, dann mit 2 oder 500 usw. Und "ddrescue" begann immer zu lesen, wo ich es sagte. Nach meinem Verständnis sollte "ddrescue" sich auch um Dateien kümmern, wenn ich Rohgeräte spezifiziert habe, und sie sollte stattdessen einfach beliebiges "Zeug" lesen und schreiben. Thorsten Schöning vor 5 Jahren 0
In der Dokumentation sollten Sie es nicht mehrmals angeben, sondern immer den gleichen oder keinen Wert verwenden. Die Betriebsart von ddrescue setzt mehrere * identische * Läufe voraus. Wie gesagt, ich weiß nicht, ob mehrere Spezifikationen berücksichtigt werden oder nicht. Und er weiß nichts über Dateien, nur über Festplattensektoren, genau wie `dd`. harrymc vor 5 Jahren 0
Es kennt Dateien: "Infile und Outfile können Dateien, Geräte oder Partitionen sein." In Beispiel 5 werden auch deutlich unterschiedliche Positionen erwähnt: ist die Position, an der das Laufwerk nicht mehr antwortet "https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Examples Thorsten Schöning vor 5 Jahren 0
Ja, aber Sie verwenden diese Option nicht. harrymc vor 5 Jahren 0
"-i bytes --input-position = bytes" https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Invoking-ddrescue Thorsten Schöning vor 5 Jahren 0
0
Thorsten Schöning

Ist es sicher, --input-positionmit ddrescue mehrere unterschiedliche zu verwenden?

Anscheinend habe ich dieses Beispiel schon einmal verpasst, aber das ist genau das, was ich getan habe.

Example 5: While rescuing a partition in /dev/sda1 to the file hdimage, /dev/sda1 stops responding and begins returning read errors, causing ddrescue to mark the rest of the partition as non-scraped. ddrescue -n /dev/sda1 hdimage mapfile <-- /dev/sda1 fails here (restart /dev/sda or reboot computer) ddrescue -n -A -i<pos> -O /dev/sda1 hdimage mapfile (if /dev/sda1 fails again, restart /dev/sda or reboot computer and then repeat the above command as many times as needed until it succeeds. <pos> is the position where the drive stopped responding) ddrescue -d -r3 /dev/sda1 hdimage mapfile 

https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html#Examples

Der zweite Aufruf ist eindeutig dokumentiert, um mit verschiedenen Positionen wiederholt zu werden. Was die Funktionsweise ddrescueder Map-Datei angeht, ist dies auch sinnvoll, weil sie immer weiß, welche Blöcke bereits gelesen wurden.

Es scheint also sehr wahrscheinlich, dass das Problem in meinem Fall anders ist, vor allem der zu alte Zeitstempel, den ich erkannt habe, ist seltsam. Vielleicht habe ich einfach Nachrichten versäumt ddrescue, die aus irgendeinem Grund nicht auf das eigentliche Zielgerät schreiben. Die VM selbst befand sich ebenfalls auf einem anderen USB-Laufwerk. Möglicherweise gab es Verbindungsfehler, die dazu führten, dass das Gerät während der Laufzeit von Live-Linux übersehen wurde. Ich hätte solche Fehler leicht übersehen können, dmesg -Tda alle Lesefehler protokolliert wurden.

Klingt, als müsste ich den ganzen Vorgang wiederholen ...

Ich habe erneut mit 3 Aufrufen getestet, bei denen "--input-position = XGB" verwendet wurde, beginnend mit 0, 2 und 5 GB an Daten. Das Lesen um 1 GG und all das erhöhte den Speicher der virtuellen Zieldiskette, auf die ich schrieb. Ich bin mir ziemlich sicher, dass die Verwendung mehrerer "--input-position" sicher ist und ich etwas anderes falsch gemacht habe. Thorsten Schöning vor 5 Jahren 0
Das Problem scheint erneut aufgetreten zu sein: Nach ~ 23 Stunden Arbeit wurden ~ 485 GiB an Daten gerettet, `ddrescue 'liest und rettet weiterhin Daten, aber es werden keine Daten mehr auf die virtuelle Festplatte geschrieben. Keine Fehler in `dmesg -T` über die virtuelle Zieldiskette, nicht auf dem Host, die Schreibvorgänge verschwinden einfach irgendwo. Und weil "ddrescue" der Meinung ist, dass die Daten gerettet wurden, weiß man nicht, was fehlt und wo noch einmal gelesen wird. Thorsten Schöning vor 5 Jahren 0
-1
schweik

Da die Manpage von ddrescuelong ist, ist der Gebrauch von ddrescueZiel und Benutzerebene sehr unterschiedlich. Wenn Sie Live Linux verwenden, sollten Sie es auf der physischen Maschine anstelle von VM ausführen und die Festplatte ohne SATA / USB-Adapter an SATA anschließen.
Neben den anderen Funktionen ddrescuekönnen der Kernel-Festplattentreiber und die Puffer umgangen werden, wodurch das unnötige wiederholte Lesen schlechter Cluster reduziert wird. Die Mapfile (früher als Protokolldatei bezeichnet) enthält Informationen zu allen un / erfolgreichen Leseclustern. Deshalb können Sie den abgestürzten Schritt einfach wiederholen. Dasddrescuesucht nach mapfile, bevor es seinen Job startet, erstellt es, wenn es nicht existiert, liest es, wenn es verfügbar ist, und beginnt den Rettungsjob an der zuletzt aufgezeichneten Position. Sie müssen die Startposition nicht bei jedem Absturz des Programms von Hand verschieben!

Sie können verschiedene Optionen verwenden, um den Rettungsprozess schneller und sicherer zu gestalten. Sie können auch, und es wird empfohlen, den Rettungsvorgang in zwei oder mehreren Schritten durchzuführen:

Erster Schritt: Lesen Sie schnell die guten Cluster und überspringen Sie sofort die schlechten.

Zweiter Schritt: Behandeln Sie ungelesene Cluster aus dem vorherigen Schritt und verwenden Sie spezielle Optionen, um die Festplattenfunktionen (NCQ, Read ahead ...) auszulesen, um einen Sektor auf einmal lesen zu können. Die entsprechenden Befehle (ich benutze):

ddrescue -n -p -d -r1 /dev/sdd $IMGPATH/disk.img $IMGPATH/disk.log; ddrescue -d -r3 -R /dev/sdd $IMGPATH/disk.img $IMGPATH/disk.log; # | | | | | # | | | | revers reading # | | | retry read 1x (3x) # | | direct access to disk (bypass the kernel) # | preallocate diskspace  # nonscrap 

Wenn Ihre Festplatte zu stark heizt oder nicht zu viele Leseoperationen / s hat, können Sie das Lesen mit der Option verlangsamen: --max-read-rate=50M

Das ist also nur für den ersten Kontakt, aber Sie können viele Ratschläge in spezialisierten Clubs oder Foren für das Internet finden ddrescue.

-1. Das OP stellte einige Fragen (einschließlich der im Titel). Meiner Meinung nach haben Sie auf keine von ihnen eine direkte Antwort gegeben. Die Diskrepanz zwischen angeblich geretteten ~ 650 GB Daten und einer viel kleineren virtuellen Festplatte ist immer noch ein Rätsel. Wir wissen nicht, was schief gelaufen ist und ob "--input-position" sicher ist. Ihre Antwort mag technisch richtig sein, aber sie beantwortet nicht * die * Frage. Kamil Maciorowski vor 5 Jahren 1
Tut mir leid, Kamil, ich habe versucht zu zeigen, wie man die ddrescue besser einsetzt, um Ergebnisse und keine Artefakte zu erhalten. Sie können Ihre Antwort posten, um das Geheimnis zu entdecken. Danke für Ihre Hilfe. schweik vor 5 Jahren 0