首页 理论教育 Linux内核日志缓冲机制及注入消息详解

Linux内核日志缓冲机制及注入消息详解

时间:2023-11-22 理论教育 版权反馈
【摘要】:内核函数printk()将接收到的参数存储在这个环形缓冲之中。环形缓冲中的部分消息会输出到控制台。syslog会被阻塞,直到内核日志缓冲中有内容,它最多读len个字节,读完成后,读过的内容会从内核日志缓冲中清除。syslog只做一件事:清内核日志缓冲。当把console_loglevel设置成8或8以上的值时,所有的内核日志消息都会被输出到控制台。log_store将日志消息存入日志缓冲之中。另一个来源是用户态空间,这很有趣,用户态应用可以通过写入/dev/kmsg来向内核日志缓冲注入消息。

Linux内核日志缓冲机制及注入消息详解

Linux内核使用一个环形缓冲(cyclic buffer或ring buffer)。内核函数printk()将接收到的参数存储在这个环形缓冲之中。环形缓冲中的部分消息会输出到控制台。syslog的作用是读出环形缓冲中的内容,清除环形缓冲内容和配置哪些消息会从环形缓冲输出到控制台。

syslog的三个参数不会都用到,在第一个参数为某些值时,第二个或第三个参数会被忽略,以下对被忽略的参数用“dummy”表示。syslog(2,buf,len)会被阻塞,直到内核日志缓冲中有内容,它最多读len个字节,读完成后,读过的内容会从内核日志缓冲中清除。syslog(3,buf,len)读内核日志缓冲最后len个字节。syslog(4,buf,len)比syslog(3,buf,len)多做一件事:清内核日志缓冲。syslog(5,dummy,dummy)只做一件事:清内核日志缓冲。syslog(6,dummy,dummy),syslog(7,dummy,dummy),syslog(8,dummy,level)都在设置变量loglevel的值,syslog(6,dummy, dummy)将loglevel设置为最小值,结果就是没有消息能被输出到控制台,syslog(7,dummy, dummy)将loglevel设置为缺省值,恢复了消息输出到控制台的功能。

内核日志函数的处理逻辑是这样的,如果消息的level小于变量console_loglevel,这个消息就会被输出到控制台。消息的level值取值范围是0~7:

所以当console_loglevel被设置为1,就只有最紧急的消息会被输出到控制台。console_loglevel的缺省值是7,设置为缺省值的意思是除debug消息之外的消息都会被输出到控制台。当把console_loglevel设置成8或8以上的值时,所有的内核日志消息都会被输出到控制台。(www.xing528.com)

内核函数printk是内核日志消息的主要来源。printk的实现很简单,调用了vprintk_emit,vprintk_ emit的实现复杂一些,核心的操作是调用了log_store。log_store将日志消息存入日志缓冲之中。

printk是内核日志消息的主要来源,但不是唯一来源。另一个来源是用户态空间,这很有趣,用户态应用可以通过写入/dev/kmsg来向内核日志缓冲注入消息。在打开/dev/kmsg时,内核代码有权限检查,要求有cap_syslog或者cap_sys_admin能力,在内核强制访问控制模块例如SELinux中,还有其他检查。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