Son zamanlarda bazı kötü sektörler geliştiren bir ext4 dosya sistemim var. Koşu fsck.ext4 -ckö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 -ckö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 dumpe2fsve 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 .debugfse2fsprogsfsck.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
debugfsayrıca etkileşimli bir kabuk ve -f cmd_fileseç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"