ddrescue, "Größe auf Festplatte" ist geringer als die Gesamtgröße, mit möglichen Auswirkungen auf die Leistung beim Schreiben in NTFS

673
GabrielB

Die Hintergrundgeschichte ist in meiner vorherigen Frage und meiner eigenen Antwort darauf .

Zu einem Zeitpunkt hatte ich zwei Teilabbilder erstellt von ddrescue: einer Datei im NTFS-Dateisystem und der anderen in Ext4.

Ich hatte schon früh bemerkt, dass die "Größe auf der Festplatte" für beide Bilder viel niedriger war als die Gesamtgröße, was darauf hindeutet (wenn ich mich nicht irre), dass diese Dateien als "spärlich" geschrieben wurden, dh, dass die Dateien leer sind auf den entsprechenden Datenträgern waren keine Daten tatsächlich zugeordnet, lediglich die bereits geretteten Daten wurden abgerechnet. Ich habe jedoch zu keinem Zeitpunkt den -SSchalter in meinen ddrescueBefehlen verwendet, der besagt, dass die Ausgabedatei als "spärlich" geschrieben werden sollte.

Randbemerkung: Ich habe anfangs den -RSchalter ("Reverse") verwendet, wobei ich davon ausging, dass er sofort die gesamte Größe der Eingangs-HDD zuweisen würde (die Idee war, dass dies zu einer "saubereren" Ausgabe führt und alle schreibt die Daten sequentiell auf der empfangenden Partition, um die Integrität der Image-Datei zu erhalten, auch wenn etwas mit dem Dateisystem schief gehen würde und ich die Wiederherstellung wiederherstellen müsste…); Die angezeigte Größe der Datei wurde zwar auf 931,5 GB erhöht, tatsächlich wurde die „Größe auf der Festplatte“ jedoch nur um die kleine Datenmenge erhöht, die während dieses Schritts kopiert wurde.

Die Hauptfrage wäre also: Wie lässt sich diese Sparheit erklären? Warum ist die ddrescueKopie standardmäßig nicht sequenziell?

Da ich zwei Teilbilder hatte, die beide gültige Daten enthielten, tat ich Folgendes:

  • Ich habe versucht, die geretteten Bereiche aus dem zweiten Image auf der ext4-Partition, die im ersten Image fehlen, in das erste Image auf der NTFS-Partition zu kopieren, das sehr schnell sein sollte, da sich beide Images auf derselben gesunden 2-TB-HDD (eine Seagate-Festplatte) befinden ST2000DX001 mit einer maximalen Schreibgeschwindigkeit nahe 200 MB / s). Es stellte sich jedoch heraus, dass es sehr langsam war: nur 660 KB / s.
  • Also stoppte ich und tat das Gegenteil: Ich habe ddrescuedie geretteten Bereiche aus dem ersten Image (unter NTFS), die im zweiten Image fehlen, in das zweite Image (auf ext4) kopiert. Und jetzt bekam ich eine Kopierrate von 43000KB / s oder 43MB / s, die erheblich höher lag und näher an einer normalen Kopierrate auf derselben Festplatte dieser Klasse und Kapazität lag.

Die zweite Frage: Könnte dieses merkwürdige Verhalten mit dem Leistungsproblem zusammenhängen, das beim Schreiben auf NTFS aufgetreten ist? Hat der Linux-NTFS-Treiber Probleme, mit großen "spärlichen" Dateien umzugehen?

