Hitachi stirbt hart, heftig und techno-nekrophil

Achtung: Die in diesem Artikel beschriebene Lösung ist nicht professionell. Sie wurde möglicherweise aufgrund eines Missverständnisses der Struktur und der Funktionsweise von Festplatten erstellt. Das Wiederholen der obigen Schritte kann das Gerät beschädigen.


Kürzlich bin ich auf einen Artikel über die Verwendung alter Festplatten mit defekten Blöcken gestoßen und dachte, dass meine Erfahrung auch für jemanden interessant sein könnte.


Einmal baten mich Bekannte, mit einem Laptop fertig zu werden, auf dem sie Windows nicht neu installieren konnten. Dem Aussehen nach hatte der Laptop ein hartes Leben: Risse im Gehäuse, verbeulte Ecken, zerbrochene Gestelle. Es ist klar, dass das Problem eine Beschädigung der Festplatte durch zahlreiche Anschläge ist, was auch von smart bestätigt wurde: Mehr als 200 G-Sensor-Vorgänge, 500 neu zugewiesene Sektorenanzahl und es steht immer noch Current Pending an. Nun, Leute, natürlich habe ich die SSD installiert und die Informationen von ihrer Schraube mit dem folgenden Befehl in das Image kopiert:


dd if=/dev/sdb of=/media/hddimages/ht320.img bs=409600 conv=noerror,notrunc,sync 

Die Parameter "conv = noerror, notrunc, sync" werden benötigt, damit bei Fehlern beim Lesen bestimmter Sektoren Nullen an diese Adressen in der Ausgabedatei geschrieben werden und die Daten ohne Vorspannung an ihre Stelle geschrieben werden.


Es kommt vor, dass beim Einlesen großer Blöcke (400 KB) nicht der gesamte Block und bei kleineren Blöcken nur ein Sektor gelesen wird. Die Sektoren hier sind 4 KB groß. Wenn nach dem ersten Durchlauf von dd Lesefehler aufgetreten sind, versuche ich, diese Abschnitte in 4-KB-Blöcken erneut zu lesen:


 n=<>;dd if=/dev/sdb of=/media/hddimages/ht320.img bs=4096 conv=noerror,notrunc,sync skip=$n seek=$n count=100 

Die Parameter "Überspringen" und "Suchen" werden benötigt, damit das Lesen und Schreiben mit demselben Einzug am Anfang der Festplatte beginnt. Der Einzug selbst wird aus der Ausgabe der ersten dd-Ausführung genommen, nur um der Blockgröße zu entsprechen, multiplizieren Sie die Zahl mit 100.


Manchmal frieren Festplatten beim Zugriff auf fehlerhafte Sektoren für eine lange Zeit ein, so dass nur das erneute Anschließen an die Stromversorgung hilft. Vor ungefähr 5 Jahren wurde ein Hardware-Software-Komplex (sogar mit einem Mikrocontroller) erstellt, um das Lesen fehlerhafter Festplatten mit automatischem erneutem Anschließen an die Stromversorgung zu automatisieren ein langer Mangel an Antwort. Es war interessant und erlaubt, nach 10 Tagen durch Verbinden der Festplatte und Eingeben des Befehls das vollständigste Bild zu erhalten. Aber der experimentelle Held des Artikels hing nicht fest, so dass die beschriebene schwere Krücke nicht besorgt werden musste.


Also, die Festplatte wurde in Betracht gezogen, ich habe alle Bereiche des Images durch Losetup mit Offsets des Anfangs der Partitionen von fdisk gemountet, multipliziert mit der logischen Blockgröße in mbr - 512 Bytes, ich kopiere alle Daten auf Leute auf einer neuen SSD. Wenn die Festplatte nicht gemountet wurde oder viele Dateien nicht gelesen werden konnten, würde ich das Image mit R-Studio öffnen und es über das Image selbst wiederherstellen.


Aber das Schwierige, obwohl es besiegt ist, ist schade, es rauszuwerfen, also habe ich beschlossen, es irgendwie zu überdenken. Theoretisch markiert der Festplattencontroller Sektoren als beschädigt und weist die Sicherungssektoren bei wiederholten erfolglosen Schreibversuchen oder nicht behebbaren Lesefehlern (unter Verwendung von ECC) ihren Adressen zu.


