Найдите, какие файлы подвержены повреждению блоков в файловой системе ext4

13

У меня есть файловая система ext4, которая недавно разработала несколько плохих секторов. Бег fsck.ext4 -cнаходит и запоминает плохие блоки. Как я могу найти, какие файлы (если есть) содержат эти поврежденные блоки, чтобы я мог восстановить их из резервных копий?


источник
пока я интерактивно исправлял это с помощью fsck, он показывал, какие файлы имели проблемы; но, если их слишком много, лучше ответит @Nethox.
Сила Водолея

Ответы:

11

С комбинацией dumpe2fsи debugfs, которые входят в e2fsprogsкомплект вместе с fsck.ext*.
Вы должны использовать выходные данные команды в качестве аргумента следующего.
Эти инструменты автоматически определяют размер блока файловой системы, поэтому он согласован и безопаснее, чем прямой badblocksвызов.

Печатает зарегистрированные поврежденные блоки файловой системы:

# dumpe2fs -b DEVNAME

Печатает inode, которые используют данный список блоков:

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

Печатает пути к указанному списку инодов:

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

debugfsимеет также интерактивную оболочку и -f cmd_fileопцию, но они не очень мощные или полезные для этого случая.
Опция -R позволяет использовать больше автоматических сценариев:

#!/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
источник
просто чтобы указать, что debugfs на очень большой файловой системе может занять много времени, прежде чем что-то показывать
Aquarius Power