Bagaimana cara memonitor serangan sistem file BTRFS untuk kesalahan?

11

Saya melihat beberapa dokumentasi tentang daemon yang dapat menjalankan program / skrip untuk berbagai acara BTRFS, tetapi saya tidak dapat menemukannya lagi.

Bagaimana saya bisa menjalankan skrip / program pada kegagalan drive untuk array BTRFS raid1? Saya ingin menjalankan skrip pada kesalahan apa pun untuk bertindak sebagai peringatan dini untuk drive yang berpotensi gagal, tetapi kegagalan drive yang sebenarnya adalah yang paling penting. Saya ingin meng-unmount sistem file pada saat itu (jika bukan itu yang dilakukan BTRFS) dan mengatur alarm.

Ioan
sumber
1
Mengapa Anda ingin sistem unmount raid1 pada kegagalan drive? Jenis ketukan tujuannya bukan? Maksud saya Anda mungkin memiliki beberapa alasan untuk itu, tetapi secara default seharusnya tidak melakukan ini
Petr
Saya memiliki RAID5, dua drive gagal dalam waktu singkat satu sama lain. Saya sedang mencari untuk membuat sistem baru menggunakan kemampuan serangan cermin BTRFS 'dan cepat bereaksi terhadap masalah drive (belum tentu mendorong kegagalan) untuk mengurangi kemungkinan kerusakan lebih lanjut sambil memberikan waktu untuk menangani penyebab asli. Saya berharap mirror N-way BTRFS suatu hari nanti akan bekerja dengan baik.
Ioan
@Ioan: Inilah sebabnya mengapa RAID-5 tidak selalu disarankan dan RAID-6 harus digunakan sebagai gantinya. Resilver akan memberikan banyak tekanan pada semua drive, yang dapat menyebabkan drive kedua, yang mungkin akan rusak, gagal selama proses ini. Tidak seperti RAID-5, RAID-6 dapat mengatasinya (Anda juga dapat melakukan remount hanya-baca dan memperbarui cadangan Anda sebelum mengganti drive kedua).
basic6

Jawaban:

18

Selain sistem pencatatan reguler, BTRFS memang memiliki perintah statistik , yang melacak kesalahan (termasuk kesalahan baca, tulis, dan korupsi / checksum) per drive:

# btrfs device stats /
[/dev/mapper/luks-123].write_io_errs   0
[/dev/mapper/luks-123].read_io_errs    0
[/dev/mapper/luks-123].flush_io_errs   0
[/dev/mapper/luks-123].corruption_errs 0
[/dev/mapper/luks-123].generation_errs 0

Jadi Anda bisa membuat cronjob root sederhana:

[email protected]
@hourly /sbin/btrfs device stats /data | grep -vE ' 0$'

Ini akan memeriksa jumlah kesalahan positif setiap jam dan mengirimkan Anda email. Jelas, Anda akan menguji skenario seperti itu (misalnya dengan menyebabkan korupsi atau menghapus grep) untuk memverifikasi bahwa pemberitahuan email berfungsi.

Selain itu, dengan filesystem canggih seperti BTRFS (yang memiliki checksumming), sering disarankan untuk menjadwalkan scrub setiap beberapa minggu untuk mendeteksi korupsi diam-diam yang disebabkan oleh drive yang buruk.

@monthly /sbin/btrfs scrub start -Bq /data

The -Bpilihan akan tetap scrub di latar depan, sehingga Anda akan melihat hasilnya dalam cron email mengirimkan Anda. Jika tidak, itu akan berjalan di latar belakang dan Anda harus ingat untuk memeriksa hasilnya secara manual karena mereka tidak akan ada di email.

Pembaruan : Peningkatan grep seperti yang disarankan oleh Michael Kjörling, terima kasih.

