如何在linux内核空间中读取环形缓冲区?

Yin*_* Xu 18 linux logging kernel circular-buffer linux-kernel

我正在编写一个Linux字符驱动程序,可以在用户空间中打印系统日志.正如命令'dmesg'那样.我已经了解到,使用'printk'打印的所有日志都将被发送到名为ring buffer的空间.所以我有问题:

  1. 内核空间里面有环形缓冲区吗?
  2. 如果是这样,我如何读取内核空间内的环形缓冲区?(我试过阅读dmesg.c的源代码.但它没有帮助.)

Pav*_*ath 43

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

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

  2. 如何读取环形缓冲区?以下是IBM Developerworks的精美插图

读取内核环缓冲区

dmesg将是你的第一个度假胜地!dmesg如何完成任务?致电syslog()!syslog如何完成它的工作?通过系统调用接口进而调用do_syslog().do_syslog()整理就像这样.

以下是一些资源,可以为您提供有关/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


Pet*_*eoh 5

这是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,
};
Run Code Online (Sandbox Code Playgroud)

所以你如何看待输出是这样的:

sudo tail -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
Run Code Online (Sandbox Code Playgroud)

所以现在它是pid 1743,让我们看看1743年开放的文件fd:

sudo 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
Run Code Online (Sandbox Code Playgroud)

所以你去了,pid 1743是rsyslogd,它将/ proc/kmsg的输出重定向到/ var/log/syslog和/var/log/kern.log等文件.