关于syslogd和kmsgd服务

本文讲述了在Linux设备驱动开发中遇到的printk信息无法显示在终端的问题。通过研究syslogd和kmsgd服务,了解到内核消息通常被syslogd收集并记录在/var/log/messages中。文章提到了修改/etc/syslog.conf配置文件将内核消息定向到终端或/proc/kmsg,从而解决打印问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:ldd3,google,cu


最近在看linux设备驱动的开发,主要是以ldd3这本书为主。在看第四章的时候遇到利用printk打印信息到“终端”(这里终端为什么加引号,待会介绍。因为一开始是在图形界面的终端上做的实验。)的问题。以前记得写过几个内核的模块加载函数,只要insmod执行后,默认信息是打印到”显示器“上的,但是这回我在做模块加载的时候,并没有打印,试了调等级等等各种方法:

# echo 8 > /proc/sys/kernel/printk

总是不行,一直想不明白。

这个问题一直困惑了两天,我也一直在找答案,问了群里面的一个兄弟,他让我把linux启动等级调到3,也就是命令行模式试试。照做了,果然,printk的信息居然打印出来了。然后我就有了一个疑问,为什么不能再终端上打印呢?

syslogd和kmsgd这两个服务不仔细介绍了,google一下有一大堆关于他们的详细介绍和使用。这里推荐一篇个人认为还算不错的,网址是:

http://www.ibm.com/developerworks/cn/linux/security/l-ossec/part2/index.html

感谢文章的原作者。


printk是内核态的一个服务程序,而内核态和用户态本来是井水不犯河水的,幸亏有syslogd这个服务,把内核态的东西收集到用户态给我们使用,我们可以通过下面命令来查看printk在内核态打印的一些消息。

#cat /var/log/message

那么这样又有一个疑问,/var/log/message这个东西和syslogd有什么关系呢,为什么后者会把信息打印到前者这个文件,为什么不打印到/root/log/message?这里其实是syslogd这个服务的配置问题,打开这个文件/etc/syslog.conf,这是一个关于syslogd服务的配置文件,我在自己的CentOs5.4上面看到如下的信息:

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

红色部分,将内核的一些信息打印到/var/log/messages这个文件里面。仔细看这个文档,发现前面三句就是关于kernel信息打印到console,那么console是什么呢?直译过来就是计算机的现实器。好,赶紧把#去掉,然后保存重启服务

# /etc/rc.d/init.d/syslogd restart

Shutting down kernel logger:                          [  OK  ]
Shutting down system logger:                        [  OK  ]
Starting system logger:                                    [  OK  ]
Starting kernel logger:                                      [  OK  ]

但是这样,实验发现这样并没有让信息打印到终端上来。那么终端和这个console什么关系?

想起以前linux课程上老师的一句话:终端也是一个服务程序,是一个进程。

那上面的config文件怎么写?难道和进程的pid有关???思路一下子断了。直到看到这篇文章:http://blogold.chinaunix.net/u1/46715/showart_417577.html来自cu的。

这么说来,终端其实是一个/dev/pt*的一个设备,我在自己的CentOs5.4下面ls一下,看到这么个东西

#ls /dev/pt*


/dev/pts:
1

之后把配置文件的 /dev/console改成/dev/pts/1 。这样一试,内核信息果然打印在了我的终端上。无比开心。


PS:其实也可以通过读取/proc/kmsg来把内核信息反应在终端上,命令是:

#cat /proc/kmsg

这时终端应该是fork了一个cat的子进程,然后这个进程一直阻塞等待/proc/kmsg里面的信息,并读取。因为内核的信息首先是存在一个buffer中(这个buffer4k-1M),/proc/kmsg里面的内容也正是buffer里面的东西。


Jack.Hoo

2011.7.14

veryHot/Happy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值