0
Ihre Frage war fast eine Wand aus Text, mit der gesamten Hintergrundgeschichte, die nicht wirklich wichtig ist, weil man das aktuelle Thema ohne verstehen kann (und wenn jemand interessiert ist, kann er oder sie dem angegebenen Link folgen). Ich habe den Fragenkörper kürzer und leichter lesbar gemacht. Ich denke, dass es zwei getrennte Fragen sein sollte: (1) über Spärlichkeit, (2) über NTFS-Verhalten, vermutlich aufgrund von Spärlichkeit. Solange es noch keine Antworten zu beiden Themen gibt, können Sie diese Frage auf ein Thema reduzieren und eine andere Frage zum anderen stellen. IMO das wäre das Richtige. Kamil Maciorowski vor 6 Jahren 0
Nun, ich habe versucht, Ihre Vorschläge anzuwenden, aber es scheint, als wäre es nie formell genug, und ich bin ziemlich verwirrt über die strengen Regeln für die Veröffentlichung auf dieser ansonsten hervorragenden Website (vielleicht sagen Sie mir, dass es nur deshalb hervorragend ist, weil sie es ist streng!: ^ p). Ich meine, es ist schon nicht so einfach, solche technischen Fragen in ungefähr gutem Englisch klar zu formulieren (was ich bisher ziemlich gut gemacht habe), es kann entmutigend sein, dann in scheinbar endlosem Editieren verloren gehen zu müssen, um ein bestimmtes zu treffen Standard, der ab einem bestimmten Punkt die Qualität / Klarheit nicht wesentlich verbessert. GabrielB vor 6 Jahren 0
Hier schlagen Sie mir vor, zwei getrennte Fragen zu stellen, aber für mich sind sie ein und dasselbe, denn ich bin mir nicht einmal sicher, ob ich die richtige Terminologie verwende und ob meine Interpretationen / Annahmen sogar aus der Ferne richtig sind. Ich versuche nur so viel wie möglich von einer defekten Festplatte mit einem Tool namens ddrescue wiederherzustellen. Ich weiß so gut wie nichts über „Spärlichkeit“. Ich habe das Konzept erst kürzlich entdeckt. Ich bin nicht sicher, wie es auf logischer Ebene funktioniert und wie es übersetzt wird, wenn es um die eigentlichen Daten auf dem Speichergerät geht. Ich kann nicht mit Sicherheit sagen, ob das, was ich gesehen habe, tatsächlich mit Spärlichkeit zusammenhängt. GabrielB vor 6 Jahren 0
(1) Ich entschuldige mich, wenn Sie meine Bemerkungen einschüchternd fanden. (2) Ich bin nur ein zufälliger Typ im Internet, du kannst mich ignorieren. (3) Trotzdem habe ich auf dieser Website einige Erfahrung, um herauszufinden, welche Fragen auf gute Antworten stoßen. (4) Diese Frage hat ein Potenzial, aber früher war es sehr lang, ich habe meine Zeit investiert, um sie lesbarer zu machen. Wenn ich gedacht hätte, dass es nicht formal genug wäre, hätte ich es abgelehnt, aber ich tat es nicht. Kamil Maciorowski vor 6 Jahren 0
(5) Der Hauptpunkt, den Sie vermissen, scheint mir zu sein: Eine Frage ist gut, wenn sie (dh Antworten darauf) anderen Benutzern mit ähnlichen Problemen helfen kann. Wenn Sie dies bedenken, neigen Sie dazu, Ihre spezifischen komplexen Fälle in Fragen aufzuteilen, die separat beantwortet werden können (möglicherweise etwas abhängig). In Ihrer vorherigen Frage (und Antwort) haben Sie versucht, * Ihren spezifischen komplexen Fall * an einem Ort durch Zusatzfragen zu behandeln, und ich habe Ihnen empfohlen, diese gesondert zu stellen. Jetzt machst du etwas Ähnliches, aber es ist hier nicht die beste Strategie. Kamil Maciorowski vor 6 Jahren 0
(6) Im Einzelnen: In Ihrer Antwort auf die vorherige Frage haben Sie festgestellt, dass Sie Dateien mit geringerem Speicher unter NTFS * und * ext4 erhalten haben. Dies legt nahe, dass Ihre Hauptfrage hier nichts mit NTFS zu tun hat. Eine Antwort auf "Warum waren die Dateien spärlich?" Es hängt natürlich nicht davon ab, was Sie als Nächstes tun. "Ist der Linux-NTFS-Treiber dafür bekannt, Probleme mit großen spärlichen Dateien zu haben?" hat wahrscheinlich eine Antwort, die nicht davon abhängt, warum diese Dateien sparsam erstellt wurden. Deshalb denke ich, dass es zwei separate Fragen geben sollte (aber ich habe bemerkt, dass ich deine Frage nicht so sehr geändert habe, es ist deine Entscheidung). Kamil Maciorowski vor 6 Jahren 0
(7) Ich habe darüber nachgedacht, das Verhalten von "ddrescue" zu untersuchen. Um hier eine gute Antwort zu posten, sollte ich auch untersuchen, wie Linux mit spärlichen Dateien unter NTFS arbeitet. Ich stelle mir Benutzer vor, die den Teil über NTFS beantworten können, sich aber selbst einschränken, weil sie `ddrescue` nicht kennen. Durch das Trennen dieser Probleme erhöhen Sie * Ihre Chancen, gute Antworten zu erhalten * und * Chancen, sie für andere Benutzer nützlich zu machen. Kamil Maciorowski vor 6 Jahren 0
"und ich bin ziemlich verblüfft über die strengen Regeln für das Posten auf dieser ansonsten ausgezeichneten Website" - Diese Exzellenz-Website wird durch diese Regeln ermöglicht, die es Ihnen ermöglichen, hervorragende Antworten auf die hervorragenden Fragen anderer zu finden und hoffentlich zu verbessern Die Qualität dieser Frage erhält eine hervorragende Antwort auf Ihre eigene Frage. Ohne diese Regeln würde die Menge an Lärm es unmöglich machen, Fragen mit Qualitätsantworten zu finden. Ramhound vor 6 Jahren 1
@ KamilMaciorowski & Ramhound: Ich habe Ihre Kommentare sorgfältig gelesen und werde versuchen, diese Prinzipien anzuwenden, wenn ich das nächste Mal eine Frage stelle. Ich denke jedoch, dass es in diesem Fall hilfreich sein sollte, da es aus guten (oder schlechten) Gründen mit Ddrescue und Datenwiederherstellung zusammenhängt, die als recht beliebte Themen erscheinen. Ich könnte noch eine weitere Frage erstellen, wie Linux mit NTFS funktioniert, Ihrem Ratschlag folgend. GabrielB vor 6 Jahren 0

