sexta-feira, 30 de março de 2012

Kernel Panic


... don't panic!

Não, ainda não é o dia da toalha! Mas este post trata do pânico do núcleo de um sistema operacional. No Windows, conhecido como "tela azul da morte"... ok, não acontece só no Windows; no Unix também pode existir uma situação de travar o SO (tudo bem... é muito menos frequente e por motivos bem justificados). No Unix chama-se Kernel Panic!

Qualquer SO pode se encontrar em uma situação sem saída e, quando isto acontece, o sistema pode perder dados e entrar em um processo de instabilidade. Então para não perder dados ou danificar mais o SO ele para e espera ser reiniciado. Existe uma rotina, nos sistemas Unix e Linux que se chama panic(); ela exibe uma mensagem no console e grava uma imagem da memória do kernel na situação de emergência para ser depurada (debuged) numa outra ocasião.

Mas o que causa o pânico? Um erro de hardware ou mesmo de software, uma memória corrompida fisicamente ou por algum programa etc. causam uma situação de emergência e o sistema chama a função panic().

O código básico da função é:

 char    *panicstr;

 panic(s)
 char *s;
 {
        panicstr = s;
        update();
        printf("panic: %s\n", s);
        for(;;)
                idle();
 }

O "for(;;;)" é o loop em que o sistema entra para esperar pelo reboot! Antigamente, no Multics, grande parte do código do sistema tinha tratamento de excessões e correção de erros. No Unix, Ken Thompson e Denis Ritchie resolveram de modo mais simples: em caso de erro, emita uma mensagem de "Kernel Panic" e entre em loop. Assim, se houver uma falha de hardware ou mesmo um erro de software que desestabilize o sistema, ele para e emite a mensagem.

Nos kernels atuais, além da mensagem de erro e da parada em loop, o SO faz uma cópia da memória do sistema na hora que ocorre o problema. Esta cópia pode ser gravada em um arquivo para posterior análise e identificação do problema [1].

Apesar de ser uma rotina segura e importante, quando ela acontece em um servidor,  se transforma em um problema. Pode ser desejável ativar uma reinicialização automática. Para isso, basta acrescentar a linha:

kernel.panic = 60

no arquivo /etc/sysctl.conf salvar e reiniciar o processo com "sysctl -p". Isto fará com que o servidor reinicie em 1 minuto após um kernel panic! Se quiser testar podes simular um pânico:

# sync
# echo c > /proc/sysrq-trigger

Note que o 'c' tem que ser minúsculo e use com cuidado. Isto forçará um kernel panic e o computador reiniciará em um minuto, se o arquivo sysctl.conf foi configurado para isso.

OK ... e não esqueça a toalha!



Referências

[1] Novel.Com "Configure kernel core dump capture"
http://www.novell.com/support/search.do?cmd=displayKC&docType=kc&externalId=3374462&sliceId=SAL_Public

Nenhum comentário:

Postar um comentário