Trouvez quels fichiers sont affectés par des blocs défectueux sur le système de fichiers ext4

13

J'ai un système de fichiers ext4 qui a récemment développé des secteurs défectueux. L'exécution fsck.ext4 -ctrouve et mémorise les mauvais blocs. Comment puis-je trouver les fichiers (le cas échéant) contenant ces blocs défectueux afin de pouvoir les restaurer à partir de sauvegardes?


la source
tandis que je le réparais interactivement avec fsck, il montrait quels fichiers avaient des problèmes; mais s'il y en a trop, c'est mieux ce que @Nethox a répondu.
Aquarius Power

Réponses:

11

Avec une combinaison de dumpe2fset debugfs, qui sont inclus dans le e2fsprogspackage fsck.ext*.
Vous devez utiliser la sortie d'une commande comme argument de la suivante.
Ces outils détectent automatiquement la taille du bloc du système de fichiers, il est donc cohérent et plus sûr que l' badblocksinvocation directe .

Imprime les blocs défectueux enregistrés du système de fichiers:

# dumpe2fs -b DEVNAME

Imprime les inodes qui utilisent la liste de blocage donnée:

# debugfs -R "icheck BLOCK ..." DEVNAME

Imprime les chemins d'accès à la liste d'inodes donnée:

# debugfs -R "ncheck INODE ..." DEVNAME

debugfsa également un shell interactif et l' -f cmd_fileoption, mais ils ne sont pas très puissants ou utiles pour ce cas.
L'option -R permet des scripts plus automatisés comme celui-ci:

#!/bin/sh
# Finds files affected by bad blocks on ext* filesystems.
# Valid only for ext* filesystems with bad blocks registered with
# fsck -c [-c] [-k] or -l|-L options.
# Can be extremely slow on damaged storage (not just a corrupt filesystem).

DEVNAME="$1"
[ -b "$DEVNAME" ] || exit 1

BADBLOCKS="$(dumpe2fs -b "$DEVNAME" | tr '\n' ' ')"
[ -n "$BADBLOCKS" ] || exit 0

INODES="$(debugfs -R "icheck $BADBLOCKS" "$DEVNAME" | awk -F'\t' '
    NR > 1 { bad_inodes[$2]++; }
    END {
        for (inode in bad_inodes) {
            if (inode == "<block not found>") {
                printf("%d unallocated bad blocks\n", bad_inodes[inode]) > "/dev/stderr";
                continue;
            }
            printf inode OFS;
        }
    }
')"
[ -n "$INODES" ] || exit 0

debugfs -R "ncheck -c $INODES" "$DEVNAME"
Nethox
la source
juste pour souligner que les debugfs, sur un très grand système de fichiers, peuvent prendre beaucoup de temps avant de montrer quelque chose
Aquarius Power