Wie repariere ich einfach einen einzelnen nicht lesbaren Block auf einer Linux-Festplatte?

Wie repariere ich einfach einen einzelnen nicht lesbaren Block auf einer Linux-Festplatte?

Mein Linux-System hat begonnen, SMART-Fehler im Syslog auszugeben. Ich habe es aufgespürt und glaube, dass das Problem ein einzelner Block auf der Festplatte ist. Wie kann ich die Festplatte dazu bringen, diesen einen Block einfach neu zuzuweisen? Ich würde gerne wissen, welche Datei dabei zerstört wurde. (Mir ist bewusst, dass, wenn ein Block auf einer Festplatte ausfällt, wahrscheinlich weitere folgen werden; ich habe ein gutes, laufendes Backup und möchte einfach versuchen, diese Festplatte am Laufen zu halten.)

Eine Suche im Internet führt zudas Bad-Block-HowTo, was einen manuellen Prozess auf einer nicht gemounteten Festplatte beschreibt. Es scheint kompliziert und fehleranfällig zu sein. Gibt es ein Tool, um diesen Prozess in Linux zu automatisieren? Meine einzige andere Option istdas Diagnosetool des Herstellers, aber ich nehme an, dass dadurch der fehlerhafte Block gelöscht wird, ohne dass gemeldet wird, was zerstört wurde. Im schlimmsten Fall könnten es Metadaten des Dateisystems sein.

Bei der betreffenden Festplatte handelt es sich um die primäre Systempartition. Es werden ext3fs und LVM verwendet. Hier ist das Fehlerprotokoll von Syslog und das relevante Bit von Smartctl.

smartd[5226]: Device: /dev/hda, 1 Currently unreadable (pending) sectors

Error 1 occurred at disk power-on lifetime: 17449 hours (727 days + 1 hours)
... Error: UNC at LBA = 0x00d39eee = 13868782

Es gibt einen vollständigen Smartctl-Dumpauf Pastebin.

Antwort1

Du könntest es versuchen hdparm --write-sector <LBA> /dev/ice.

Ich kenne keine andere Möglichkeit, dies zu tun - Sie müssen das LBA manuell in Dateisystemblöcke konvertieren (wie Sie bereits festgestellt haben).

Antwort2

Ich habe früher Festplatten-Firmware für WD geschrieben und einmal habe ich die Firmware geschrieben, die fehlerhafte Blöcke neu zugewiesen hat.

Erstens werden die meisten fehlerhaften Blöcke beim Lesen erkannt, nicht beim Schreiben. Schreibvorgänge werden blind ausgeführt, d. h. die Daten werden ohne Überprüfung geschrieben. Wenn das Medium beim Schreiben fehlerhaft ist, wissen Sie dies also erst, wenn der Host diesen Sektor liest. Es gibt einen kleinen Teil des Sektors (den Sektorheader), der beim Schreiben gelesen wird, um den richtigen Sektor zu finden. Wenn also beim Lesen des Sektorheaders ein Fehler auftritt, weist das Laufwerk den Sektor neu zu und schreibt ihn mit den vom Schreibbefehl empfangenen Daten. Die überwiegende Mehrheit der fehlerhaften Blöcke wird jedoch beim Lesen erkannt, und nur weil ein Schreibvorgang in einen Sektor erfolgreich ist, bedeutet dies nicht, dass das Medium in Ordnung ist oder dass der Sektor neu zugewiesen wurde.

Nun zur Neuzuweisung fehlerhafter Blöcke (auch Neuzuweisung genannt). Ja, normalerweise versucht das Laufwerk, einen Sektor neu zuzuweisen, wenn der Fehler schwerwiegend genug ist (d. h. der ECC-Fehler ist schwerwiegend genug), aber das Laufwerk könnte die Daten nach der ECC-Korrektur immer noch wiederherstellen. Normalerweise geschieht dies automatisch. Die einzige Ausnahme besteht darin, dass der Host dem Laufwerk zuvor mitgeteilt haben könnte, keine automatischen Neuzuweisungen vorzunehmen, dies wird jedoch selten durchgeführt.

Was passiert also, wenn das Laufwerk einen Lesevorgang ausführt und die Daten nicht wiederherstellen kann? Nichts. Der Fehler wird dem Host gemeldet, aber es wird keine Neuzuweisung durchgeführt. Das Problem besteht darin, dass das Laufwerk den Sektor neu zuweisen könnte, aber nicht die geringste Ahnung hat, welche Daten in den neu zugewiesenen Sektor geschrieben werden sollen. Wenn es beispielsweise nur eine Reihe von Nullen geschrieben und der Sektor dann erneut gelesen würde, würde es alle Nullen zurückgeben, ohne dass ein Hinweis darauf erfolgt, dass die Daten ungültig waren. Dies ist im Wesentlichen dasselbe wie Datenbeschädigung. Das Laufwerk kann sich aus verschiedenen Gründen nicht darauf verlassen, dass der Host Fehler aufzeichnet (z. B. was wäre, wenn das Laufwerk auf einen neuen Host verschoben würde?). Daher ist es am besten, nichts zu tun, wenn die Daten nicht wiederhergestellt werden können.

