Como obter o log de inicialização do kernel com journalctl?

5

Eu tenho um systemd / journald em execução na minha placa. O sistema foi construído por meio de yocto ; systemd version é 216.

O que eu quero é um log de inicialização do kernel, que pode ser obtido com journalctl -k . Mas até onde eu vejo uma versão longa desta opção é --dmesg , o que me leva a pensar que isso é recuperado do buffer de anel do kernel. Obviamente, se o sistema for executado por dias, talvez eu não consiga essa informação. Meu entendimento está correto aqui?

A questão é agora existe uma opção para journald despejar esta informação logo após o sistema ser inicializado? Se não, é suficiente apenas chamar journalctl -k > dmesg.log como o último passo do processo de inicialização?

    
por UVV 14.11.2016 / 16:40

3 respostas

4

Obviously if the system runs for days I might no get this information. Is my understanding correct here?

Sim. Depende de quanta informação de log é gerada, mas eventualmente a informação de inicialização irá rolar para fora do começo do buffer de anel do kernel e do diário do systemd. Não é um guia sobre quanto tempo leva em sistemas de outra pessoa, mas eu tenho sistemas que têm uptimes nas centenas de dias cujos dados de log de inicialização há muito tempo rolaram para fora da parte superior do diário do systemd. Essa é uma das desvantagens de ter um fluxo de logs combinado gigante no qual tudo aconteça e os fãs voltem novamente.

Então pegue uma folha do FreeBSD e do NetBSD e seus derivados. Todos eles possuem serviços que são executados uma vez, no bootstrap logo após os sistemas de arquivos locais terem sido montados, o que simplesmente faz:

dmesg > /var/run/dmesg.boot

Assim, uma captura instantânea do log do kernel, como estava no bootstrap, está disponível em /var/run/dmesg.boot , mesmo que tenha sido rolada dos logs reais.

Você simplesmente precisa escrever um serviço systemd que faça o mesmo. Use o shell para redirecionamento,

ExecStart=/bin/sh -c "exec dmesg > /run/dmesg.boot"
ou use algo como redirfd de Laurent Bercot ou o conjunto de ferramentas do nosh fdredir
ExecStart=/usr/local/bin/fdredir --write 1 /run/dmesg.boot dmesg

Substitua journalctl -k se você quiser tirar uma foto instantânea do diário do systemd em vez de apenas o log do kernel, e faça disso um Type=oneshot service. Deseja obter multi-user.target ou torná-lo um DefaultDependencies=no de serviço desejado por basic.target . Observe que ele não precisa ser pedido após montagens de sistema de arquivos locais (por exemplo, local-fs.target ). Essa ordenação é necessária para o FreeBSD e OpenBSD porque /var/run poderia ser um sistema de arquivos em disco com eles. Em sistemas operacionais systemd /run é um "sistema de arquivos API" criado na inicialização antes de qualquer serviço.

(A abordagem que eu pessoalmente prefiro é não ter o fluxo de logs central gigante em primeiro lugar. Um serviço dedicado se alimenta do feed de log do kernel sozinho e registra em um diretório de log privado. leva muito mais tempo para chegar ao ponto em que as últimas informações de inicialização rola para fora do topo e também contém logs de inicialização de inicializações anteriores.

No entanto, isso é muito mais complexo para configurar em um mundo systemd do que um oneshot que grava um /run/dmesg.boot . É simples no mundo da família daemontools, no entanto. É um exercício trivial no uso de ferramentas como fifo-listen e klog-read ou socklog . Pipetar a saída através de um servidor de logs que grava em um diretório privado, rotacionado automaticamente e com rotação automática, é fornecido como padrão com um serviço gerenciado daemontools / runit / s6 / nosh / perp.)

    
por 14.11.2016 / 21:09
5

O Systemd armazena tudo em seu log. Que pelo menos no meu laptop em uso moderado é grande o suficiente para voltar a um ano atrás com as configurações padrão.

Se isso não for suficiente, você pode mexer com o journald.conf

Então, é apenas sobre usar journalctl -t kernel (que é semelhante a -k , exceto que ele também permite que você veja inicializações anteriores e use filtros)

    
por 27.05.2017 / 00:00
3

Os logs do kernel são copiados para o diário do systemd. Você não precisa fazer isso manualmente.

DESCRIPTION

systemd-journald is a system service that collects and stores logging data. It creates and maintains structured, indexed journals based on logging information that is received from a variety of sources:

· Kernel log messages, via kmsg

    
por 14.11.2016 / 16:59