如何添加可用 dmesg 读取的消息?

如何添加可用 dmesg 读取的消息?

我正在尝试在 dmesg 输出中写入一些自定义消息。我试过:

logger "Hello"

但这不起作用。它退出时没有错误,但是输出中没有出现“Hello”:

dmesg

我使用的是 Fedora 9,似乎没有 syslogd/klogd 守护进程在运行。但是,我的所有内核消息都成功写入了 dmesg 缓冲区。

任何想法?

答案1

dmesg显示内核缓冲区中的内容,而loggersyslogd。我认为,如果您想将内容打印到内核缓冲区中,则需要创建一个使用printk()内核函数的驱动程序。如果您只想将其放入 中/var/log/messages,那么使用“正常”设置,我认为您所做的logger已经很好了。

最基本的驱动程序示例如下printk()

你好ç:

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    printk(KERN_INFO "Hello world\n");
    return 0;
}

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

}

生成文件:

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

然后:

$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
 [7089996.746366] Hello world

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121了解更多...

答案2

您可以以 root 身份写入/dev/kmsg以打印到内核消息缓冲区:

 fixnum:~# echo Some message > /dev/kmsg
 fixnum:~# dmesg | tail -n1
 [28078118.692242] Some message

我已经在我的服务器和嵌入式 Linux 设备上测试过它,并且它在两者上都有效,所以我假设它几乎在任何地方都能有效。

答案3

根据上述 Kyle 的模块:


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)
{
        char string[256];
        count = count < 255 ? count : 255;

        if(copy_from_user(string, buffer, count))
                return -EFAULT;

        string[count] = '\0';        
        printk(string);
        return count;
}


static int __init printk_init(void)
{
        struct proc_dir_entry *pk_file;

        pk_file = create_proc_entry("printk", 0222, NULL);
        if(pk_file == NULL)
                return -ENOMEM;

        pk_file->write_proc = pk_write;
        pk_file->owner = THIS_MODULE;

        return 0;
}

static void __exit printk_cleanup(void)
{
        remove_proc_entry("printk", NULL);
}

module_init(printk_init);
module_exit(printk_cleanup);
MODULE_LICENSE("GPL");

从用户空间执行 printk:

echo "Hello" > /proc/printk

答案4

根据 Kyle 的回答,这里是一个快速教程,展示了如何做到这一点。

相关内容