Diagnostiquer des erreurs d’entrée/sortie (I/O) sur un répertoire avec dd

Lorsque vous rencontrez une erreur d’entrée/sortie, comme ANS4023E, dans un répertoire comme /opt, cela peut indiquer un fichier corrompu ou des problèmes matériels sous-jacents. Afin d’identifier les fichiers défaillants qui causent ces erreurs, nous pouvons utiliser un outil robuste comme dd pour lire les fichiers et repérer les erreurs.

Dans cet article, nous allons voir comment :

  1. Effectuer une analyse complète et récursive du répertoire concerné (ici /opt).
  2. Utiliser dd pour tester les fichiers tout en filtrant et en capturant les erreurs d’I/O.

Étapes de la solution

1. Pourquoi utiliser dd ?

La commande dd est un outil bas niveau qui permet de copier des données depuis un périphérique ou un fichier vers un autre. Lorsqu’elle est utilisée pour lire des fichiers, dd produit des erreurs explicites en cas de problème d’I/O, ce qui en fait un outil de diagnostic efficace.

2. Exécution de l’analyse récursive avec find et dd

Nous allons utiliser la commande find pour parcourir récursivement le répertoire /opt et exécuter dd sur chaque fichier trouvé. Cela nous permettra de lire les fichiers et de détecter les erreurs.

Voici la commande à utiliser :

find /opt -type f -exec sh -c 'dd if="{}" of=/dev/null bs=1M \;

Explication de la commande :

  • find /opt -type f : Parcourt récursivement tous les fichiers dans le répertoire /opt.
  • dd if="{}" of=/dev/null bs=1M : Pour chaque fichier trouvé, dd tente de lire le fichier par blocs de 1 Mo (bs=1M) et envoie la sortie vers /dev/null (nous ne voulons pas réellement copier les données, seulement vérifier les erreurs).

3. Automatisation de l’analyse avec un rapport des fichiers problématiques

Pour obtenir un rapport des fichiers posant problème, nous pouvons rediriger la sortie d’erreur dans un fichier journal. Cela permet d’automatiser le processus et de revoir les résultats plus tard :

find /opt -type f -exec sh -c 'dd if="{}" of=/dev/null bs=1M >> /var/log/dd.log' \;

Cette commande :

  • Exécute la même analyse que précédemment.
  • Enregistre les erreurs dans le fichier /var/log/dd.log pour une consultation ultérieure.

4. Interprétation des résultats

Après l’exécution de cette commande, consultez le fichier /var/log/dd.log pour voir les fichiers ayant causé des erreurs d’I/O. Chaque ligne de ce fichier contiendra des informations sur le fichier défaillant et le type d’erreur rencontré.

Vous pouvez vérifier le contenu du fichier avec :

cat /var/log/dd.log

Si des erreurs sont répertoriées, les fichiers en question pourraient être corrompus ou inaccessibles. Dans ce cas, vous devrez envisager les actions suivantes :

  • Vérification matérielle : Utilisez des outils comme smartctl pour diagnostiquer les éventuels problèmes matériels.
  • Réparation du système de fichiers : Si les fichiers sont corrompus, il peut être nécessaire de démonter la partition et d’exécuter fsck pour réparer les erreurs du système de fichiers.

5. Exécution parallèle pour une analyse plus rapide

Si vous avez beaucoup de fichiers, vous pouvez accélérer l’analyse en exécutant plusieurs instances de dd en parallèle. Pour ce faire, vous pouvez utiliser xargs pour paralléliser les processus :

find /opt -type f | xargs -P 4 -I {} sh -c 'dd if="{}" of=/dev/null bs=1M >> /var/log/dd.log'
  • xargs -P 4 exécute 4 processus simultanés, ce qui peut réduire le temps nécessaire à l’analyse complète.

Conclusion

Cette méthode permet de diagnostiquer efficacement les fichiers défaillants dans un répertoire, en utilisant dd pour lire les fichiers et grep pour filtrer les erreurs. Cela vous donne une approche simple et automatisée pour identifier les fichiers corrompus ou inaccessibles, tout en minimisant les risques d’erreurs manquées.

Si des fichiers problématiques sont détectés, vous pouvez les traiter individuellement en fonction de la nature des erreurs détectées, ou poursuivre avec des diagnostics matériels si des problèmes sous-jacents de disque sont suspectés.