Blind dd'ing fehlerhaftes Laufwerk auf neues Laufwerk

2

Ich habe ein fehlerhaftes 320-GB-Laufwerk mit Lesefehlern an denselben GB-Positionen, aber die genauen Positionen variieren. Ich bin mit Fehlerwahrscheinlichkeit in Ordnung, das kommt hier nicht in Frage.

Zuallererst war ich überrascht, dass ich brauche, conv=syncum conv=noerrorwirklich nützlich zu sein, aber ok, ich habe Freizeit, um neue Füße wachsen zu lassen. Ich fand es, weil file -s /dev/sdc*es keine sinnvolle Ausgabe für die letzten Partitionen gab (dh dasselbe wie für das Quelllaufwerk), hieß es datastattdessen. Ich habe jedoch nach dem Hinzufügen synczu meiner Befehlszeile keine praktische Verbesserung erhalten : Die file -sAusgabe macht außer für die erste Partition, die keine Fehler im FS-Beschreibungsabschnitt enthält, noch keinen Sinn, sodass der file -sBefehl FS korrekt erkennt. Ich bestätige das fehlerhafte Kopieren mount -o rofür beide Laufwerke und vergleiche md5sums für alle Dateien (nur die Verzeichnisstruktur ist fehlerhaft).

Ich versuche es auf folgende Weise auf ein neues größeres Laufwerk zu bringen:

dd if=/dev/sda3 conv=noerror,sync bs=1M of=/dev/sdc3 2> /part3_log
grep -oPaz '[[:digit:]]*(?=\+[[:digit:]]+ records out\n)' </part3_log >/part3_log_bads # parsing is ok for this specific case
rm /part3_log_01
for i in $(cat /part3_log_bads); do dd if=/dev/sda3 conv=noerror,sync bs=1M of=/dev/sdc3 skip=$((i-1)) seek=$((i-1)) count=1 2>>/part3_log_01; done # retrying erratic blocks. i-1 because of number of records is written after erratic block was padded and written. noerror does not make any practical difference here. 

Ich erhalte diese Ausgabe für jeden fehlerhaften Block in /part3_log(wie erwartet):

dd: error reading ‘/dev/sda3’: Input/output error
71051+3 records in  <<<<<<<<< second number increments from 0 after each erratic block indicating partial read, this is expected
71054+0 records out
74505519104 bytes (75 GB) copied, 2546,96 s, 29,3 MB/s

Und ich bekomme diese seltsame Ausgabe (Geschwindigkeitsdifferenz wird erwartet) für alle Blöcke in /part3_log_01:

1048576 bytes (1,0 MB) copied, 6,5663 s, 160 kB/s
0+1 records in
0+0 records out
0 bytes (0 B) copied, 6,41877 s, 0,0 kB/s
0+1 records in
1+0 records out
1048576 bytes (1,0 MB) copied, 7,42028 s, 141 kB/s
1+0 records in
1+0 records out

Was meine Aufmerksamkeit auf sich zieht, ist, dass fast jeder Eingabedatensatz teilweise gelesen wird, während keine Fehler gemeldet werden, obwohl sie tatsächlich auftreten (ich sehe sie in dmesg). Es wurde kein Fehler gemeldet sdc(es handelt sich erwartungsgemäß um ein neues Laufwerk).

Wie kopiere ich ein fehlerhaftes Laufwerk blind und versuche dann, die fehlerhaften Datensätze erneut? Mein Ansatz scheint an zwei Punkten zu scheitern:

  • Es können keine Daten kopiert werden, ohne dass nach fehlerhaften Blöcken eine Verschiebung auftritt (obwohl conv=syncvorhanden).
  • Es werden keine Fehler gemeldet, während fehlerhafte Blöcke wiederholt werden.

PS Ich würde es gerne ddnur mit machen. Die Verwendung ddrescueist problematisch ATM.

PPS Es ist Debian 8.7.1 und dd 8.23

Euri Pinhollow
quelle
Sie sollten wahrscheinlich partprobenach dem Kopieren über ein gesamtes Laufwerk ausgeführt werden, damit der Kernel über das neue Partitionslayout informiert ist.
Mark Plotnick
@ MarkPlotnick Ich habe es vergessen, aber die neue Partitionstabelle war in Kraft, nachdem ich sie zum ersten Mal umgeschrieben habe. Es wird wahrscheinlich regelmäßig aktualisiert. Ich habe meine Festplatte nach meinen ersten Versuchen neu gesteckt und seitdem nie mehr den MBR geändert, also ist das definitiv kein Problem.
Euri Pinhollow

Antworten:

2

Versuchen Sie ddrescue (gddrescue in den meisten Distributionen):

GNU ddrescue - Tool zur Datenwiederherstellung. Kopiert Daten von einer Datei oder einem Blockgerät auf ein anderes und versucht, bei Lesefehlern zuerst die fehlerfreien Teile zu retten.

stoney
quelle
Ich würde es gerne mit dd machen, es sei denn, ich brauche es unbedingt ddrescue.
Euri Pinhollow
1
@EuriPinhollow musst du unbedingt benutzen ddrescue. Ja wirklich.
Roaima