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?

linux  ext4 

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"

apenas para salientar que debugfs, em um sistema de arquivos muito grande, pode levar um longo tempo antes de mostrar algo
Aquarius Poder
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.