Pembaruan 2 : Catatan tambahan tentang menggosok vs operasi baca biasa (ini tidak hanya berlaku untuk BTRFS saja):
Seperti yang ditunjukkan oleh Ioan, scrub dapat memakan waktu berjam-jam, tergantung pada ukuran dan jenis array (dan faktor lainnya), bahkan lebih dari satu hari dalam beberapa kasus. Dan ini adalah pemindaian aktif, tidak akan mendeteksi kesalahan di masa mendatang - tujuan scrub adalah menemukan dan memperbaiki kesalahan pada drive Anda pada saat itu. Tetapi seperti sistem RAID lainnya, disarankan untuk menjadwalkan scrub berkala. Memang benar bahwa operasi i / o biasa, seperti membaca file, tidak memeriksa apakah data yang dibaca benar. Tetapi pertimbangkan mirror sederhana - jika salinan pertama file rusak, mungkin oleh drive yang akan mati, tetapi salinan kedua, yang benar, sebenarnya dibaca oleh BTRFS, maka BTRFS tidak akan tahu bahwa ada korupsi di salah satu drive. Ini hanya karena data yang diminta telah diterima,Ini berarti bahwa bahkan jika Anda secara khusus membaca file yang Anda tahu rusak pada satu drive, tidak ada jaminan bahwa korupsi akan terdeteksi oleh operasi baca ini.
Sekarang, mari kita asumsikan bahwa BTRFS hanya pernah membaca dari drive yang baik, tidak ada scrub dijalankan yang akan mendeteksi kerusakan pada drive yang buruk, dan kemudian drive yang baik menjadi buruk juga - hasilnya akan kehilangan data (setidaknya BTRFS akan tahu file mana yang masih benar dan masih akan memungkinkan Anda untuk membacanya). Tentu saja, ini adalah contoh yang disederhanakan; pada kenyataannya, BTRFS tidak akan selalu membaca dari satu drive dan mengabaikan yang lain.
Tetapi intinya adalah bahwa scrub berkala itu penting karena mereka akan menemukan (dan memperbaiki) kesalahan yang tidak dapat dideteksi oleh operasi baca reguler.

Faulted drive : Karena pertanyaan ini cukup populer, saya ingin menunjukkan bahwa "solusi pemantauan" ini adalah untuk mendeteksi masalah dengan kemungkinan drive yang buruk (mis., Sekarat drive menyebabkan kesalahan tetapi masih dapat diakses).

Di sisi lain, jika drive tiba-tiba hilang (terputus atau benar-benar mati daripada sekarat dan menghasilkan kesalahan), itu akan menjadi drive yang rusak (ZFS akan menandai drive seperti FAULTED). Sayangnya, BTRFS mungkin tidak menyadari bahwa drive hilang ketika sistem file di-mount, seperti yang ditunjukkan dalam entri milis ini dari 09/2015 (mungkin ini telah ditambal):

Perbedaannya adalah bahwa kita memiliki kode untuk mendeteksi perangkat yang tidak ada di mount, kita tidak memiliki kode (belum) untuk mendeteksi itu jatuh pada sistem file yang terpasang. Mengapa deteksi yang tepat untuk perangkat yang hilang tampaknya bukan prioritas, saya tidak tahu, tapi itu masalah terpisah dari perilaku mount.

https://www.mail-archive.com/[email protected]/msg46598.html

Akan ada banyak pesan kesalahan di dmesg saat itu, jadi memahami dmesg mungkin tidak bisa diandalkan.
Untuk server yang menggunakan BTRFS, mungkin gagasan untuk memiliki pemeriksaan khusus (tugas cron) yang mengirimkan peringatan jika setidaknya salah satu drive dalam array RAID hilang, yaitu, tidak dapat diakses lagi ...

basic6
sumber
1
Bukankah sesuatu seperti grep -vE ' 0$'lebih baik?
CVn
@ MichaelKjörling: Ide bagus, saya sudah memperbarui jawaban saya, terima kasih!
basic6
Ini adalah ide yang bagus, dan saya melakukannya sebagai pemeriksaan integritas reguler. Namun, itu bisa memakan waktu lebih lama dari satu jam untuk checksum semua data. Belum lagi keausan pada perangkat keras jika menjalankannya terus menerus untuk mengambil kesalahan. BTRFS melakukan pengecekan terhadap semua operasi sistem file normal dan itu akan menjadi cara yang lebih efisien untuk segera bereaksi terhadapnya.
Ioan
@ pinjaman: Anda benar, scrub dapat berjalan selama berjam-jam, jadi jelas banyak tekanan pada drive. Tapi itu dilakukan untuk mendeteksi korupsi diam-diam, sehingga Anda dapat mengganti drive yang buruk sebelum yang lain menjadi buruk juga. Korupsi diam-diam tidak terjadi selama operasi normal fs, sehingga Anda tidak akan diberitahu secara otomatis.
basic6
@ basic6: Tentu saja, dan ini bagus untuk itu. Namun, itu tidak melakukan apa pun untuk mendeteksi kesalahan selama operasi normal, seperti array BTRFS yang terdegradasi, hingga scrub berikutnya. Korupsi diam-diam dapat ditangani dengan menggunakan scrub bulanan untuk efisiensi, tetapi itu terlalu lama untuk kesalahan lainnya.
Ioan
4