Zunächst versuche ich, die Festplatte zu löschen (dd if = / dev / zero ...) und danach zu lesen: Die Geschwindigkeit ist ebenfalls instabil, die Festplatte friert ein und manchmal treten Eingabe- / Ausgabefehler auf, aber im Smart steigt die Anzahl der Relocks und Pendings. Nach mehreren Zyklen änderte sich der Smart nicht besonders stark, Pendings wurden nicht verschoben, und fehlerhafte Hänge treten jedes Mal an denselben Orten oder in unmittelbarer Nähe auf. Ich versuche, manuell mit dem Befehl "hdparm --make-bad-sector" eine zwangsweise Neuzuordnung durchzuführen, aber dies funktioniert bei diesem Modell nicht, und ich stelle fest, dass nur das Löschen, Lesen und Schreiben, nicht alle Problembereiche aufzeigen kann. In der Tat, wenn ein beschädigtes Bit, ungeachtet dessen, was es zu schreiben versucht hat, mit größerer Wahrscheinlichkeit als "1" gelesen wird, dann wird beim Schreiben auf "1" das anschließende Lesen ohne Fehler stattfinden, aber beim Schreiben eines anderen Musters kann dies der Fall sein Es gibt genügend Inkonsistenzen, sodass der ECC ausfällt und ein irreparabler Lesefehler auftritt. Nach mehreren derartigen Fällen hat der Sektor den Status "Bad" erhalten. Übrigens kann der aufgezeichnete Wert der Verteilung beschädigter Bits so überlagert werden, dass ein gelesener falscher Wert sogar die ECC erfüllt. Um die Identifizierung aller fehlerhaften Sektoren zu maximieren, müssen Sie daher ein relativ zufälliges Muster generieren, es auf die Festplatte schreiben, den Wert lesen und vergleichen. Es gibt auch instabile Sektoren, deren Werte sich im Laufe der Zeit oder nach der Verarbeitung ihrer Nachbarn allmählich ändern.


Aus all diesen Gründen habe ich beschlossen, die folgende Strategie in ein Bash-Skript umzusetzen:


  • wir erzeugen ein zufälliges Muster und betrachten die Prüfsumme dafür;
  • wir lesen klug;
  • schreibe eine Platte in Nullen;
  • Lies die CD.
  • Wir schreiben eine Platte in einem zufälligen Muster, indem wir den gerade aufgezeichneten Block lesen und dessen Prüfsumme vergleichen.
  • Wir lesen die Platte nach der vollständigen Aufzeichnung und überprüfen die Prüfsummen jedes Blocks.
  • wir lesen klug;
  • Selbsttest;
  • gehe zu 1

Wir fahren auf diese Weise fort, bis die falsch gelesenen Sektoren und E / A-Fehler aufhören oder bis die Schraube vollständig abgedeckt ist. Übrigens kann ich mir nicht vorstellen, wie der Selbsttest für dieses Diskettenmodell funktioniert; Ich weiß nicht, wie lange sich von short'a unterscheidet (obwohl long wahrscheinlich auf der gesamten Oberfläche und short funktioniert - mit Fokus auf den zuvor gesammelten Statistiken, wie bei der Formatierung: voll und schnell). Ich hoffe, dass dies die Schraube ermutigt, die jüngsten Erfahrungen zu berücksichtigen und schlechte Sektoren neu zu kartieren.


Als ich mit dem Schreiben des Bash-Skripts fertig war, habe ich es ausgeführt und die Ergebnisse am nächsten Tag überprüft. Dabei stellte ich fest, dass die Überprüfung sehr langsam funktioniert, während die Prozessorauslastung auf keinem Kern 60% erreicht. Ich habe mit der Blockgröße gespielt, verschiedene Hash-Algorithmen auf Prüfsummen getestet, eine direkte Diff-Überprüfung versucht und keine Prüfsummen verglichen, konnte jedoch keine Verarbeitungsgeschwindigkeit von mehr als 12 Megabyte pro Sekunde erreichen. Infolgedessen habe ich aufgehört, 400-KB-Blöcke mit diff zu vergleichen, und ich berechne die Prüfsummen nur, wenn nur für die nachfolgende Analyse des Protokolls eine Nichtübereinstimmung vorliegt.


