Encuentre qué archivos están afectados por bloques defectuosos en el sistema de archivos ext4

13

Tengo un sistema de archivos ext4 que recientemente desarrolló algunos sectores defectuosos. Running fsck.ext4 -cencuentra y recuerda los bloques defectuosos. ¿Cómo puedo encontrar qué archivos (si los hay) incluyeron estos bloques defectuosos para poder restaurarlos desde las copias de seguridad?


fuente
mientras lo solucionaba interactivamente con fsck, mostraba qué archivos tenían problemas; pero, si hay demasiados, mejor es lo que respondió @Nethox.
Acuario Power

Respuestas:

11

Con una combinación de dumpe2fsy debugfs, que se incluyen en el e2fsprogspaquete fsck.ext*.
Debe usar la salida de un comando como argumento del siguiente.
Estas herramientas detectan automáticamente el tamaño de bloque del sistema de archivos, por lo que es coherente y más seguro que la badblocksinvocación directa .

Imprime los bloques defectuosos registrados del sistema de archivos:

# dumpe2fs -b DEVNAME

Imprime los inodes que usan la lista de bloqueo dada:

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

Imprime los nombres de ruta a la lista de inodos dada:

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

debugfsTambién tiene un shell interactivo y la -f cmd_fileopción, pero no son muy potentes o útiles para este caso.
La opción -R permite scripts más automatizados como este:

#!/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
fuente
solo para señalar que debugfs, en un sistema de archivos muy grande, puede tomar mucho tiempo antes de mostrar algo
Aquarius Power