我们可以将许多参数传递给 printk:
printk (KERN_INFO "blahahaha");
printk (KERN_EMERG "bababa");
等等。这些标签是否与 syslog.conf 中的设施级别有关?KERN_EMERG 会打印到“kern.emerg”指定的设施吗?这两个实体是如何联系在一起的?
谢谢
我们可以将许多参数传递给 printk:
printk (KERN_INFO "blahahaha");
printk (KERN_EMERG "bababa");
等等。这些标签是否与 syslog.conf 中的设施级别有关?KERN_EMERG 会打印到“kern.emerg”指定的设施吗?这两个实体是如何联系在一起的?
谢谢
按问题顺序:
这些标签与在 中找到的设施级别有什么关系
syslog.conf吗?
是的。标签实际上是一对,KERN EMERG即KERN设施和EMERG级别——它们是大写的,因为它是一个预处理器宏,按照惯例,它是用大写的。Linux 内核只关心KERN设施,因此没有定义其他设施。
发生的情况是所有这些printk命令都记录到内部内核环形缓冲区。根据您的内核设置,此消息可能会或可能不会复制到控制台(可能是屏幕或串行终端)。
KERN_EMERG 会打印到“kern.emerg”指定的设施吗?
假设您的意思是登录到匹配的文件kern.emerg,那么是的。syslog.conf与此匹配的条目示例是kern.*, kern.emerg, *.emerg。该级别的消息emerg被认为是致命的,即发生了非常糟糕的事情。
来自该级别内核的消息可能不会最终出现在 syslog 文件中,因为该错误可能会阻止将数据写入硬盘驱动器。
这两个实体是如何联系在一起的?
有一个辅助守护程序,通常称为klogd. 它从内核中的环形缓冲区获取输出,默认情况下将它们传递到syslogd其中,根据syslog.conf文件记录它们。
总而言之:
printk将消息放入ring buffer. 被ring buffer读取,klogd将其转发到syslogd。Syslogd将此数据记录到syslogd.conf文件指定的目的地。