Fehler finden
Welcher Block ist defekt
smartctl -l selftest /dev/hda
SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Extended offline Completed: read failure 90% 217 0x016561e9
oder
smartctl -l error /dev/hda|grep LBA
10 51 58 78 98 33 e0 Error: IDNF at LBA = 0x016561e9 = 23421417
In diesem Beispiel ist der LBA 23421417 defekt
Genaue Position berechnen
fdisk -lu /dev/hda
Disk /dev/hda: 123.5 GB, 123522416640 bytes 255 heads, 63 sectors/track, 15017 cylinders, total 241254720 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/hda1 * 63 4209029 2104483+ 83 Linux /dev/hda2 4209030 5269319 530145 82 Linux swap /dev/hda3 5269320 238227884 116479282+ 83 Linux /dev/hda4 238227885 241248104 1510110 83 LinuxDie Partition hda3 startet bei LBA=5269320 und endet bei LBA=238227884- Der Fehler liegt dazwischen. also in Partition hda3.
mount
zeigt um welches Filesystem es sich handelt.tune2fs -l /dev/hda3 | grep Block
Block count: 29119820 Block size: 4096
Zeigt das die Blockgröße 4096 Bytes groß ist.
Die Formel um die Blocknummer zu berechnen ist:
b = (int)((L-S)*512/B)
wobei
b = File System block number B = File system block size in bytes L = LBA of bad sector S = Starting sector of partition as shown by fdisk -lu und (int) denotes the integer part (Nachkommastellen abschneiden)
Unser Beispiel ergibt: L=23421417, S=5269320 und B=4096.
b = (int)18152097*512/4096 = (int)2269012.125 also: b=2269012
Belegung feststellen
debugfs
debugfs 1.32 (09-Nov-2002) debugfs: open /dev/hda3 debugfs: testb 2269012 Block 2269012 not in use
nicht belegt
In diesem Beispiel ist der Block nicht belegt, er kann direkt repariert werden
belegt
Sind Daten auf dem Block, müssen diese vor dem Reparieren gesichert werden.
Welche Datei verwendet den Block
debugfs: testb 2269012 Block 2269012 marked in use debugfs: icheck 2269012 Block Inode number 2269012 41032 debugfs: ncheck 41032 Inode Pathname 41032 /S1/R/H/714197568-714203359/H-R-714202192-16.gwfIn diesem Beispiel ist die Datei /data/S1/R/H/714197568-714203359/H-R-714202192-16.gwf beschädigt.
Ist die Inode sehr klein und der Dateiname kann nicht erkannt werden, ist das journal selbst beschädigt
debugfs: testb 2269012 Block 2269012 marked in use debugfs: icheck 2269012 Block Inode number 2269012 8 debugfs: ncheck 8 Inode Pathname debugfs:Dann wird das Journal gelöscht
tune2fs -O ^has_journal /dev/hda3
und wieder hergestellt
tune2fs -j /dev/hda3
Reparieren
Achtung dies zerstört Daten unwiderruflich!!
dd if=/dev/zero of=/dev/hda3 bs=4096 count=1 seek=2269012 sync smartctl -t offline /dev/hda
Nachzulesen bei: http://smartmontools.sourceforge.net/badblockhowto.html