Wenn SMART auf einer Festplatte defekte Sektoren findet, diese aber nicht durch neue ersetzen kann (Current_Pending_Sector), weil keine neuen Daten an die Stelle geschrieben werden, kann man dies mit hdparm erzwingen. Die passenden Sektoren zu finden, ist allerdings etwas schwierig. Man kann mit badblocks danach suchen oder verwendet den Short-Test von SMART.

Defekte Sektoren suchen

Mit badblocks defekte Sektoren suchen

Bei badblocks muss man darauf achten, dass man die passende Sektorgröße verwendet, die man dann an hdparm geben kann. Oder man muss entsprechend umrechnen.

# badblocks -b 512 /dev/sdb
Prüfe von Block 0 bis 2930277167
Suche nach defekten Blöcken (Nur-Lesen-Modus):2772486384ne, 7:17:55 elapsed. (0/0/0 errors)
2772486385
2772486386
…
# hdparm --read-sector 2772486386 /dev/sdb

/dev/sdb:
reading sector 2772486386: FAILED: Input/output error

oder

# badblocks /dev/sdb
Prüfe von Block 0 bis 1465138583
Suche nach defekten Blöcken (Nur-Lesen-Modus):1386243192ne, 4:54:02 elapsed. (0/0/0 errors)
1386243193ne, 4:54:20 elapsed. (1/0/0 errors)
1386284228ne, 4:55:20 elapsed. (2/0/0 errors)
1386284229ne, 4:55:39 elapsed. (3/0/0 errors)
…
# hdparm --read-sector $((2*1386284229)) /dev/sdb

/dev/sdb:
reading sector 2772568458: FAILED: Input/output error

Defekte Sektoren über Short-Test bestimmen

Wenn man einen Short-Test durchführen lässt, steht im Log, an welcher Stelle sich der erste defekte Sektor befindet. So kann man schrittweise die defekten Sektoren finden.

# smartctl -t short /dev/sdb
…
=== 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 Wed Sep 21 20:42:11 2011

# smartctl -l selftest /dev/sdb
…
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       10%      2810         2818313408

Defekte Sektoren neu schreiben

Mit hdparm kann man die defekten Sektoren wieder mit Nullen beschreiben, so dass die Festplatte dafür einen der reservierten Sektoren anstelle des defekten einblenden kann.

# hdparm --write-sector 2772568456 --yes-i-know-what-i-am-doing /dev/sdb

/dev/sdb:
re-writing sector 2772568456: succeeded

# for blk in 2772486384 2772486385 2772486386; do
    hdparm --read-sector $blk /dev/sdb
    [[ $? -eq 5 ]] && hdparm --write-sector $blk --yes-i-know-what-i-am-doing /dev/sdb
done