dd läuft am Ende des Eingabegeräts vorbei

Aug 18 2020

Ich versuche, ddeine von mir reparierte Festplatte zu klonen. Ich versuche, ddDaten in 10-GB-Blöcken vom Laufwerk zu kopieren, überträgt jedoch mehr Daten, als das Laufwerk enthalten sollte. Das Laufwerk selbst funktioniert und die darauf befindliche Partition kann gemountet werden.

Mit habe df -hich die Größe des Laufwerks auf 1000204886016 Bytes (1 TB Laufwerk) gebracht.

Ich habe zunächst versucht:

sudo dd if=/dev/sdb of=/dev/sdd status=progress

Dies verlangsamte sich jedoch nach etwa 300 GB auf ein Crawling und schlug schließlich aufgrund eines Lesefehlers fehl. Ich beschloss, es in 10-GB-Blöcken zu kopieren. Ich habe berechnet, dass für das Lesen von 10 GB mit einer Blockgröße von 128 KByte 78125 Blöcke kopiert werden müssen.

Dazu benutze ich:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n

ddberichtete, dass jedes Mal 10240000000 Bytes übertragen wurden. Um den Suchwert für jede Iteration zu berechnen, habe ich die übertragenen Bytes aggregiert und 1 GB subtrahiert, um sicherzustellen, dass es eine gewisse Überlappung gibt. Die resultierende Sequenz ist:

seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000

Ich habe diese in einem Shell-Skript mit diskreten dd-Befehlen geschrieben und ausgeführt. Ich habe die letzte Iteration frei gelassen, um so viele Daten wie nötig zu kopieren.

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
    ...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000

Es hätte bei dieser letzten Iteration weit über das Ende der Fahrt hinaus laufen sollen, aber es ging einfach weiter. Der Klon wird bereitgestellt, ist jedoch eindeutig beschädigt und es fehlen Daten.

  1. Stimmt etwas mit meiner Mathematik oder den Argumenten, mit denen ich gearbeitet habe, nicht dd?
  2. Gibt es eine bessere Möglichkeit für mich, einen 'dd'-Befehl zu schreiben, um die Daten in 10-GB-Blöcken herauszuholen?

Antworten

3 thatotherguy Aug 18 2020 at 02:31

Das Problem ist, dass Sie davon ausgehen, dass seekein Bytewert verwendet wird, während in Wirklichkeit eine Blockanzahl erforderlich ist. Sie sollten verwenden seek=0, 78125, 156250etc.

Sie können es jedoch erheblich vereinfachen, indem Sie Folgendes entfernen dd:

split -b 10G < /dev/sdd
3 roaima Aug 18 2020 at 06:36

Ich versuche, mit dd eine von mir reparierte Festplatte zu klonen

Tu es nicht.

Verwenden Sie ddrescuestattdessen, um unlesbare Blöcke und andere Medienfehler gut zu verarbeiten.

2 alphasierra Aug 21 2020 at 03:06

Ich entdeckte, dass der Grund, warum meine Lösung fehlschlug, ein Missverständnis darüber war, was die Suchflagge tat. Es wurde nur die Schreibposition auf dem Ausgabelaufwerk verschoben. Das Skript kopierte also immer wieder die ersten 10 GB auf die Ausgabe. Es würde niemals das Ende des Geräts erreichen.

Um die Eingabe zu verschieben, musste auch das Sprung-Flag verwendet werden:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n

Durch Festlegen oflag=seek_bytesund iflag=skip_bytesErmöglichen kann die Berechnung in Bytes im Gegensatz zu Blöcken durchgeführt werden.

Die von roaima (verwenden Sie ddrescue) und diesem anderen Typ ( split -b 10G < /dev/sdd) angebotenen Optionen sind jedoch eine bessere Möglichkeit, beschädigte Laufwerke wiederherzustellen und segmentierte Übertragungen durchzuführen.