Como monitorar o ataque ao sistema de arquivos BTRFS por erros?

9

Eu vi alguma documentação em um daemon que pode executar um programa / script para vários eventos BTRFS, mas não consigo mais encontrá-lo.

Como posso ter um script / programa executado em uma falha de unidade para uma matriz RAID1 BTRFS? Eu gostaria de executar um script em qualquer erro para agir como um aviso antecipado para uma unidade potencialmente com falha, mas a falha real da unidade é mais importante. Eu gostaria de desmontar o sistema de arquivos nesse ponto (se não for o que o BTRFS faz de qualquer maneira) e definir um alarme.

    
por Ioan 28.07.2014 / 22:14

5 respostas

1

Não parece haver um daemon ou utilitário que comunique oficialmente eventos BTRFS para manipulação de usuários. A alternativa mais próxima é monitorar o log do sistema em busca de mensagens do BTRFS e reagir de acordo.

link

O link acima fornece mais detalhes para configurar um script ( sec package no Debian ou SEC ) projetado para uso geral Monitoramento de log para atuar sobre mensagens de log inesperadas relacionadas ao BTRFS. Ele também depende de uma limpeza regular programada do sistema de arquivos para verificar a perda de bits e emitir entradas de registro como uma medida preventiva. Abaixo está um trecho específico para o script SEC:

How to configure sec, event correlator to report btrfs filesystem errors or warnings

After installing sec.pl (apt-get install sec on debian or http://simple-evcorr.sourceforge.net/), install the 2 config files below.

This is not foolproof, it relies on a regex of known messages that are ok, and reports all unknown ones. You can extend the forward looking negative regex as needed.

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
    
por 29.07.2014 / 21:44
15

Além do sistema de registro regular, o BTRFS possui um comando stats , que controla os erros (incluindo erros de leitura, escrita e corrupção / checksum) por unidade:

# 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

Você pode criar um cronjob root simples:

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

Isso verificará as contagens de erros positivos a cada hora e enviará um e-mail para você. Obviamente, você testaria esse cenário (por exemplo, causando corrupção ou removendo o grep) para verificar se a notificação por email funciona.

Além disso, com sistemas de arquivos avançados, como o BTRFS (que tem checksumming), geralmente recomenda-se agendar um scrub a cada duas semanas para detectar a corrupção silenciosa causada por um drive defeituoso.

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

A opção -B manterá o scrub em primeiro plano, para que você veja os resultados no cron do email que você envia. Caso contrário, ele será executado em segundo plano e você terá que lembrar de verificar os resultados manualmente, pois eles não estariam no e-mail.

Atualização : Aprimorada grep como sugerido por Michael Kjörling, obrigado.

Atualização 2 : Notas adicionais sobre depuração versus operações de leitura regulares (isso não se aplica apenas ao BTRFS):
Como apontado por Ioan, um scrub pode levar muitas horas, dependendo do tamanho e do tipo do array (e outros fatores), até mais do que um dia em alguns casos. E é uma varredura ativa, não detectará erros futuros - o objetivo de um scrub é encontrar e corrigir erros em suas unidades naquele momento. Mas, como acontece com outros sistemas RAID, recomenda-se programar scrubs periódicos. É verdade que uma operação de E / S típica, como a leitura de um arquivo, verifica se os dados lidos estão corretos. Mas considere um espelho simples - se a primeira cópia do arquivo estiver danificada, talvez por uma unidade prestes a morrer, mas a segunda cópia, que está correta, for realmente lida pelo BTRFS, então o BTRFS não saberá que existe corrupção em uma das unidades. Isso ocorre simplesmente porque os dados solicitados foram recebidos, eles correspondem à soma de verificação que o BTRFS armazenou para esse arquivo, portanto, não há necessidade de o BTRFS ler a outra cópia. Isso significa que, mesmo que você leia especificamente um arquivo que sabe estar corrompido em uma unidade, não há garantia de que a corrupção será detectada por essa operação de leitura.
Agora, vamos supor que o BTRFS só lê a partir da unidade boa, não é executado o scrub que detectaria o dano na unidade defeituosa e, em seguida, a unidade também funciona mal - o resultado seria perda de dados (pelo menos o BTRFS saberia quais arquivos ainda estão corretos e ainda permitirão que você os leia). Claro, este é um exemplo simplificado; na realidade, o BTRFS nem sempre lê uma unidade e ignora a outra.
Mas o ponto é que os scrubs periódicos são importantes porque eles encontrarão (e consertarão) erros que as operações regulares de leitura não necessariamente detectarão.

Inversores com falhas : Como essa pergunta é bastante popular, gostaria de salientar que essa "solução de monitoramento" é para detectar problemas com possivelmente discos defeituosos (por exemplo, a unidade em estado morto causando erros, mas ainda acessível).

Por outro lado, se uma unidade for repentinamente desligada (desconectada ou completamente inoperante em vez de morrer e produzir erros), seria uma unidade com falha (o ZFS marcaria essa unidade como FAULTED). Infelizmente, o BTRFS pode não perceber que uma unidade desapareceu enquanto o sistema de arquivos está montado, como apontado nesta entrada da lista de discussão de 09/2015 (é possível que isso tenha sido corrigido):

The difference is that we have code to detect a device not being present at mount, we don't have code (yet) to detect it dropping on a mounted filesystem. Why having proper detection for a device disappearing does not appear to be a priority, I have no idea, but that is a separate issue from mount behavior.

link

Haveria toneladas de mensagens de erro no dmesg até lá, então o dmesg do grepping pode não ser confiável.
Para um servidor que usa o BTRFS, pode ser uma idéia ter uma verificação personalizada (tarefa cron) que envia um alerta se pelo menos uma das unidades na matriz RAID desaparecer, ou seja, não estiver mais acessível ...

    
por 12.11.2015 / 13:27
2

A partir do btrfs-progs v4.11.1 stats tem a opção --check que retornará um valor diferente de zero se algum dos valores não for zero, removendo a necessidade do regex.

estatísticas do dispositivo -c /

    
por 10.06.2018 / 19:45
1

Eu não confiaria no comando stats para notificação de erro, porque este comando não retorna nenhum erro se uma unidade desaparecer repentinamente. Você pode testá-lo desconectando um cabo SATA ou puxando uma unidade - não recomendado com um sistema de arquivos importante.

btrfs device stats /

Após a reinicialização, o btrfs mostra as unidades ausentes, mas isso pode ser tarde demais.

btrfs fi show
    
por 13.12.2015 / 22:23
1

Soa como uma tarefa para monitoramento do sistema. Existe uma verificação que implementa a API do Nagios Plugin: check_btrfs . Como você pode ver no código-fonte, ele tem uma função chamada check_dev_stats , que verifica as estatísticas do dispositivo e será crítica se algum dos valores for diferente de zero. Também verifica problemas de alocação. O que ainda não está claro é como a verificação se comportará se um disco estiver ausente ou estiver off-line .

PS: O plugin é empacotado no Debian: monitoring-plugins-btrfs

    
por 10.05.2018 / 14:29