我正在编写一个可以在用户空间中打印系统日志的Linux字符驱动程序。正如命令'dmesg'那样。 我已经了解到,使用'printk'打印的所有日志都将被发送到名为ring buffer的空间。所以我有问题:
答案 0 :(得分:43)
您要找的是/proc/kmsg
。这是内核环缓冲区!
答案 1 :(得分: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,
};
所以你如何看待输出:
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
所以现在它是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
所以你去了,pid 1743是rsyslogd,它将/ proc / kmsg的输出重定向到/ var / log / syslog和/var/log/kern.log等文件。