我正在尝试在 dmesg 输出中写入一些自定义消息。我试过:
logger "Hello"
但这不起作用。它退出时没有错误,但是输出中没有出现“Hello”:
dmesg
我使用的是 Fedora 9,似乎没有 syslogd/klogd 守护进程在运行。但是,我的所有内核消息都成功写入了 dmesg 缓冲区。
任何想法?
答案1
dmesg
显示内核缓冲区中的内容,而logger
是syslogd
。我认为,如果您想将内容打印到内核缓冲区中,则需要创建一个使用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
答案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 的回答,这里是一个快速教程,展示了如何做到这一点。