Como monitorar erros de invasão do sistema de arquivos BTRFS?

11

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 executar um script / programa em uma falha de unidade para uma matriz BTRFS raid1? Gostaria de executar um script em qualquer erro para agir como um aviso antecipado de uma unidade com potencial de falha, mas a falha real da unidade é mais importante. Gostaria de desmontar o sistema de arquivos nesse ponto (se não é o que o BTRFS faz de qualquer maneira) e definir um alarme.

Ioan
fonte
11
Por que você deseja que o sistema desmonte o raid1 na falha da unidade? Esse tipo de bate o propósito, não é? Quer dizer que você pode ter alguma razão para isso, mas por padrão ele não deve fazer isso
Petr
Eu tinha um RAID5 tem duas unidades falham em um curto espaço de tempo. Eu estava procurando configurar um novo sistema usando a capacidade de invasão de espelho do BTRFS e reagir rapidamente a problemas de unidade (não necessariamente falha de unidade) para reduzir a chance de mais danos e, ao mesmo tempo, dar tempo para lidar com a causa original. Espero que o espelho N-way do BTRFS funcione um dia bem.
Ioan
@Ioan: É por isso que o RAID-5 nem sempre é recomendado e o RAID-6 deve ser usado. Um resilver coloca muito estresse em todas as unidades, o que pode causar uma falha na segunda unidade, que pode estar prestes a ficar ruim, durante esse processo. Diferentemente do RAID-5, o RAID-6 pode lidar com isso (você também pode remontar somente leitura e atualizar seu backup antes de substituir a segunda unidade).
basic6

Respostas:

18

Além do sistema de registro regular, o BTRFS possui um comando de estatísticas , que monitora os erros (incluindo erros de leitura, gravação e corrupção / soma de verificação) 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

Então você pode criar um cronjob raiz simples:

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

Isso verificará a contagem de erros positivos a cada hora e enviará um e-mail. 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 BTRFS (com soma de verificação), é recomendável agendar uma limpeza a cada duas semanas para detectar corrupção silenciosa causada por uma unidade defeituosa.

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

A -Bopção manterá a limpeza em primeiro plano, para que você veja os resultados no email que o cron envia. Caso contrário, ele será executado em segundo plano e você precisará verificar os resultados manualmente, pois eles não estariam no email.

Atualização : grep aprimorado, conforme sugerido por Michael Kjörling, obrigado.

Atualização 2 : notas adicionais sobre lavagem versus operações de leitura regulares (isso não se aplica apenas ao BTRFS):
Conforme apontado por Ioan, uma limpeza pode levar muitas horas, dependendo do tamanho e tipo da matriz (e outros fatores), até mais de um dia em alguns casos. E é uma verificação ativa, que não detecta erros futuros - o objetivo de uma limpeza é encontrar e corrigir erros em suas unidades naquele momento. Mas, como em outros sistemas RAID, é recomendável agendar 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 realmente corretos. Mas considere um espelho simples - se a primeira cópia do arquivo estiver danificada, talvez por uma unidade que esteja prestes a morrer, mas a segunda cópia, que está correta, seja realmente lida pelo BTRFS, então o BTRFS não saberá que há corrupção em uma das unidades. Isso ocorre simplesmente porque os dados solicitados foram recebidos,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 esta operação de leitura.
Agora, vamos supor que o BTRFS apenas lê a partir da boa unidade, nenhuma limpeza é executada para detectar os danos na unidade defeituosa e, em seguida, a boa unidade também falha - o resultado seria perda de dados (pelo menos o BTRFS saberia quais arquivos ainda estão corretos e ainda permitem que você os leia). Obviamente, este é um exemplo simplificado; na realidade, o BTRFS nem sempre lê de uma unidade e ignora a outra.
Mas o ponto é que scrubs periódicos são importantes porque encontrarão (e corrigirão) erros que as operações regulares de leitura não necessariamente detectam.

Drives com falha : Como essa pergunta é bastante popular, gostaria de salientar que esta "solução de monitoramento" é para detectar problemas com possíveis discos defeituosos (por exemplo, um drive que está morrendo causando erros, mas ainda acessível).