Moderne Laufwerke speichern jedoch den Speicherort des fehlerhaften Sektors, wenn dieser nicht neu zugewiesen werden kann. Die Anzahl der fehlerhaften Sektoren, die auf eine Neuzuweisung warten, finden Sie in den SMART-Daten. Wenn ein Schreibvorgang in einen der fehlerhaften Sektoren erfolgt, die auf eine Neuzuweisung warten, wird die Neuzuweisung durchgeführt, da das Laufwerk nach der Neuzuweisung nun gültige Daten zum Schreiben hat. Wenn also jemand sagt, dass das Schreiben in einen fehlerhaften Sektor diesen neu zuweist, ist das eigentlich nur die halbe Wahrheit. Das Laufwerk muss zuerst gelesen werden, damit das Laufwerk alle fehlerhaften Sektoren entdecken kann, die nicht automatisch neu zugewiesen werden können. Sie können also ein ganzes Laufwerk beschreiben, und die SMART-Daten zeigen an, dass keine fehlerhaften Sektoren auf eine Neuzuweisung warten, aber Sie haben das Laufwerk nicht unbedingt von allen fehlerhaften Sektoren befreit. Wenn Sie also wirklich alle fehlerhaften Sektoren eines Laufwerks befreien möchten, ist es am besten, zuerst das gesamte Laufwerk zu lesen und dann darauf zu schreiben (natürlich werden dadurch alle vorherigen Daten auf dem Laufwerk zerstört).

Es gibt andere Möglichkeiten, mit fehlerhaften Blöcken umzugehen, die nicht neu zugewiesen werden können. Wenn das Laufwerk Teil einer redundanten RAID-Konfiguration ist (also alles außer RAID 0), sollte die RAID-Software die Daten für einen fehlerhaften Sektor automatisch von den anderen Laufwerken wiederherstellen und in den neu zugewiesenen Sektor schreiben. SCSI-Festplatten verfügen über einen expliziten Befehl zum Neuzuweisen von Blöcken, mit dem der Host die Neuzuweisung erzwingen kann, selbst wenn keine gültigen Daten zum Schreiben in den Block vorhanden sind. Die Verwendung erfolgt jedoch auf relativ niedriger Ebene.

Antwort3

Ich denke, alles, was Sie tun müssen, ist:

e2fsck -c /dev/hda1

vorausgesetzt /dev/hda1 ist die (nicht gemountete) Partition. Oder:

e2fsck -c -c /dev/hda1

um einen (langsameren) zerstörungsfreien Lese-/Schreibtest durchzuführen. Es muss trotzdem ausgehängt werden. Ich glaube jedoch nicht, dass Sie dadurch Einzelheiten zu verlorenen Daten erfahren.

Antwort4

Wenn Sie über Backups verfügen und wissen, dass es sich um einen logischen und nicht um einen physischen Fehler handelt, besteht die beste Lösung darin, die Disc auf Null zu setzen.

Ich würde MHDD verwenden. Das ist relativ einfach zu verwenden und solange Sie daran denken, Ihre Festplatte im BIOS auf IDE-Emulation und dann nach Abschluss Ihrer Arbeit wieder auf AHCI einzustellen, müssen Sie sich keine Sorgen machen.

Wählen Sie nach dem Booten von MHDD Ihren Laufwerkstyp im ERASE-Befehl aus und bestätigen Sie Ihre Auswahl.

Holen Sie sich einen Kaffee, das kann eine Weile dauern.

Nachdem das Laufwerk auf Null gesetzt wurde, führen Sie einen Scan (f4) mit der Einstellung „Neu zuordnen“ aus (Standard ist deaktiviert). Wenn weiterhin Probleme mit dem Laufwerk vorliegen (d. h., die Platte ist physisch beschädigt und das Laufwerk weist einen stetigen Abwärtstrend auf), werden diese mit dieser Option „behoben“, indem beschädigte Bereiche intakten Teilen des Laufwerks zugeordnet werden.

Wenn keine UNC-Fehler vorliegen, dann herzlichen Glückwunsch, Sie und Ihr Laufwerk können noch viele Jahre lang Freunde bleiben.

verwandte Informationen