Offline uncorrectable sectors
Beim Auftreten dieser SMART Meldungen sollte man hellhörig werden:
Jul 01 12:45:16 foo smartd[305]: Device: /dev/sdX [SAT], 8 Currently unreadable (pending) sectors Jul 01 12:45:16 foo smartd[305]: Device: /dev/sdX [SAT], 8 Offline uncorrectable sectors
Während die erste Meldung noch ignorierbar ist - es handelt sich meist um einen temporären Fehler - deutet die zweite auf ein grundlegendes Problem im Low-Level Format der Platte hin.
Mit diesen Befehlen läßt sich das reparieren. Treten solche Fehler öfter auf, oder häufen sich, sollte man die Platte ausrangieren.
Unbedingt ein Backup haben/machen!
Nur wenn man weis was man tut UND es keine involvierten (defekten) Dateien im BTRFS gibt, geht das auch mit nicht gemounteter (unmount) Festplatte im laufenden System.
Es gibt hier zwei Ziele:
- Dateisystem in einen regulären Zustand zu versetzen um restliche Daten noch sichern zu können (Notfall-Backup)
- Festplatte wieder herstellen ohne diese komplett wieder neu beschreiben zu müssen (dd, badblocks, …)
Unter BTRFS hilft ein Scrub-Lauf um herauszufinden welche Dateien beschädigt sind:
btrfs -v scrub start -r /dev/sdX
Nach dem durchlaufen (~8-18h für 10TB) finden sich die Fehler im Syslog:
$> journalctl -r # und suchen nach: "/BTRFS" ... Jul 01 10:01:46 foo kernel: BTRFS warning (device sdXn): i/o error at logical 176966312 on dev /dev/sdXn, physical 6923493609472, root 5, inode 978829, offset 4740048, length 4096, links 5 (path: /mnt/foo/bar/fileneame>
Diese Dateien löschen um die Sektoren freizugeben, können später wieder aus Backup zurückgespielt werden. Ein Kontrolllauf kann nicht schaden. Anschließend gehören die restlichen Dateien sofort in eine Datensicherung - sofern nicht noch nicht vorhanden.
Mit diesem Befehl herausbekommen welche Sektoren beschädigt sind:
$> smartctl -x /dev/sdX ... 198 Offline_Uncorrectable ----C- 100 100 000 - 7 ... Pending Defects log (GP Log 0x0c) Index LBA Hours 0 13522450505 43634 1 13522450506 43634 2 13522450507 43634 3 13522450508 43634 4 13522450509 43634 5 13522450510 43634 6 13522450511 43634
Es sind also 7 Sektoren beschädigt.
Mit diesem Befehl versuchen die Sektoren zu lesen:
$> hdparm --read-sector 13522450504 /dev/sdX /dev/sdX: reading sector 13522450504: succeeded 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ...
Mit diesem Befehl versuchen die Sektoren zu schreiben:
$> hdparm --write-sector 13522450508 --yes-i-know-what-i-am-doing /dev/sdX
Die Liste der beschädigten Sektoren sollte anschließend wieder leer sein:
$> smartctl -x /dev/sdX ... Pending Defects log (GP Log 0x0c) No Defects Logged