ext4 파일 시스템에서 불량 블록의 영향을 받는 파일 찾기

ext4 파일 시스템에서 불량 블록의 영향을 받는 파일 찾기

최근 일부 불량 섹터가 발생한 ext4 파일 시스템이 있습니다. 실행은 fsck.ext4 -c불량 블록을 찾아 기억합니다. 백업에서 복원할 수 있도록 불량 블록이 포함된 파일(있는 경우)을 어떻게 찾나요?

답변1

dumpe2fs와 의 조합 이 패키지 debugfs에 포함되어 있습니다 . 명령의 출력을 다음 명령의 인수로 사용해야 합니다. 이러한 도구는 파일 시스템 블록 크기를 자동으로 감지하므로 직접 호출하는 것보다 일관되고 안전합니다.e2fsprogsfsck.ext*

badblocks

파일 시스템에 등록된 불량 블록을 인쇄합니다.

# dumpe2fs -b DEVNAME

주어진 블록 목록을 사용하여 inode를 인쇄합니다.

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

주어진 inode 목록의 경로 이름을 인쇄합니다:

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

관련 정보