2 Antworten auf die Frage

1
Kamil Maciorowski

Diese Antwort untersucht das Verhalten ddrescueder Hauptfrage. Wenn Sie nicht an einem Testverfahren interessiert sind, können Sie am Ende zu meinen Schlussfolgerungen und Interpretationen gehen.

Testbed

$ uname -a Linux foo 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux  $ cat /etc/issue Ubuntu 14.04.5 LTS \n \l  $ ddrescue -V GNU ddrescue 1.17 … 

Das Dateisystem ist btrfs. Es sollte jedoch keine Rolle spielen, solange es spärliche Dateien unterstützt.

Testen

Zuerst bekam ich 8 MB zufällige Daten:

dd if=/dev/urandom of=random.chunk bs=1M count=8 

Dann machte ich es zu einem Loopback-Gerät und erinnerte mich an seinen Namen:

loopdev=`sudo losetup -f --show random.chunk` 

Als Nächstes habe ich ein weiteres Gerät erstellt, das aus bestand

  • Chunk 0: nicht lesbar, 1 MiB
  • Block 1: Nullen, 2 MiB
  • Block 2: nicht lesbar, 4 MiB
  • Block 3: Daten von random.chunk, 8 MiB
  • Block 4: nicht lesbar, 16 MiB

Der Code (es verwendet hier Dokumentsyntax ):

sudo dmsetup create mydevice << EOF 0 2048 error 2048 4096 zero 6144 8192 error 14336 16384 linear $loopdev 0 30720 32768 error EOF 

Ich bestätigte damit, gdisk -l /dev/mapper/mydevicedass die Gesamtgröße 31 MiB beträgt, wie es sein sollte.

Das eigentliche Lesen erfolgt mit:

ddrescue /dev/mapper/mydevice normal.raw normal.log ddrescue -R /dev/mapper/mydevice normalR.raw normalR.log ddrescue -S /dev/mapper/mydevice sparse.raw sparse.log ddrescue -RS /dev/mapper/mydevice sparseR.raw sparseR.log 

Und die Ergebnisse von ls -hls *.rawsind

 10M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 normal.raw 10M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 normalR.raw 8.0M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 sparse.raw 8.0M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 sparseR.raw 

To be sure, I confirmed with cmp that all four files are identical when you read them. Four logfiles contained the same map of erroneous and healthy sectors.

Notice that

  • 15 MiB means the last chunk is missing;
  • 10 MiB indicates chunk 1 and chunk 3;
  • 8 MiB indicates chunk 3 only.

Cleaning

sudo dmsetup remove mydevice sudo losetup -d $loopdev unset loopdev rm random.chunk normal.raw normal.log normalR.raw normalR.log sparse.raw sparse.log sparseR.raw sparseR.log 

Conclusions

  • When it comes to file size, it doesn't matter whether you read in reverse (-R) or not.
  • Unreadable chunk at the very end of the input file doesn't contribute to the overall size of the output file.
  • Unreadable chunks that do contribute to overall file size are always sparse (if target filesystem supports this, of course).
  • The -S option only affects blocks of zeros that were actually read from the input file.

Interpretation

Above there were facts. This section is more like my opinion.

It appears ddrescue tries to save you diskspace whenever it can do this without additional work. When you use -S the tool has to do some computations to check if a given data block is all zeros. If there's a read error it doesn't need to compute anything, it can make the fragment sparse in the output file with no cost.

Solution

You wrote:

using the -R switch (“reverse”) at the beginning, figuring that it would allocate the whole size of the input HDD right away

We just saw it's a false assumption. In fact you described what -p does. ddrescue -p will preallocate space on disk for output file. When I did this during my tests the output file had 31 MiB and was not sparse (even with -S).

