降低内核启动日志的详细程度


9

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

....
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
& ~

您要解决的实际问题是什么?日志文件太大?提出这样的问题,因为我认为将此信息保存在日志中没有问题,日志通常不会被人类读取,并且其大小增加很小。
汉尼斯,2015年

@Hennes -问题是,syslogdmesg充斥着无用的调试日志,从而使真正的警告和错误容易被人忽视。此外,dmesgsyslog应通过人来阅读(即管理员)。那是他们的全部目的。
Martin Vegter 2015年

关注泛滥的重要信息是一个好主意。
Hennes

1
您可能对超级用户Stack-Exchange网站上的这个问题感兴趣:如何阻止内核消息泛滥我的控制台?
perror

Answers:


5

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

kern.info; kern.debug   /dev/null

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

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


4

一些日志由printk()打印,您无法将其关闭。有些是由pr_debug()打印的,取决于内核的配置,可以将其关闭。pr_debug()的行为由动态调试功能控制。如果设置了CONFIG_DYNAMIC_DEBUG,则可以对每个呼叫站点动态启用/禁用所有pr_debug()调用。动态调试的细节在这里。如果未设置CONFIG_DYNAMIC_DEBUG,但在源文件中定义了DEBUG,则pr_debug()的作用类似于printk()。如果两者均未定义,则pr_debug将不执行任何操作。

这是内核中的定义:

#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

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



0

除了loglevel通过KCL 设置之外,还可以调整kernel.printksysctl,以使最大级别反映您想要的内容,并在整个引导过程中保持不变。

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

问题是,syslog和dmesg充满了无用的调试日志,从而使实际的警告和错误更容易被忽略。

我只会logrotate在cron作业中使用,以在重新启动后将文件移开:

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
}

可以这么说,然后从有限的调试数据转储到日志中开始全新的学习。


很抱歉,但建议logrotate完全没有意义。我的问题不是我的日志文件太大,而且磁盘空间不足。相反,问题是,这些日志文件中的调试信息使有用的信息难以访问。
Martin Vegter

对。使用logrotate可以移开所有废话的日志,以便在启动后有一个空的日志文件,这样您就可以查看重要内容。我在这里使用logrotate并不规范:如果需要,请使用mv。关键是要在启动后尽快清除垃圾。
主教

除非您的意思是这些消息掩盖了启动时间问题?在这种情况下,公认的解决方案似乎是理想的。
主教
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.