[Anleitung] Defekte Sektoren manuell neu zuweisen

bingo88

PCGH-Community-Veteran(in)
Mein Linux-Server hat in letzter Zeit immer häufiger Probleme beim Lesen bestimmter Sektoren gemacht, offenbar weil diese defekt sind. Da die Platte jetzt knapp 34.000 Stunden auf der Uhr hat (und nicht für 24/7 ausgelegt ist), ist das nicht unbedingt verwunderlich. Allerdings bedeuten ein paar defekte Sektoren noch nicht das Ende der Platte, denn jede Festplatte besitzt einen Bereich mit ungenutzten Sektoren, die zur Neuzuweisung verwendet werden können. Das Problem bei der Sache ist nur, dass die Neuzuweisung eine Schreiboperation auf den betroffenen Sektor erfordert, ein Lesen generiert nur SMART-Fehlermeldungen, repariert aber nichts. Man kann das allerdings selbst durchführen, was ich an der Stelle nun einmal vorstellen möchte.

ACHTUNG: Die betroffenen Sektoren werden mit 0-Daten überschrieben, das kann Datenverlust zur Folge haben! Andererseits sind die betroffenen Sektoren eh nicht mehr lesbar, die Daten sind also ggf. schon verloren. Trotzdem gilt: DURCHFÜHRUNG AUF EIGENE GEFAHR!

1. Voraussetzungen

Da mein Server mit Linux (Ubuntu Server) läuft und Linux alle notwendigen Tools bereits mitbringt, setze ich für diese Anleitung ein Linux-System (Debian, Ubuntu oder Derivat) voraus. Man kann das aber auch alles mit einer entsprechenden Live-CD machen, es muss kein Linux installiert sein. Folgende Tools werden benötigt:

- smartctl
Code:
sudo apt-get install smartmontools
- hdparm

2. Defekte Sektoren finden

Unter Linux werden die SATA-Festplatten nach folgendem Schema benannt:
1. Festplatte: /dev/sda
2. Festplatte: /dev/sdb
...

Bei mir war die erste (und einzige) Festplatte betroffen, daher beziehe ich mich hier immer auf /dev/sda. Wenn bei euch die zweite Festplatte betroffen ist, dann müsst ihr /dev/sda durch /dev/sdb ersetzen. ACHTUNG: /dev/sdX bezeichnet die physischen Festplatten, das hat nichts mit Partitionen zu tun!

Wenn man Glück hat, tauchen im Kernel-Eventlog die entsprechenden Fehlermeldungen auf. Das setzt allerdings voarus, dass ein fehlerhafter Zugriff unter Linux erfolgt ist. Das sieht dann so aus:
Code:
user@server1:~$ dmesg

...
[71178.940573] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[71178.944473] ata1.00: irq_stat 0x40000001
[71178.948418] ata1.00: failed command: READ DMA
[71178.952240] ata1.00: cmd c8/00:08:c0:a8:07/00:00:00:00:00/e0 tag 12 dma 4096 in
[71178.952240]          res 51/40:00:c0:a8:07/00:00:00:00:00/e0 Emask 0x9 (media error)
[71178.960020] ata1.00: status: { DRDY ERR }
[71178.963834] ata1.00: error: { UNC }
[71179.911934] ata1.00: configured for UDMA/133
[71179.911964] sd 0:0:0:0: [sda] Unhandled sense code
[71179.911970] sd 0:0:0:0: [sda]
[71179.911974] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[71179.911979] sd 0:0:0:0: [sda]
[71179.911984] Sense Key : Medium Error [current] [descriptor]
[71179.911990] Descriptor sense data with sense descriptors (in hex):
[71179.911993]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
[71179.912067]         00 07 a8 c0
[71179.912079] sd 0:0:0:0: [sda]
[71179.912087] Add. Sense: Unrecovered read error - auto reallocate failed
[71179.912094] sd 0:0:0:0: [sda] CDB:
[71179.912099] Read(10): 28 00 00 07 a8 c0 00 00 08 00
[B][71179.912122] end_request: I/O error, dev sda, sector 501952[/B]
[71179.916351] Buffer I/O error on device sda5, logical block 24
[71179.920190] ata1: EH complete
...
In dem Fall hier ist der Sektor 501952 auf der ersten Festplatte (/dev/sda) betroffen.

Wenn man kein entsprechendes Eventlog hat, kann man den fehlerhaften Sektor auch über das Programm smartctl ermitteln:
Code:
user@server1:~$ sudo smartctl -a /dev/sda

...
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
...
Aktuell hat die HDD /dev/sda einen schwebenden Sektor. Um diesen nun zu finden, führen wir als nächstes einen kurzen Selbsttest durch:
Code:
user@server1:~$ sudo smartctl -t short /dev/sda

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-46-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Fri Feb 27 09:17:21 2015