Ich würde mich für das Testverfahren interessieren, aber ich bin hier in den Details ziemlich verloren! : ^ p (Neulich in Linux, kaum genug Syntax, um ddrescue und einige andere verwandte Tools auszuführen.) Ich habe selbst einen einfacheren Test durchgeführt (siehe meine Antwort), der Ihre Ergebnisse und meine früheren Beobachtungen zu bestätigen scheint. In Bezug auf die Option -p habe ich es zuerst probiert. Wie ich jedoch erklärte, erwies es sich als sehr langwierig, da tatsächlich die leere Datei vollständig in die Ausgabe geschrieben wird (in diesem Fall 1 TB), anstatt nur die Größe zuzuweisen. was sollte / könnte (?) sofort gemacht werden. GabrielB vor 6 Jahren 0
@GabrielB Wie wäre es mit `fallocate -l Dateiname` vorher? Meine "ddrescue" oder "Fallocate" benötigen etwa zwei Sekunden, um mehr als 70 GiB zuzuteilen, daher sollte 1 TB nicht sehr lange dauern. Ich arbeite zwar an btrfs, kann ext4 aber momentan nicht testen. Kamil Maciorowski vor 6 Jahren 0
Ich begann den gesamten Prozess mit einer NTFS-Partition (bevor ich zu Ext4 wechselte, wie in der ersten Frage erklärt), und als ich den -P-Switch ausprobierte. Es kann also sein, dass hier etwas passiert ... Wenn die Zuweisung eines großen Volumes auf einer ext4-Partition in wenigen Sekunden erledigt ist, würde dies bedeuten, dass die aktuelle NTFS-Unterstützung unter Linux diese Art von Unterstützung nicht zulässt Der Betrieb ist so effizient wie mit einem nativen Linux-Dateisystem (ich habe übrigens noch nie von btrfs gehört). Aber könnte es eine so große Verlangsamung erklären? GabrielB vor 6 Jahren 0
0
GabrielB

Ich habe selbst einen anderen Test gemacht.

- Ich habe eine einfache Vorlagendatei erstellt, die folgendes enthält:

0x00000000 0x100000 ? 0x100000 0x3FE00000 + 0x3FF00000 0x100000 ? 

(Das bedeutet: Innerhalb eines GB Daten insgesamt wurden der erste und der letzte MB nicht versucht, der Rest wird als "gerettet" betrachtet.)

- Ich habe ddrescue mit dieser Protokoll- / Map-Datei ausgeführt und diesen Befehl verwendet (mit dem geretteten Image von der Wiederherstellung dieser 1-TB-Festplatte als Eingabe, die die Ausgabe auf 1 GB reduziert):

ddrescue -s 1073741824 [rescued_image_file] [test1GB] [test1GB.log] 

Die resultierende Datei [test1GB] hat erwartungsgemäß eine Gesamtgröße von 1 GB, jedoch eine Größe von 2 MB auf der Festplatte. Dies bedeutet, dass nur die tatsächlich kopierten Daten (erstes und letztes MB) zugewiesen wurden.

- Dann habe ich ddrescue mit dieser 1GB-Datei als Eingabe ausgeführt, diesmal ohne Vorlage, zuerst ohne und dann mit dem -S-Schalter ("sparse schreibt").

ddrescue [test1GB] [test1GB-NS] [test1GB-NS.log] ddrescue -S [test1GB] [test1GB-S] [test1GB-S.log] 

Und es scheint, dass:

  • [test1GB-NS] (nicht spärlich) hat eine "Größe auf der Festplatte" von 1 GB - daher wurde die gesamte Datei zugewiesen und kopiert, auch die leeren Sektoren. wohingegen...
  • [test1GB-S] (sparse) hat eine "Größe auf der Festplatte" von nur 1,2 MB oder 1114112 Bytes. Dies bedeutet, dass die leeren Sektoren nicht zugewiesen wurden, selbst die im ersten und letzten MB enthaltenen.

Ich dachte, dass „Spärlichkeit“ ein Alles-oder-Nichts-Konzept ist, genau wie die Dateikomprimierung, aber anscheinend gibt es so etwas wie eine „teilweise spärliche“ Datei, und tatsächlich scheint ddrescue so Platz zu sparen - was aber nicht der Fall ist notwendigerweise ein Vorteil (und könnte sich in der Tat auf die Leistung auswirken); Es sollte einen Schalter geben, damit die Ausgabedatei sofort in voller Größe zugewiesen werden kann (im Gegensatz zur Vorzuordnung, die bei großen Eingaben sehr lang sein kann), genau wie beim direkten Schreiben (offensichtlich) zu einem Gerät oder einer Partition.