Encontre quais arquivos são afetados por blocos defeituosos no sistema de arquivos ext4

13

Eu tenho um sistema de arquivos ext4 que recentemente desenvolveu alguns setores defeituosos. A execução fsck.ext4 -clocaliza e lembra os blocos defeituosos. Como posso encontrar quais arquivos (se houver) incluíram esses blocos defeituosos para que eu possa restaurá-los a partir de backups?


fonte
enquanto eu o corrigia interativamente com o fsck, ele mostrava quais arquivos tinham problemas; mas, se houver muitos, melhor é o que a @Nethox respondeu.
Aquarius Power

Respostas:

11

Com uma combinação de dumpe2fse debugfs, que estão incluídos no e2fsprogspacote fsck.ext*.
Você deve usar a saída de um comando como argumento do próximo.
Essas ferramentas detectam automaticamente o tamanho do bloco do sistema de arquivos, tornando-o consistente e mais seguro que a badblockschamada direta .

Imprime os blocos defeituosos registrados do sistema de arquivos:

# dumpe2fs -b DEVNAME

Imprime os inodes que usam a lista de bloqueios fornecida:

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

Imprime os nomes de caminho na lista de inodes fornecida:

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

debugfstambém possui um shell interativo e a -f cmd_fileopção, mas eles não são muito poderosos ou úteis para este caso.
A opção -R permite scripts mais 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
fonte
apenas para salientar que debugfs, em um sistema de arquivos muito grande, pode levar um longo tempo antes de mostrar algo
Aquarius Poder