Pada btrfs-progs v4.11.1 stats memiliki opsi --check yang akan mengembalikan non-nol jika salah satu nilai tidak nol, menghilangkan kebutuhan untuk regex.

statistik perangkat -c /

Nick Mayer
sumber
3

Saya tidak akan bergantung pada perintah statistik untuk pemberitahuan kesalahan, karena perintah ini tidak mengembalikan kesalahan jika drive tiba-tiba hilang. Anda dapat mengujinya dengan melepaskan kabel sata atau menarik drive - tidak disarankan dengan sistem file penting.

btrfs device stats /

Setelah reboot, btrfs menunjukkan drive yang hilang, tetapi mungkin sudah terlambat.

btrfs fi show
Charles Young
sumber
2

Tampaknya tidak ada daemon atau utilitas yang secara resmi melaporkan peristiwa BTRFS untuk penanganan pengguna. Alternatif terdekat adalah memantau log sistem untuk pesan dari BTRFS dan bereaksi sesuai itu.

http://marc.merlins.org/perso/btrfs/post_2014-03-19_Btrfs-Tips_-Btrfs-Scrub-and-Btrfs-Filesystem-Repair.html

Tautan di atas memberikan detail lebih lanjut untuk mengonfigurasi skrip ( secpaket pada Debian atau SEC ) yang dirancang untuk pemantauan log tujuan umum untuk bertindak atas pesan log yang tidak terduga terkait BTRFS. Itu juga tergantung pada memiliki scrub dijadwalkan secara teratur dari sistem file untuk memeriksa bit-rot dan memancarkan entri log sebagai langkah pencegahan. Di bawah ini adalah kutipan khusus untuk skrip SEC:

Cara mengkonfigurasi detik, korelator peristiwa untuk melaporkan kesalahan atau peringatan sistem file btrfs

Setelah menginstal sec.pl (apt-get install sec pada debian atau http://simple-evcorr.sourceforge.net/ ), instal 2 file konfigurasi di bawah ini.

Ini bukan sangat mudah, itu bergantung pada regex dari pesan yang dikenal yang baik-baik saja, dan melaporkan semua yang tidak dikenal. Anda dapat memperluas regex negatif yang tampak ke depan sesuai kebutuhan.

polgara:~\# cat /etc/default/sec  
\#Defaults for sec  
RUN_DAEMON="yes"  
DAEMON_ARGS="-conf=/etc/sec.conf -input=/var/log/syslog -pid=/var/run/sec.pid -detach -log=/var/log/sec.log"

polgara:~# cat /etc/sec.conf  
\# http://simple-evcorr.sourceforge.net/man.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article-part2.html  
type=SingleWithSuppress  
ptype=RegExp  
pattern=(?i)kernel.*btrfs: (?!disk space caching is enabled|use ssd allocation|use .* compression|unlinked .* orphans|turning on discard|device label .* devid .* transid|detected SSD devices, enabling SSD mode|has skinny extents|device label|creating UUID tree|checking UUID tree|setting .* feature flag|bdev.* flush 0, corrupt 0, gen 0)  
window=60  
desc=Btrfs unexpected log  
action=pipe '%t: $0' /usr/bin/mail -s "sec: %s" root
Ioan
sumber
1

Kedengarannya seperti tugas untuk memonitor sistem. Ada cek yang mengimplementasikan API Plugin Nagios disebut: check_btrfs . Seperti yang Anda lihat dalam kode sumber, ia memiliki fungsi yang disebut check_dev_statsyang memeriksa statistik perangkat dan akan menjadi kritis jika salah satu nilainya tidak nol. Ini juga memeriksa masalah alokasi. Yang masih belum jelas adalah bagaimana pemeriksaan berlaku jika satu disk tidak ada atau menjadi offline .

PS: Plugin ini dikemas dalam Debian: monitoring-plugins-btrfs

ypid
sumber