Das Skript stellte sich wie folgt heraus:
 #!/bin/bash #    hddtest.sh diskdev logfile [blocksize] diskdev="$1"; test_log="$2"; #"~/work/hdd/test.log" blsz="${409600:-$3}"; n="1"; sizebyte=`fdisk -l "$diskdev"|grep "Disk $diskdev:"|cut -d" " -f5`; let sizebl=$sizebyte/$blsz; #"781428" for 320GB while true;do echo "starting iteration $n"; dd if=/dev/urandom of=fil bs="$blsz" count=1; md5ok=`md5sum fil|cut -d" " -f1`; cp fil fil_"$n"; echo "random pattern md5sum $md5ok">>"$test_log"; smartctl -A "$diskdev">>"$test_log"; echo "filling disk with zeroes">>"$test_log"; dd if=/dev/zero of="$diskdev" bs="$blsz"; #count="$sizebl"; echo "disk is wiped fully">>"$test_log"; dd of=/dev/null if="$diskdev" bs="$blsz"; # count="$sizebl"; echo "writing disk with fil-pattern">>"$test_log"; i="0"; while [ "$i" -le "$sizebl" ]; do #echo "writing fil: $i ">>"$test_log"; dd if=fil of="$diskdev" bs="$blsz" seek="$i"; dd if=/dev/null of=tst; dd if="$diskdev" bs="$blsz" of=tst skip="$i" count=1 conv=notrunc,noerror,sync; #md5tst=`md5sum tst|cut -d" " -f1`; verf=`diff -s fil tst|sed 's/.* //g'`; if [ "$verf" != "identical" ]; #if [ "$md5ok" != "$md5tst" ]; then md5tst=`md5sum tst|cut -d" " -f1`; echo "$i : md5 $md5tst is not ok">>"$test_log"; cp tst tst_"$n"_"$i"; fi; let i="$i"+1; done; echo "test of full writed with fil-pattern disk">>"$test_log"; i="0"; while [ "$i" -le "$sizebl" ]; do #echo "after writing test: $i">>"$test_log"; dd if=/dev/null of=tst; dd if="$diskdev" bs="$blsz" of=tst skip="$i" count=1 conv=notrunc,noerror,sync; #md5tst=`md5sum tst|cut -d" " -f1`; verf=`diff -s fil tst|sed 's/.* //g'`; if [ "$verf" != "identical" ]; #if [ "$md5ok" != "$md5tst" ]; then md5tst=`md5sum tst|cut -d" " -f1`; echo "$i : md5 $md5tst is not ok">>"$test_log"; cp tst tst_"$n"_"$i"; fi; let i="$i"+1; done; smartctl -A "$diskdev" >>"$test_log"; smartctl -t long "$diskdev">>"$test_log"; sleep 5000; #smartctl -t short "$diskdev">>"$test_log"; #sleep 240; let n="$n"+1; done 

Wie die Protokolle nach wiederholter Ausführung des Skripts zeigten, befanden sich alle fehlerhaften Sektoren in den ersten 13 GB der Festplatte. Es gab mehrere "Fehlerherde" (wahrscheinlich war die Oberfläche beim Aufschlagen des Kopfes zerkratzt und zerkratzt). In den letzten 15 Läufen hat die Festplatte keine ausstehenden Sektoren gesehen, alles wurde bereits neu zugeordnet, aber irgendwo in der Mitte des 13. Gigabyte wurden ein Block oder Blöcke in der Nähe falsch an verschiedene Adressen gelesen. Außerdem könnte ein Block für 2 Zyklen hintereinander als falsch angesehen werden, dann 2 Mal richtig und erneut falsch. Die letzten 10 schlechten Sektoren zu erwischen war also eine lange Operation. Insgesamt wurden 1268 Sektoren neu zugeordnet! Und am Ende hatte ich eine Überraschung: Als nach dem nächsten Selbsttest bereits alles stabil funktionierte, wurde der Parameter Anzahl neu zugeordneter Sektoren zu „0“ und nur die Anzahl neu zugeordneter Ereignisse und die Aufzeichnungen der letzten 5 Fehler (mit Adresse und Uhrzeit von Arbeit beginnen) im Tagebuch gespeichert.


Trotz des stabilen Betriebs habe ich mich dennoch entschlossen, die Interaktion mit dem beschädigten Bereich zu minimieren, um den Kopf nicht wegen möglicher Unregelmäßigkeiten an Stellen mit beschädigter Oberfläche der Platten zu verletzen, und ich wollte den lokalen Sektoren auf lange Sicht nicht vertrauen. Ich habe mich gerade etwas zurückgezogen und eine Partition erstellt, die mit dem 15. Gigabyte beginnt. Und wie die Zeit gezeigt hat, fühlt sich die CD ziemlich gut an und arbeitet seit 10 Monaten stabil in einem tragbaren Laptop.


Obwohl es unmöglich ist, der restaurierten Platte uneingeschränkt zu vertrauen und die wirtschaftliche Machbarkeit des Unternehmens zweifelhaft ist, ist das Ergebnis manchmal nur eine angenehme Ergänzung des guten Weges.

Source: https://habr.com/ru/post/de481952/


All Articles