Znajdź, na które pliki mają wpływ uszkodzone bloki w systemie plików ext4

13

Mam system plików ext4, który niedawno rozwinął niektóre uszkodzone sektory. Uruchamianie fsck.ext4 -cznajduje i zapamiętuje złe bloki. Jak mogę znaleźć, które pliki (jeśli w ogóle) zawierały te uszkodzone bloki, aby móc je przywrócić z kopii zapasowych?


źródło
podczas gdy interakcyjnie naprawiałem go za pomocą fsck, pokazywałem, które pliki mają problemy; ale jeśli jest ich zbyt wiele, lepiej odpowiedzieć @Nethox.
Wodnik Moc

Odpowiedzi:

11

Z kombinacją dumpe2fsi debugfs, które są zawarte w e2fsprogspakiecie wraz z fsck.ext*.
Musisz użyć wyniku polecenia jako argumentu następnego.
Narzędzia te automatycznie wykrywają rozmiar bloku systemu plików, dzięki czemu jest spójny i bezpieczniejszy niż bezpośrednie badblockswywołanie.

Drukuje zarejestrowane uszkodzone bloki systemu plików:

# dumpe2fs -b DEVNAME

Wyświetla i-węzły korzystające z podanej listy bloków:

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

Wyświetla nazwy ścieżek na podanej liście i-węzłów:

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

debugfsma również interaktywną powłokę i -f cmd_fileopcję, ale nie są one zbyt mocne ani przydatne w tym przypadku.
Opcja -R pozwala na bardziej zautomatyzowane skrypty takie jak to:

#!/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
źródło
aby zaznaczyć, że debugowanie na bardzo dużym systemie plików może zająć dużo czasu, zanim coś pokaże
Aquarius Power