Son zamanlarda bazı kötü sektörler geliştiren bir ext4 dosya sistemim var. Koşu fsck.ext4 -c
kötü blokları bulur ve hatırlar. Yedeklerden geri yükleyebilmem için hangi dosyaların (varsa) bu bozuk blokları içerdiğini nasıl bulabilirim?
Son zamanlarda bazı kötü sektörler geliştiren bir ext4 dosya sistemim var. Koşu fsck.ext4 -c
kötü blokları bulur ve hatırlar. Yedeklerden geri yükleyebilmem için hangi dosyaların (varsa) bu bozuk blokları içerdiğini nasıl bulabilirim?
Yanıtlar:
Birlikte pakete dahil dumpe2fs
ve ve bir kombinasyonu ile .
Komutun çıktısını bir sonrakinin argümanı olarak kullanmalısınız.
Bu araçlar dosya sistemi blok boyutunu otomatik olarak algılar, bu nedenle doğrudan çağırma işleminden tutarlı ve daha güvenlidir .debugfs
e2fsprogs
fsck.ext*
badblocks
Dosya sisteminin kayıtlı bozuk bloklarını yazdırır:
# dumpe2fs -b DEVNAME
Verilen blok listesini kullanan inode'ları yazdırır:
# debugfs -R "icheck BLOCK ..." DEVNAME
Yol adlarını verilen inode listesine yazdırır:
# debugfs -R "ncheck INODE ..." DEVNAME
debugfs
ayrıca etkileşimli bir kabuk ve -f cmd_file
seçenek var, ancak bu durum için çok güçlü veya kullanışlı değiller.
-R seçeneği aşağıdaki gibi daha otomatik komut dosyalarına izin verir:
#!/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"