Trova quali file sono interessati da blocchi danneggiati sul filesystem ext4


13

Ho un filesystem ext4 che ha recentemente sviluppato alcuni settori danneggiati. La corsa fsck.ext4 -ctrova e ricorda i blocchi danneggiati. Come posso trovare quali file (se presenti) includevano questi blocchi danneggiati in modo da poterli ripristinare dai backup?

linux  ext4 

mentre lo correggevo in modo interattivo con fsck, mostrava quali file avevano problemi; ma, se ce ne sono troppi, meglio è la risposta di @Nethox.
Aquarius Power

Risposte:


11

Con una combinazione di dumpe2fse debugfs, che sono inclusi nel e2fsprogspacchetto insieme fsck.ext*.
È necessario utilizzare l'output di un comando come argomento di quello successivo.
Questi strumenti rilevano automaticamente la dimensione del blocco del filesystem, quindi è coerente e più sicuro della badblockschiamata diretta .

Stampa i blocchi danneggiati registrati del filesystem:

# dumpe2fs -b DEVNAME

Stampa gli inode che utilizzano l'elenco di blocchi specificato:

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

Stampa i nomi dei percorsi nell'elenco di inode specificato:

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

debugfsha anche una shell interattiva e l' -f cmd_fileopzione, ma non sono molto potenti o utili in questo caso.
L'opzione -R consente script più automatizzati come questo:

#!/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"

solo per sottolineare che il debugfs, su un filesystem molto grande, potrebbe richiedere molto tempo prima di mostrare qualcosa
Aquarius Power
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.