Kernel

降低核心啟動日誌詳細級別

  • October 14, 2015

當我的核心啟動時,除了有用的重要資訊外,它還會列印很多調試資訊,例如

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

dmesg是否可以在全域範圍內降低引導日誌的詳細程度,以免syslog被這些無用的資訊淹沒?

我正在使用自編譯核心3.18

接受的解決方案

事實證明,將以下幾行/etc/rsyslog.conf程式碼為我解決了這個問題:

kern.debug   /dev/null
& ~

對於 syslog,您可以將以下行添加到/etc/syslog.conf

kern.info; kern.debug   /dev/null

它將丟棄核心 .info 和 .debug 消息(使用 loglevel=5 丟棄)

此外,dmesg可以與選項一起使用-n以顯示具有特定日誌級別的消息。

一些日誌由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

因此,請檢查您的核心配置並查找這些日誌的來源。然後你就會知道如何禁用它。

引用自:https://unix.stackexchange.com/questions/230267