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"

関連情報