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:
Finde heraus, welches Dateisystem auf dem betroffenen Gerät (/dev/sdc) verwendet wird. Dies kann mit dem Befehl lsblk -f oder df -h machen.
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
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:
Im Beispiel Fall:
Die Blocknummer wird so berechnet:
# 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
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
....