최근에 불량 섹터를 개발 한 ext4 파일 시스템이 있습니다. Running fsck.ext4 -c
은 불량 블록을 찾아서 기억합니다. 이러한 불량 블록이 포함 된 파일 (있는 경우)을 어떻게 찾아 백업에서 복원 할 수 있습니까?
답변
(A)의 조합으로 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"