
Ich möchte einige Methoden zur Festplattenrettung testen, bevor ich sie in der Praxis anwende. Insbesondere die Möglichkeit von ddrescue, fehlerhafte Blöcke aus mehreren Festplattenkopien wiederherzustellen, vorausgesetzt, dass nicht in jeder Kopie ein fehlerhafter Block fehlerhaft ist.
Da Geräte unter Linux durch Dateien repräsentiert werden, denke ich, dass es möglich wäre, fehlerhafte Blöcke in einer Datei zu markieren. Angenommen, ich habe eine Referenzdatei und zwei Kopien wie hier erstellt:
dd if=/dev/random of=/tmp/file bs=1024 count=32768
cp /tmp/file /tmp/file1
cp /tmp/file /tmp/file2
Wie emulier ich fehlerhafte Blöcke in Datei1 und Datei2, als wären sie Gerätedateien?
LösungenHier,Hiervon Kamil Maciorowski undHiersind ein guter Weg zur Lösung, bieten aber keine vollständige Methode für meinen Anwendungsfall
Antwort1
Dank der Vorschläge von Kamil Maciorowski und seinen Antworten an anderer Stelle konnte ich den folgenden Prozess erstellen und testen:
1) Erstellen Sie eine Testdatei und berechnen Sie deren Hash, um die zukünftige Wiederherstellung zu überprüfen
dd if=/dev/urandom of=/tmp/file bs=512 count=32768 status=progress
sha256sum /tmp/file
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503 /tmp/file
2) Erstellen Sie damit ein Gerät
loopdev=\`losetup -f --show /tmp/file\`
echo $loopdev
/dev/loop1
3) Erstellen Sie beschädigte Geräte mit fehlerhaften Blöcken dank Devicemapper
dmsetup create file1 << EOF
0 2048 linear $loopdev 0
2048 4096 error
6144 26624 linear $loopdev 6144
EOF
dmsetup create file2 << EOF
0 30720 linear $loopdev 0
30720 2048 error
EOF
ls -l /dev/mapper/
lrwxrwxrwx 1 root root 7 mai 30 09:27 file1 -> ../dm-2
lrwxrwxrwx 1 root root 7 mai 30 09:27 file2 -> ../dm-3
Beachten Sie, dass in jeder Zeile die erste Zahl die Position und die zweite die Größe angibt. In der letzten Zeile ist die Summe also die Größe der Datei: 6144 + 26624 = 32768 und 30720 + 2048 = 32768
Die Zeile 6144 26624 linear $loopdev 6144
bedeutet: Kopiere das Gerät $loopdev vom Offset 6144 (in Bytes) nach Datei1 beim Offset 6144 (in Bytes) und mit einer Größe von 26624 Bytes.
4) Überprüfen Sie die E/A-Fehler an den erwarteten Stellen
dd if=/dev/mapper/file1 of=/dev/null count=2048
ok
dd if=/dev/mapper/file1 of=/dev/null count=2049
dd: error reading '/dev/mapper/file1': Input/output error
dd if=/dev/mapper/file2 of=/dev/null count=30720
ok
dd if=/dev/mapper/file2 of=/dev/null count=30721
dd: error reading '/dev/mapper/file2': Input/output error
An dieser Stelle ist die Frage des OP beantwortet. Lassen Sie uns weitermachen, um den Test abzuschließen:
5) Testen Sie ddrescue: nur gute Blöcke
ddrescue -B -v -n /dev/mapper/file1 /tmp/file1 /tmp/log
percent rescued: 87.50%
sha256sum /tmp/file1
0d344253f69688e23dd4558c2ffdabb0325f85848f7e65788ea5c9441e7a700c /tmp/file1
6) Reparieren Sie fehlerhafte Blöcke erfolgreich mit der zweiten Kopie
ddrescue -B -v -c 16 -r 2 /dev/mapper/file2 /tmp/file1 /tmp/log
percent rescued: 100.00%
sha256sum /tmp/file1
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503 /tmp/file1
7) Falls erforderlich (nicht 100%), versuchen Sie, fehlerhafte Blöcke mit der 1. Kopie zu retten
ddrescue -B -v -c 16 -r 2 /dev/mapper/file1 /tmp/file1 /tmp/log
8) Aufräumen
dmsetup remove file1
dmsetup remove file2
unset loopdev
rm /tmp/file* /tmp/log