Question Comment déterminer quel fichier / inode occupe un secteur donné


J'ai reçu des messages en /var/log/kern.log qui indiquent une panne de lecteur. Les messages sont survenus lors de la copie de mes $HOME entre les lecteurs (ext4 -> ext3):

[ 5733.186033] sd 4:0:0:0: [sdb] Unhandled sense code
[ 5733.186038] sd 4:0:0:0: [sdb]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[ 5733.186042] sd 4:0:0:0: [sdb]  Sense Key : Medium Error [current] 
[ 5733.186048] sd 4:0:0:0: [sdb]  Add. Sense: Unrecovered read error
[ 5733.186053] sd 4:0:0:0: [sdb] CDB: Read(10): 28 00 05 b7 2e 40 00 00 08 00
[ 5733.186064] end_request: critical target error, dev sdb, sector 95891008

Les messages arrivent en gros, c'est l'un de ces gros. sdb est le lecteur source.

Comment savoir à quel fichier / inode appartient le secteur? Je veux juste savoir pour pouvoir récupérer les fichiers en question à partir d'une sauvegarde. Quelque chose de plus rapide que le code suivant plus une analyse ultérieure de la sortie?

find . -type f -print \
               -exec cp \{\} /dev/null \; \
               -exec tail -n 1 /var/log/kern.log \;

OS: Ubuntu Oneiric.

EDIT: La commande ci-dessus renvoie également à stderr les fichiers qui n'ont pas pu être lus.


7
2017-09-26 21:02


origine




Réponses:


L'idée approximative serait de

  1. faire des calculs pour trouver le numéro de bloc du système de fichiers en fonction du numéro de secteur physique
  2. utilisation debugfs commandes testb / ncheck / icheck pour savoir si le bloc est utilisé et le nom du ou des fichiers qui l'utilisent

Il y a un bad block HOWTO sur le site du projet smartmontools décrivant le processus plus en détail.


2
2017-09-26 22:58



Merci pour le pointeur. Êtes-vous au courant d'un outil qui automatise ce processus? - krlmlr
Non, mais il devrait être assez facile de scripter quelque chose qui répond à vos besoins. - the-wabbit


  1. Trouvez la partition dans laquelle se trouve le secteur en exécutant fdisk -lu /dev/sdb. Supposons que c’est "sdb2" qui commence au secteur 45612307.

  2. Soustrayez cela de 95891008 pour obtenir 50278701.

  3. Ensuite, déterminez combien de secteurs par bloc: tune2fs -l /dev/sdb2 | grep Block. Supposons que ce soit 4096.

  4. Calculez le rapport bloc / secteur: 512 octets / secteur / 4096 octets / bloc = 0,125 blocs / secteur.

  5. Calculez le bloc du secteur: 50278701 * 0,125 = 6284837.625.

  6. Utilisez debugfs pour savoir qui utilise le bloc. Si icheck 6284837 retourne l'inode 12345 puis s'exécute ncheck 12345.

Mises en garde: vous devrez peut-être désactiver la journalisation. Cela peut ne pas fonctionner avec ext4.


5
2017-09-26 23:18



Je voudrais ajouter un moyen de vérifier si vos calculs sont corrects, comme en utilisant stat ou iCall FIBMAP / FIEMAP. - neutrinus