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=sync
um conv=noerror
wirklich 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 data
stattdessen. Ich habe jedoch nach dem Hinzufügen sync
zu meiner Befehlszeile keine praktische Verbesserung erhalten : Die file -s
Ausgabe macht außer für die erste Partition, die keine Fehler im FS-Beschreibungsabschnitt enthält, noch keinen Sinn, sodass der file -s
Befehl FS korrekt erkennt. Ich bestätige das fehlerhafte Kopieren mount -o ro
für beide Laufwerke und vergleiche md5sum
s 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=sync
vorhanden). - Es werden keine Fehler gemeldet, während fehlerhafte Blöcke wiederholt werden.
PS Ich würde es gerne dd
nur mit machen. Die Verwendung ddrescue
ist problematisch ATM.
PPS Es ist Debian 8.7.1 und dd 8.23
partprobe
nach dem Kopieren über ein gesamtes Laufwerk ausgeführt werden, damit der Kernel über das neue Partitionslayout informiert ist.Antworten:
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.
quelle
ddrescue
.ddrescue
. Ja wirklich.