Finden Sie heraus, welche Dateien von fehlerhaften Blöcken im ext4-Dateisystem betroffen sind

13

Ich habe ein ext4-Dateisystem, das kürzlich einige fehlerhafte Sektoren entwickelt hat. Running fsck.ext4 -cfindet und merkt sich die fehlerhaften Blöcke. Wie kann ich herausfinden, welche Dateien (falls vorhanden) diese fehlerhaften Blöcke enthalten haben, damit ich sie aus Sicherungen wiederherstellen kann?


quelle
während ich es interaktiv mit fsck reparierte, zeigte es, welche Dateien Probleme hatten; Aber wenn es zu viele gibt, ist es besser, was @Nethox beantwortet.
Aquarius Power

Antworten:

11

Mit einer Kombination von dumpe2fsund debugfs, die im e2fsprogsLieferumfang enthalten sind fsck.ext*.
Sie müssen die Ausgabe eines Befehls als Argument des nächsten verwenden.
Diese Tools erkennen automatisch die Blockgröße des Dateisystems, sodass dies konsistent und sicherer ist als der direkte badblocksAufruf.

Druckt die registrierten fehlerhaften Blöcke des Dateisystems:

# dumpe2fs -b DEVNAME

Druckt die Inodes, die die angegebene Blockliste verwenden:

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

Gibt die Pfadnamen zu der angegebenen Inode-Liste aus:

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

debugfshat auch eine interaktive Shell und die -f cmd_fileOption, aber sie sind nicht sehr leistungsfähig oder nützlich für diesen Fall.
Die Option -R ermöglicht automatisiertere Skripte wie folgt:

#!/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
quelle
Nur um darauf hinzuweisen, dass Debugging auf einem sehr großen Dateisystem lange dauern kann, bis etwas angezeigt wird
Aquarius Power