Depuração de bloqueio - systemd perde meus logs

8

Desde que "atualizei" para o systemd no Arch Linux, continuo perdendo logs quando ocorre um bloqueio inesperado. Eu bati no mesmo problema de perda de log há um mês e simplesmente bati no problema novamente. Também existem outras confirmações independentes .

Situação:

  • Enquanto fazia algumas coisas em Java e com utilitários relacionados à rede, vi que o KDE (o relógio) estava congelado. O ventilador da CPU ficou barulhento e o calor estava subindo. O ponteiro do mouse ainda pode ser movido.
  • Tentei ssh de outra máquina (falha devido a "nenhuma rota para hospedar")
  • Esperei alguns minutos, talvez o cão de guarda da MNI pudesse matar a tarefa ofensiva. Sem dados.
  • Ctrl+ Alt+ F1também não funcionou, mesmo depois de SysRq+R
  • Como as etapas acima não funcionaram, decidi emitir a sequência REI do SysRq. Depois E, a tela ficou preta, mas nenhum console também. Nem mesmo depois de SysRq+K
  • Portanto, esta sessão parece estar perdida, a única coisa que pode ser feita é coletar informações de depuração. Olhando para a Wikipedia , decidi pressionar SysRq+ d(exibir travas) entre alguns outros.
  • Depois de pressionar SysRq+ S, esperei um segundo e depois reiniciei com SysRq+ B.
  • Após a reinicialização e o login em um console, não vi vestígios de nenhuma falha. A entrada registrada mais recentemente foi do uso do Wireshark, mas ainda havia um intervalo de 45 minutos.

(Eu estava executando o Linux v3.8-rc5-218-ga56e160 btw)

Portanto, como posso garantir que meus logs sejam retidos durante a reinicialização anormal devido a um bloqueio?

Lekensteyn
fonte
você sabe se esse problema foi finalmente resolvido systemdou não? Recentemente, estou vendo problemas semelhantes. Eu publiquei
kaptan
O @kaptan systemd ainda não libera diretamente os logs para o armazenamento persistente. Veja a SyncIntervalSecopção (entre outras) no homem journald.conf(5).
Lekensteyn
tnx para sua resposta. from man jounrnald.conf(5): SyncIntervalSec = ... Observe que a sincronização é feita incondicionalmente imediatamente após o log de uma mensagem de log de prioridade CRIT, ALERT ou EMERG. Portanto, essa configuração se aplica apenas a mensagens dos níveis ERR, WARNING, AVISO, INFO, DEBUG. Isso não significa simplesmente que, se um erro crítico for registrado, ele deverá ser sincronizado "imediatamente" sem aguardar o intervalo? Então, o que significa que, se ocorrer um erro crítico, devemos vê-lo nos journaldlogs. Estou esquecendo de algo?!
kaptan
@kaptan Muito poucas mensagens são registradas com gravidade CRIT. Se os aplicativos realmente usarem mensagens definidas com essa propriedade (a maioria não), isso poderá desencadear a liberação. Em outros casos (por exemplo, ERR), não será liberado imediatamente.
Lekensteyn

Respostas:

4

Então perguntei no canal #systemd IRC e o journald (o daemon de log do systemd) não libera periodicamente os logs para o disco. Isso significa que seus logs estão sempre em risco a qualquer momento.

O envio SIGUSR2para os journaldlogs de causas é gravado no disco, mas se você fizer isso várias vezes, muitos arquivos serão criados. (a opção é realmente descrita como "rotação do log").

No final, decidi seguir outra sugestão: usar um daemon syslog dedicado para coletar logs do kernel. Como o rsyslog foi sugerido (e eu já tinha experiência com ele), explorei essa opção ainda mais. Eu escrevi mais alguns detalhes no Arch Wiki sobre o uso do rsyslog.

A idéia é executar o rsyslog, coletando apenas dados da instalação do kernel. Como o rsyslog lê de /proc/kmsg(o que permite apenas um único leitor) e o journald lê de /dev/kmsg(vários leitores permitidos), não há como os daemons perderem logs (muito importante para mim!). Configure o rsyslog para gravar mensagens do kernel em um arquivo e verifique se esse arquivo foi girado para evitar a ingestão de espaço em disco.

Esta solução não é perfeita:

  • Outros logs (por exemplo, do NetworkManager) são perdidos. Isso pode ser resolvido encaminhando mais logs do syslog para o journald (isso significa duplicação!)
  • Duplicação de logs. As mensagens do kernel são gravadas em dois arquivos. Isso não é problema, em geral o número de logs é pequeno e você prefere ter mais cópias dos logs do que nenhuma. Você também pode usar ferramentas rápidas, como grepno único arquivo de log ou no mais lento, mas mais sofisticado journalctl.

Há um item TODO para liberar logs com mais frequência, mas isso ainda não é confiável o suficiente:

diário: envie mensagens de marcador de vez em quando e sincronize imediatamente com fdatasync () posteriormente, para garantir sincronizações horárias garantidas.

Agora, esperamos que o systemd / journald tenha a opção de gravar os logs no disco, mas, enquanto isso, podemos combinar ferramentas para atingir a meta.

Lekensteyn
fonte
2

Existem duas atualizações:

  1. Agora, esperamos que o systemd / journald tenha a opção de gravar os logs no disco, mas, enquanto isso, podemos combinar ferramentas para atingir a meta.

Existe uma opção --sync:

Solicita ao daemon do diário que grave todos os dados ainda não gravados do diário no sistema de arquivos de backup e sincronize todos os diários. Esta chamada não retorna até que a operação de sincronização esteja concluída. Este comando garante que todas as mensagens de log gravadas antes de sua chamada sejam armazenadas com segurança no disco no momento em que ele retornar.

--syncdisponível desde v228:

O journalctl ganhou uma nova opção "--sync" que solicita que o daemon do diário grave todas as mensagens de log não escritas até o momento no disco e sincronize os arquivos, antes de retornar.

  1. Acontece que o journald (o daemon de log do systemd) não libera os logs periodicamente para o disco. Isso significa que seus logs estão sempre em risco a qualquer momento.

man journald.conf(5) diz:

SyncIntervalSec =

O tempo limite antes de sincronizar os arquivos do diário para o disco. Após a sincronização, os arquivos do diário são colocados no estado OFFLINE. Observe que a sincronização é feita incondicionalmente imediatamente após uma mensagem de log de prioridade CRIT, ALERT ou EMERG ter sido registrada. Portanto, essa configuração se aplica apenas a mensagens dos níveis ERR, WARNING, AVISO, INFO, DEBUG. O tempo limite padrão é de 5 minutos.

SyncIntervalSec=disponível desde v199:

O journald agora liberará explicitamente os arquivos do diário para o disco, o mais tardar 5 minutos após cada gravação. O arquivo também será marcado como offline até a próxima gravação. Isso deve aumentar a confiabilidade em caso de falha. O atraso da sincronização pode ser configurado via SyncIntervalSec = no journald.conf.

Veja também:

journald: despacha SIGTERM / SIGINT com baixa prioridade

Certifique-se de processar todos os dados de log em fila antes de sair, para não perdermos desnecessariamente as mensagens ao desligar.

Evgeny Vereshchagin
fonte
Boas informações, mas o "[journald] não libera periodicamente os logs para o disco" está em contradição com a opção SyncIntervalSec?
Lekensteyn
"[journald] não libera periodicamente os logs para o disco" é uma citação da resposta original. "SyncIntervalSec" é atualização.
precisa
Ah, eu não percebi que meu outro post foi citado. A formatação foi um pouco enganador
Lekensteyn