Linux内核default_console_loglevel的意义

Linux内核default_console_loglevel的意义

default_console_loglevel在Linux中有什么意义?我通常将其描述为 的默认值console_loglevel。然而,这意味着什么我还没有在任何地方看到解释。

此外,在我以及我检查过的大多数其他系统上,四个日志变量的值是

 [root@localhost printk]# cat /proc/sys/kernel/printk
4   4   1   7

由于我没有更改任何内容,console_loglevel(4) 应该等于default_consolle loglevel(7),但事实并非如此。那么 的用途/意义到底是什么default_console_loglevel

答案1

简短的回答:您要么loglevel=4在内核命令行中进行了设置(使用 进行检查cat /proc/cmdline),要么有类似执行的 init 脚本echo 4 > /proc/sys/kernel/printk(或等效项)之类的东西。

在这两种情况下,default_console_loglevel都会被覆盖。


长答案:

当您读取 时/proc/sys/kernel/printk,会返回四个数字。这些是在内核中定义的打印k.hint console_printk[4]作为数组中的元素已初始化在编译时(在打印k.c),但是这个数组可以在运行时修改。

这些值是:

  • console_loglevel(或者console_printk[0])。

  • default_message_loglevel(或者console_printk[1])。

  • minimum_console_loglevel(或者console_printk[2])。

  • default_console_loglevel(或者console_printk[3])。

console_loglevel( console_printk[0]) 是最重要的:它是当前的控制台消息优先级的值。

这意味着,在任何时间点printk都会在内核代码中调用(这也适用于pr_warnpr_info, ETC。),在运行时比较相应的优先级,如果它严格低于当前的优先级console_loglevel,则会将其打印到控制台。例如,如果设置为 5(即KERN_警告),只有值为 4 ( KERN_ERR) 或更低的优先级才会直接打印到控制台。

这是唯一需要修改的值,因此当您使用 eg 写入时,echo 5 > /proc/sys/kernel/printk您将设置console_loglevel为 5。

console_loglevel编译时初始化为,与(or )CONSOLE_LOGLEVEL_DEFAULT完全相同。因此是启动时的默认值。这是通过内核编译时配置 (Kconfig) 设置的,它定义了.default_console_loglevelconsole_printk[3]default_console_loglevelconsole_loglevelCONFIG_CONSOLE_LOGLEVEL_DEFAULT

为了使这个运行时可配置(因此不需要重新编译内核),有另一种机制来设置这个启动时默认值:如果(其中是数字)作为内核命令行的一部分传递,则初始化为。请注意,它永远不会被修改,因此,在这种情况下,它只是被默默地忽略和覆盖。loglevel=xxconsole_loglevelxdefault_console_loglevel

为了完整起见,其他两个值是:

  • default_message_loglevel(或):这是未指定优先级的命令console_printk[1]的默认值。printk这是通过 Kconfig ( CONFIG_MESSAGE_LOGLEVEL_DEFAULT) 设置的。编译后不能修改。

  • minimum_console_loglevel(或console_printk[2]):这是最小优先级值。它被硬编码为 1 并且无法修改。


注意:这是对一个四年来无人回答的问题的回答,这可能不再对问题作者有用,但这是我的第一个谷歌搜索结果,所以这希望对其他人有用。

相关内容