Por outro lado, se uma unidade desaparecer repentinamente (desconectada ou completamente morta, 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 acabou enquanto o sistema de arquivos está montado, conforme apontado nesta entrada da lista de emails de 09/2015 (é possível que isso tenha sido corrigido):

A diferença é que temos código para detectar um dispositivo que não está presente na montagem, ainda não temos código para detectá-lo em um sistema de arquivos montado. Por que ter uma detecção adequada para um dispositivo desaparecendo não parece ser uma prioridade, não faço ideia, mas isso é um problema separado do comportamento da montagem.

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

Havia toneladas de mensagens de erro no dmesg a essa altura, portanto, grepping dmesg pode não ser confiável.
Para um servidor que usa BTRFS, pode ser uma idéia ter uma verificação personalizada (tarefa cron) que envie um alerta se pelo menos uma das unidades na matriz RAID se for, ou seja, não estiver mais acessível ...

basic6
fonte
11
Algo como não grep -vE ' 0$'seria melhor?
um CVn
@ MichaelKjörling: Boa ideia, eu atualizei minha resposta, obrigado!
basic6
Essa é uma boa idéia, e faço-a como uma verificação de integridade regular. No entanto, pode levar muito mais de uma hora para somar todos os dados. Sem mencionar o desgaste do hardware, se estiver sendo executado continuamente para detectar os erros. O BTRFS faz a soma de verificação de todas as operações normais do sistema de arquivos e isso seria uma maneira mais eficiente de reagir imediatamente a elas.
Ioan
@ Loan: Você está correto, uma limpeza pode ser executada por muitas horas, por isso, obviamente, coloca muita pressão nas unidades. Mas isso é feito para detectar corrupção silenciosa, para que você possa substituir uma unidade defeituosa antes que outra também danifique. A corrupção silenciosa não ocorre durante as operações normais do FS, portanto você não será informado automaticamente.
basic6
@ basic6: Absolutamente, e isso é ótimo para isso. No entanto, ele não faz nada para detectar erros durante a operação normal, como uma matriz BTRFS degradada, até a próxima limpeza. A corrupção silenciosa pode ser tratada usando uma limpeza mensal para obter eficiência, mas é muito tempo para outros erros.
Ioan
4

A partir das estatísticas do btrfs-progs v4.11.1, tem a opção --check que retornará diferente de zero se algum valor não for zero, eliminando a necessidade do regex.

estatísticas do dispositivo -c /

Nick Mayer
fonte
3

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

btrfs device stats /

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

btrfs fi show
Charles Young
fonte
2

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

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

O link acima fornece mais detalhes para configurar um script ( secpacote no Debian ou SEC ) projetado para monitoramento de log de propósito geral para atuar em mensagens de log inesperadas relacionadas ao BTRFS. Também depende de uma limpeza programada regularmente do sistema de arquivos para verificar a rotação de bits e emitir entradas de log como uma medida preventiva. Abaixo está um trecho específico para o script SEC:

Como configurar o sec, correlacionador de eventos para relatar erros ou avisos do sistema de arquivos btrfs

Após instalar o sec.pl (apt-get install sec no debian ou http://simple-evcorr.sourceforge.net/ ), instale os 2 arquivos de configuração abaixo.

Isso não é infalível, depende de uma regex de mensagens conhecidas que são aceitáveis ​​e relata todas as desconhecidas. Você pode estender a regex negativa de previsão, conforme necessário.

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
fonte
1

Parece uma tarefa para o monitoramento do sistema. Existe uma verificação que implementa a API do Nagios Plugin chamada: check_btrfs . Como você pode ver no código-fonte, ele tem uma função chamada check_dev_statsque verifica as estatísticas do dispositivo e será crítica se algum dos valores for diferente de zero. Ele também verifica se há problemas de alocação. O que permanece incerto é como a verificação se comporta se um disco estiver ausente ou ficar offline .

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

ypid
fonte