Use smartctl -X to abort test.
Nun muss man kurz warten, bis der Selbsttest abgeschlossen ist. Danach sehen wir uns das Ergebnis an:
Code:
user@server1:~$ sudo smartctl -l selftest /dev/sda

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-46-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 0
Warning: ATA Specification requires self-test log structure revision number = 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       20%     34007         [B]501952[/B]
...
Hier sehen wir nun, dass Sektor 501952 nicht gelesen werden konnte.

Sollte der kurze Selbsttest keine defekten Sektoren gefunden haben, so muss man einen langen Selbsttest durchführen. Der kurze Selbsttest prüft nämlich nur stichprobenartig, während der lange Selbsttest die gesamte Festplatte untersucht:
Code:
user@server1:~$ sudo smartctl -t long /dev/sda

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-46-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 66 minutes for test to complete.
Test will complete after Fri Feb 27 14:39:26 2015

Use smartctl -X to abort test.
Dieser Test dauert allerdings wesentlich länger als der Kurztest. Das Ergebnis kann auf die gleiche Weise wie beim Kurztest abgerufen werden. Wenn allerdings ein Fehler auftritt, bricht der Test schon vorher ab, man sollte daher ab und an den Fortschritt kontrollieren. Dazu reicht es, mittels smartctl das Log abzurufen:
Code:
user@server1:~$ sudo smartctl -l selftest /dev/sda

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-46-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 0
Warning: ATA Specification requires self-test log structure revision number = 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Self-test routine in progress 90%     34012         -
...

Der gefundene defekte Sektor sollte anschließend noch mittels einer Leseoperation explizit getestet werden:
Code:
user@server1:~$ sudo hdparm --read-sector 501952 /dev/sda

/dev/sda:
reading sector 501952: FAILED: Input/output error
Der Sektor ist tatsächlich nicht mehr lesbar! Dies generiert übrigens auch eine Fehlermeldungen im Eventlog (-> dmesg).

3. Defekte Sektoren neu zuweisen

Nachdem wir nun den betroffenen Sektor gefunden haben, starten wir eine forcierte Schreiboperation auf diesen Sektor. Bis jetzt haben wir nur Daten gelesen, davon geht nichts kaputt. Was nun folgt, überschreibt einen beliebigen Sektor auf der Platte, daher muss man sehr vorsichtig sein, was man tut!
Code:
user@server1:~$ sudo hdparm --write-sector 501952 /dev/sda
                  
/dev/sda:
Use of --write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media.
This is a BAD idea, and can easily result in total data loss.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.
Das Programm warnt einen auch genau davor. Daher muss man noch einen zusätzlichen Parameter ergänzen:
Code:
user@server1:~$ sudo hdparm --write-sector 501952 --yes-i-know-what-i-am-doing /dev/sda

/dev/sda:
re-writing sector 501952: succeeded
Den Schreibvorgang wiederholt man am besten ein paar mal. Danach sehen wir nach, ob der Sektor nun lesbar ist:
Code:
user@server1:~$ sudo hdparm --read-sector 501952 /dev/sda

/dev/sda:
reading sector 501952: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
Siehe da, der Sektor wurde neu zugewiesen, aber alle Daten wurden mit 0 überschrieben.

Wenn man sich nun die SMART-Werte anzeigen lässt, sollte der Current Pending Sector Count um 1 reduziert sein. Man sollte auch den Selbsttest erneut ausführen, um ggf. weitere Sektoren zu finden (ein Sektor kommt selten allein) und die Prozedur für alle anderen betroffenen Sektoren wiederholen. Zum Abschluss sollte man eventuell auch noch einmal den langen Selbsttest durchlaufen lassen, um die gesamte Festplatte zu scannen.

4. Fazit

Bei meiner Platte waren etwa 20 Sektoren betroffen, die sich aber alle mit diesem Verfahren reparieren ließen :-)
Code:
user@server1:~$ sudo smartctl -l selftest /dev/sda

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.13.0-46-generic] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 0
Warning: ATA Specification requires self-test log structure revision number = 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%     34013         -
# 2  Extended offline    Aborted by host               90%     34012         -
# 3  Extended offline    Aborted by host               90%     34012         -
...

Man sollte bei einer hohen Anzahl defekter Sektoren allerdings darüber nachdenken, die Platte zu tauschen oder zumindest keine wichtigen Daten mehr ohne Backup darauf zu speichern, um einem möglichen Datenverlust vorzubeugen. Aber Backups sollte man auch bei gesunden Platten sowieso machen ;)
 
Zuletzt bearbeitet:
Zurück