web-dev-qa-db-ja.com

カーネルブートログの詳細レベルを下げる

カーネルが起動すると、有用な重要な情報とは別に、次のような多くのデバッグ情報が出力されます。

....
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を使用すると、これらを取り除くことができることがわかりました。デバッグログは端末に出力されなくなりましたが、dmesgsyslogに残っています。

ブートログの冗長性をグローバルに減らして、dmesgsyslogがこの役に立たない情報で溢れないようにすることは可能ですか?

自己コンパイルされたカーネルを使用しています3.18

ACEPTED SOLUTION

/etc/rsyslog.confに次の行を入力すると、問題が解決しました。

kern.debug   /dev/null
& ~
9
Martin Vegter

Syslogの場合/etc/syslog.confに次の行を追加できます。

kern.info; kern.debug   /dev/null

カーネルの.infoおよび.debugメッセージを破棄します(これらはloglevel = 5で破棄されます)

また、dmesgをオプション-nとともに使用して、特定のログレベルのメッセージを表示することもできます。

5
Marqin

一部のログはprintk()によって出力されますが、オフにすることはできませんでした。そして、一部はpr_debug()によって出力されますが、オフにすることもできますが、カーネルの構成によって異なります。 pr_debug()の動作は、動的デバッグ機能によって制御されます。 CONFIG_DYNAMIC_DEBUGが設定されている場合、すべてのpr_debug()呼び出しを動的に行うことができますコールサイトごとに有効/無効。動的デバッグの詳細は here です。 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

そのため、カーネル構成を確認して、これらのログがどこから来ているかを確認してください。次に、それを無効にする方法を知っています。

4
Chris Tsui

KCLからloglevelを設定する以外に、 kernel.printk sysctl 最大レベルが必要なものを反映し、起動後も持続するようにします。

コメントでのこのさらなる明確化について:

問題は、syslogとdmesgが役に立たないデバッグログで溢れ、それによって実際の警告とエラーが見落とされやすくなることです。

Cronジョブでlogrotateを使用して、ファイルを邪魔にならない場所に移動します 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
}

次に、いわば、ログへのデバッグデータのダンプを制限して、新たに開始します。

0
bishop