Temukan file mana yang dipengaruhi oleh blok buruk pada sistem file ext4


13

Saya memiliki sistem file ext4 yang baru-baru ini mengembangkan beberapa sektor buruk. Lari fsck.ext4 -cmenemukan dan mengingat blok buruk. Bagaimana saya dapat menemukan file mana (jika ada) termasuk blok buruk ini sehingga saya dapat mengembalikannya dari cadangan?

linux  ext4 

sementara saya secara interaktif memperbaikinya dengan fsck, itu menunjukkan file apa yang bermasalah; tetapi, jika ada terlalu banyak, lebih baik adalah apa yang dijawab @Nethox.
Aquarius Power

Jawaban:


11

Dengan kombinasi dumpe2fsdan debugfs, yang termasuk dalam e2fsprogspaket bersama fsck.ext*.
Anda harus menggunakan output dari perintah sebagai argumen dari perintah berikutnya.
Alat-alat ini secara otomatis mendeteksi ukuran blok sistem file, sehingga konsisten dan lebih aman daripada badblocksdoa langsung .

Mencetak blok buruk terdaftar dari sistem file:

# dumpe2fs -b DEVNAME

Mencetak inode yang menggunakan daftar blokir yang diberikan:

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

Mencetak nama path ke daftar inode yang diberikan:

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

debugfsjuga memiliki shell interaktif dan -f cmd_fileopsi, tetapi mereka tidak terlalu kuat atau berguna untuk kasus ini.
Opsi -R memungkinkan lebih banyak skrip otomatis seperti ini:

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

hanya untuk menunjukkan bahwa debugfs, pada sistem file yang sangat besar, mungkin perlu waktu lama sebelum menunjukkan sesuatu
Aquarius Power
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.