printk()不会在/ var / log / messages中打印

时间:2013-05-09 15:25:58

标签: linux linux-kernel kernel-module kernel

我的操作系统Ubuntu 12.04。我写了这个内核模块,我使用insmod和rmmod命令,但/ var / log消息中没有任何内容。我该如何解决这个问题?

/*  
*  hello-1.c - The simplest kernel module.
*/
#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */

int init_module(void)
{
   printk(KERN_INFO "Hello world 1.\n");

    /* 
    * A non 0 return means init_module failed; module can't be loaded. 
    */
    return 0;
 }

 void cleanup_module(void)
 {
   printk(KERN_INFO "Goodbye world 1.\n");
 }

5 个答案:

答案 0 :(得分:1)

检查 syslog 守护程序进程是否正在运行,因为这是将来自内核环/日志消息缓冲区的printk消息复制到 / var / log / messages 的进程,如果我我是对的。可以使用 dmesg 实用程序/命令查看printk消息,或者将消息放在/ var / log / messages中。如果设置了正确的loglevel,则printk消息将立即显示在控制台上,无需使用dmesg或无需检入/ var / log / messages。 printk调试消息也可以是 / var / log / syslog

的一部分

答案 1 :(得分:0)

现代Linux发行版不再使用rsyslog(或任何其他syslog守护程序)。它们依赖于作为systemd一部分的journald,因此缺少/ var / log / messages文件,您必须使用journalctl命令来读取系统日志。

答案 2 :(得分:0)

首先,您应该使用此命令检查模块是否正确加载

lsmod | grep "hello-1" //hello-1 is the name of your module

因为您编写了一个内核模块,它会打印一些消息。来自内核及其模块的消息可以在/ var / log / syslog中找到,或者您可以使用dmesg命令查看这些消息。 当您的模块打印&#34; Hello World 1。&#34;时,您应该使用以下命令查看模块中的消息。

dmesg | grep "Hello World 1." 

答案 3 :(得分:0)

在/etc/syslog.conf中查找* .info ...行。这些似乎可以控制通过printk记录的内容。

*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none          -/var/log/messages

我发现/ proc / sys / kernel / printk只是真正控制了控制台日志记录级别,而不是记录到文件。我想检查syslog也在运行;)我们有完全相同的问题,KERN_INFO不会记录文件,这就解决了。 HTH

答案 4 :(得分:0)

我试图通过键入以下命令来打印内核缓冲区: dmesg
这将打印写入printk

中的数据