2012-03-02 72 views
15

我正在写一个Linux字符驱动程序,它可以在用户空间中打印系统日志。就像命令'dmesg'一样。 我知道我们用'printk'打印的所有日志都会被发送到名为环形缓冲区的空间。所以我有这样的问题:如何在Linux内核空间读取环形缓冲区?

  1. 是在内核空间内的环形缓冲区?
  2. 如果是这样,我怎样才能读取内核空间内的环形缓冲区? (我尝试读取dmesg.c的源代码,但它没有帮助。)

回答

37

你在找什么是/proc/kmsg。这是内核环形缓冲区!

  1. 是的,这是在内核空间。任何尝试读取它的进程都应具有超级用户权限才能读取它!

  2. 如何读取环形缓冲区?下面是从IBM developerWorks中国

Reading the Kernel Ring Buffer

dmesg一个美丽的插图会是你的第一个度假胜地! dmesg如何完成任务?通过致电syslog()syslog如何完成工作?通过系统调用接口,然后调用do_syslog()do_syslog()完成整理行为,如this

这里有一些更多的资源,让你更多关于/proc/kmsg和内核日志在中普通

  1. http://www.makelinux.net/ldd3/chp-4-sect-2

  2. http://www.ibm.com/developerworks/linux/library/l-kernel-logging-apis/index.html

  3. http://oguzhanozmen.blogspot.in/2008/09/kernel-log-buffering-printk-syslog-ng.html

+0

令人惊叹!非常专业和有用的答案!你看,我只是Linux内核编程的新成员,我无法感谢你的帮助。谢谢你,兄弟。 – 2012-03-03 05:43:34

+0

很高兴我能帮助你:)欢迎来到SO! – 2012-03-03 06:11:03

1

Pavan很好的答案(教给我很多):

不同的发行版可能会将/ proc/kmsg的输出重定向到任何他们喜欢的物理日志文件或虚拟设备(/ dev/xxx)。但“的/ proc/kmsg”是核心日志的原始来源,因为内核实现了环行缓冲器动作里面FS的/ proc/kmsg.c:

static const struct file_operations proc_kmsg_operations = { 
     .read   = kmsg_read, 
     .poll   = kmsg_poll, 
     .open   = kmsg_open, 
     .release  = kmsg_release, 
     .llseek   = generic_file_llseek, 
}; 

所以你怎么看到的输出是这样的:

须藤尾-f的/ proc/kmsg

但是,你只能看到生成后,您必须发出此命令的所有消息 - 在环形缓冲区之前的所有消息将不被打印出来。因此要查看物理文件输出,可以搜索“/ proc/kmsg”的用户:

sudo lsof | grep proc。kmsg

而且我的机器表示这样的:

rsyslogd 1743    syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 
in:imuxso 1743 1755   syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 
in:imklog 1743 1756   syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 
rs:main 1743 1757   syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 

所以现在是PID 1743,让我们来看看这些文件FD由1743打开:

须藤LS -al的/ proc/1743/FD

lrwx------ 1 root root 64 Dec 11 08:36 0 -> socket:[14472] 
l-wx------ 1 root root 64 Dec 11 08:36 1 -> /var/log/syslog 
l-wx------ 1 root root 64 Dec 11 08:36 2 -> /var/log/kern.log 
lr-x------ 1 root root 64 Dec 11 08:36 3 -> /proc/kmsg 
l-wx------ 1 root root 64 Dec 11 08:36 4 -> /var/log/auth.log 

所以你去那里,PID 1743是rsyslogd,和它的/ proc/kmsg输出重定向到像在/ var/log/syslog的和/var/log/kern.log等

文件10