Menemukan file dengan BTRFS Kesalahan yang Tidak Dapat Dikoreksi

17

Saya memiliki pertanyaan tentang kesalahan yang tidak dapat diperbaiki pada sistem file BTRFS. Secara khusus, saya telah menjalankan BTRFS Scrub baru-baru ini setelah mengalami masalah dengan salah satu RAM stick saya dan tampaknya telah menemukan 4 kesalahan yang tidak dapat diperbaiki. Ini adalah output:

scrub status for <UUID>
    scrub started at Thu Dec 25 15:19:22 2014 and was aborted after 89882 seconds
    total bytes scrubbed: 1.87TiB with 4 errors
    error details: csum=4
    corrected errors: 0, uncorrectable errors: 4, unverified errors: 0

Untungnya saya memiliki semua yang dicadangkan dalam cadangan tersier sehingga saya tidak terlalu khawatir kehilangan file (Saya sangat menyadari masalah yang terkait dengan status eksperimental BTRFS, saya memiliki beberapa cadangan untuk menjaga data saya aman, dan bertekad untuk terus menggunakannya jadi tolong jangan: "Solusi; jangan gunakan posting BTRFS").

Saya ingin tahu, bagaimana cara menentukan file mana yang dikaitkan dengan kesalahan yang tidak dapat diperbaiki? Saya ingin menemukan mereka, menghapusnya, dan menggantinya dengan salinan yang didukung.

Jika ada yang punya informasi tentang cara melakukan ini, saya akan senang mendengar dari Anda.

Terima kasih sebelumnya.

RedHack
sumber

Jawaban:

8

Saya telah menemukan metode berikut berguna ...

btrfs scrub volume.

Anda akan disajikan sejumlah kesalahan csum seperti yang Anda tunjukkan di atas.
Menggunakan contoh detail kesalahan Anda: csum = 4 . Gunakan nomor itu di petunjuk ekor pernyataan berikut:

dmesg | grep "checksum error at" | tail -4 | cut -d\  -f24- | sed 's/.$//'

Berguna untuk mem-pipe ini ke file (mis. > csums.txt)

Saya telah mencoba sejumlah pendekatan pencarian inode yang disarankan dan mereka semua telah bertemu dengan sukses terbatas jika ada.

Menandai
sumber
Sejauh yang saya mengerti, Anda menggunakan ekor untuk membatasi jumlah garis yang ditampilkan dan mengabaikan duplikat. Saya akan merekomendasikan menggunakan sort | uniquntuk menyingkirkan duplikat seperti:dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi
3

Ya, pemetaan dari INODE atau Block Number kembali ke nama file bisa jadi sulit. Jika Anda benar-benar tertarik, Anda dapat mencoba sesuatu seperti ini dan melihat file file mana yang akan disalin ... setelah itu, jika file tersebut buruk, ia akan menimbulkan kesalahan saat menyalin. Saya sebelumnya telah menggunakan teknik jenis ini.

 find /mount-point -type f -exec cp {} /dev/null \;

 where mount-point is the ROOT node/mount-point of the affected filesystem
mdpc
sumber
Menjalankannya sekarang, semoga akan muncul sesuatu. Terima kasih atas saran Anda, saya akan memberi tahu Anda hasilnya.
RedHack
1
Maaf untuk mengatakan itu tidak berfungsi = / ia menemukan file pertama yang menyebabkan kesalahan yang tidak dapat diperbaiki, tetapi kemudian mengirim pesan: "basi file basi" ke terminal kecuali saya menghentikannya. Memang menemukan file, tapi sekarang saya tidak tahu bagaimana cara menghilangkannya. Harus menghubungi milis BTRFS.
RedHack
Anda dapat memindahkannya ke direktori khusus dan kemudian mengecualikannya dari pencarian lebih lanjut.
mdpc
1
Itu tidak akan bergerak atau menyalin, itu hanya terus mengatakan kepada saya bahwa file menangani basi. Aku bahkan tidak bisa.
RedHack
Jika Anda menggunakan cp -v, Anda juga dapat memantau kemajuan: find / -type f -exec cp -v {} /dev/null \; 2> corrupted-files.txt. Namun, /proc/kcorefile mungkin sangat besar (milik saya 128TB) sehingga operasi penyalinan kemungkinan akan hang. Karena /procdirektori berisi file magis khusus, kita tidak perlu memeriksanya. Kecualikan /procdirektori:sudo find / -type f -and -not -path /proc -exec cp -v {} /dev/null \; 2> corrupted-files.txt
ceremcem
2

dmesgakan memberi Anda detail tentang file yang terlibat dalam kesalahan checksum yang tidak dapat diperbaiki. Pesan biasanya terlihat seperti ini: "BTRFS: kesalahan checksum pada logis [...] pada dev [...], sektor [...], root [...], inode [...], offset [ ...], panjang [...], tautan [...] (jalur: [...]) "; informasi terakhir adalah jalur absolut ke file yang rusak.

arrrr
sumber
1

Saya datang ke sini untuk mencari "Kesalahan yang tidak dapat diperbaiki" dari BTRFS juga. Grep di atas tidak bekerja untuk saya; Saya harus menggunakan:

$ dmesg | sed -n -r 's#.*BTRFS.*i/o error.*path: (.*)\)#\1#p' | sort -u
somepath/somefile.txt

Perhatikan bagaimana jalur relatif terhadap awal subvolume - tidak ada indikasi subvolume itu. Untungnya ini bukan masalah bagi saya.

crusaderky
sumber
Apa somepath/somefile.txt? Sepertinya Anda mengetiknya sebagai perintah terpisah - atau apakah itu output dari perintah yang Anda ketikkan? Jika itu semua seharusnya menjadi satu baris perintah, tolong jangan memecah baris perintah untuk tujuan tampilan - cukup masukkan ke dalam jawaban sebagai satu baris panjang. Tapi apa itu? Apakah Anda memberikan dua input ke sort(pipa dan file)? Atau somepath/somefile.txtdimaksudkan sebagai file keluaran? (Tidaklah terlalu membantu untuk menentukan file output, kecuali mereka file intermediate yang Anda gunakan lagi. Orang-orang tahu bagaimana menangani hasil; misalnya dengan memipet.)
Scott
Apakah ini menjawab pertanyaan awal? Saya tidak tahu.
Saya katakan Reinstate Monica
@TwistyImpersonator Yah, itu (IMO) jelas dimaksudkan sebagai alternatif untuk jawaban Markus , dan yang mendapat delapan suara (dan merupakan perluasan dari jawaban arrrr ).
Scott
1
@Scott baris kedua adalah contoh output dari perintah.
crusaderky