Wie emuliert man fehlerhafte Blöcke einer Festplattenpartition in einer Testdatei?

Wie emuliert man fehlerhafte Blöcke einer Festplattenpartition in einer Testdatei?

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 6144bedeutet: 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

verwandte Informationen