Ein Wiki privater Natur

Disk Medium Error

Datei finden, die das betrifft

Disk Medium Error

Die Datei lokalisieren, die von Medium Error betroffen ist

Ausgangssituation:

Wenn man eine Fehlermeldung wie
sd 0:0:2:0: sdc tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 0:0:2:0: sdc tag#0 Sense Key : Medium Error current
sd 0:0:2:0: sdc tag#0 Add. Sense: Unrecovered read error
sd 0:0:2:0: sdc tag#0 CDB: Read(10) 28 00 e0 3a 82 80 00 00 08 00
blk_update_request: critical medium error, dev sdc, sector 3761930880
hat.

Anhand der Sektor-Nummer kann man herauszufinden, in welcher Datei der Lese-Fehler auftritt, aber es erfordert mehrere Schritte. Hier ist ein allgemeiner Ansatz, wie man dies machen kann:

Bestimme das Dateisystem:

Finde heraus, welches Dateisystem auf dem betroffenen Gerät (/dev/sdc) verwendet wird. Dies kann mit dem Befehl lsblk -f oder df -h machen.

Ermittele die Blockgröße:

Die Blockgröße des Dateisystems kann mit stat -f /mount/point ermittelt werden. Notiere die Blockgröße (in der Regel 4096 Bytes für viele Linux-Dateisysteme).

Sektorgröße feststellen

smartctl -i /dev/sdc|grep "Sector Sizes:" 
Sector Sizes:     512 bytes logical, 4096 bytes physical

Umrechnung des fehlerhaften Sektors in Dateisystem-Blöcke:

Ein Sektor hat normalerweise 512 Bytes. Um die Blocknummer des Dateisystems zu berechnen, teile die Sektor-Nummer durch (Blockgröße / Sektorgröße). Beispiel:
Blocknummer=3761930880 / (4096 / 512)

470241360 ist also die Blocknummer


Die Blocknummer wird so berechnet:
$$
\text = \frac}
{\left(\frac}}\right)} =\frac
$$

Im Beispiel Fall:

Die Blocknummer wird so berechnet:
$$
\text = \frac\right)} = \frac = 470241360
$$


Online Berechnung der Blocknummer


Sektor Nummer aus obigen Beispiel: 3761930880


Sektor-Nummer:       
Blockgröße in Bytes:   

Ergebnis:

Den inode ermitteln

# ext4: Verwende debugfs:
debugfs -R 'icheck 470241360' /dev/sdc
Block	    Inode number
470241360	110493706

#xfs: Verwende xfs_db:
xfs_db -c 'blockget -b 470241360' /dev/sdc

#btrfs: Verwende btrfs-debug-tree:
btrfs-debug-tree -b 470241360 /dev/sdc

Datei finden

Um von der Inode-Nummer 110493706 zur entsprechenden Datei zu gelangen, kann man den find-Befehl verwenden, der in der Lage ist, nach einer Datei anhand der Inode-Nummer zu suchen.

# Wenn das Dateisystem beispielsweise unter /mnt eingehängt ist, lautet der Befehl:
find /mnt -inum 110493706

Gegenprobe:
Beispielweise mit cp, oder auch mit rsync.
der cp Befehl liest die Datei und kopiert sie nach dev/null, Es sollte ein Error auftauchen, wenn nicht, dann ist etwas bei der Berechnung schief gelaufen.

cp gefundene_datei /dev/null
cp: Fehler beim Lesen von 'gefundene_datei': Eingabe-/Ausgabefehler

....