降低内核启动日志详细级别

降低内核启动日志详细级别

当我的内核启动时,除了有用的重要信息之外,它还会打印大量调试信息,例如

....
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)

还有更多。

我不知道这对内核开发人员/调试人员以外的任何人有什么用处。

loglevel=5我发现,我可以通过使用作为启动参数来摆脱这些。调试日志不再打印在终端上,但仍然在dmesg和 中syslog

是否可以全局降低启动日志的详细程度,以便dmesgsyslog不会被这些无用信息淹没?

我使用的是自编译内核3.18

可接受的解决方案

事实证明,添加以下几行可以/etc/rsyslog.conf为我解决问题:

kern.debug   /dev/null
& ~

答案1

对于系统日志,您可以添加以下行/etc/syslog.conf

kern.info; kern.debug   /dev/null

它将丢弃内核 .info 和 .debug 消息(使用 loglevel=5 丢弃)

此外,dmesg还可以与选项一起使用-n来显示具有特定日志级别的消息。

答案2

一些日志是由打印的打印k()你无法将其关闭。还有一些是打印出来的pr_debug()这可能会被关闭取决于内核的配置。的行为pr_debug()由动态调试功能控制。如果配置_动态_调试设置完毕,那么所有pr_debug()可以根据呼叫站点动态启用/禁用呼叫。动态调试的细节是这里。如果配置_动态_调试未设置,但是调试在源文件中定义,pr_debug()作品就像打印k()。如果两者都没有定义,pr_调试不会做任何事。

这是内核中的定义:

#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

因此,请检查您的内核配置并查找这些日志的来源。然后你就会知道如何禁用它。

答案3

除了从 KCL 设置之外loglevel,您还可以调整kernel.printk系统控制以便最大级别反映您想要的并在启动过程中保持不变。

关于评论中的进一步澄清:

问题是,syslog 和 dmesg 充斥着无用的调试日志,从而使真正的警告和错误更容易被忽视。

我只是在 cron 作业中使用logrotate,以便在之后将文件移开重启:

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
}

然后,您将重新开始,可以说,将有限的调试数据转储到日志中。

相关内容