diminuir o nível de detalhamento do registro de inicialização do kernel

11

Quando meu kernel inicializa, além das informações importantes e úteis, ele imprime muitas informações de depuração, como

....
kernel: [0.00000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
kernel: [0.00000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
kernel: [0.00000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
...
kernel: [0.00000] MTRR variable ranges enabled:
kernel: [0.00000]   0 base 0000000000 mask 7E00000000 write-back
...
kernel: [0.00000] init_memory_mapping: [mem 0x00100000-0xcf414fff]
kernel: [0.00000]  [mem 0x00100000-0x001fffff] page 4k
kernel: [0.00000]  [mem 0x00200000-0xcf3fffff] page 2M
kernel: [0.00000]  [mem 0xcf400000-0xcf414fff] page 4k
....
kernel: [0.00000] ACPI: XSDT 0xD8FEB088 0008C (v01 DELL CBX3 01072009 AMI 10013)
kernel: [0.00000] ACPI: FACP 0xD8FFC9F8 0010C (v05 DELL CBX3 01072009 AMI 10013)
....
kernel: [0.00000] Early memory node ranges
kernel: [0.00000]   node   0: [mem 0x00001000-0x0009cfff]
kernel: [0.00000]   node   0: [mem 0x00100000-0xcf414fff]
kernel: [0.00000]   node   0: [mem 0xcf41c000-0xcfdfcfff]
....
kernel: [0.00000] ACPI: Local APIC address 0xfee00000
kernel: [0.00000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
kernel: [0.00000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)

e muito mais.

Eu não vejo como isso pode ser útil para ninguém além de um desenvolvedor / depurador de kernel.

Eu descobri que posso me livrar disso usando loglevel=5 como parâmetro de inicialização. Os registros de depuração não são mais impressos no terminal, mas ainda estão em dmesg e em syslog .

É possível diminuir o detalhamento do log de inicialização globalmente, para que dmesg e syslog não sejam inundados por essas informações inúteis?

Estou usando o kernel auto-compilado 3.18

SOLUÇÃO ACEITADA

Acontece que colocar as seguintes linhas em /etc/rsyslog.conf resolveu o problema para mim:

kern.debug   /dev/null
& ~
    
por Martin Vegter 17.09.2015 / 13:23

3 respostas

5

Para syslog Você pode adicionar a seguinte linha a /etc/syslog.conf :

kern.info; kern.debug   /dev/null

Ele descartará as mensagens kernel .info e .debug (que são descartadas com loglevel = 5)

Além disso, dmesg pode ser usado com a opção -n para mostrar mensagens com determinado nível de log.

    
por 21.09.2015 / 17:25
4

Alguns dos logs são impressos por printk () , que você não pode desativá-lo. E alguns são impressos por pr_debug () , o qual pode ser desligado depende da configuração do kernel. O comportamento de pr_debug () é controlado pelo recurso de depuração dinâmica. Se CONFIG_DYNAMIC_DEBUG estiver definido, todas as chamadas pr_debug () poderão ser ativadas / desativadas dinamicamente por local de chamada. O detalhe da depuração dinâmica é aqui . Se CONFIG_DYNAMIC_DEBUG não estiver definido, mas DEBUG estiver definido no arquivo de origem, pr_debug () funcionará como printk () . Se ambos não estiverem definidos, o pr_debug não fará nada.

Aqui está a definição no kernel:

#include <linux/dynamic_debug.h>

/* If you are writing a driver, please use dev_dbg instead */
#if defined(CONFIG_DYNAMIC_DEBUG)
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
#define pr_debug(fmt, ...) \
    dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
#define pr_debug(fmt, ...) \
    printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_debug(fmt, ...) \
    no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif

Portanto, verifique a configuração do seu kernel e descubra de onde esses logs vêm. Então você saberá como desativá-lo.

    
por 21.09.2015 / 18:40
0

Além de definir o loglevel do KCL, você também pode ajustar os kernel.printk sysctl para que o nível máximo reflita o que você quer e persista durante a inicialização.

Quanto a este esclarecimento adicional no comentário:

the problem is, that syslog and dmesg are flooded with useless debugging logs, and thereby making real warnings and errors easier to overlook.

Eu usaria apenas logrotate em uma tarefa do cron para remover os arquivos do caminho após reboot :

root ~ $ crontab -l
@reboot /usr/sbin/logrotate --force /root/rotate-boot-messages
@reboot /bin/dmesg -c

root ~ $ cat /root/rotate-boot-messages
"/var/log/dmesg" {
  copytruncate
  notifempty
  missingok
  dateext
}
"/var/log/syslog" {
  copytruncate
  notifempty
  missingok
  dateext
}

Então você está começando de novo, por assim dizer, com dados de depuração limitados sendo descarregados nos registros.

    
por 21.09.2015 / 19:13