内核环形缓冲区相对于 rsyslog 位于何处?

9 logs syslog dmesg

是否rsyslog只是在内核环缓冲区之上的抽象层?或者内核环缓冲区是它自己的实体,并且其rsyslog交互与任何其他“应用程序”的交互一样?

gol*_*cks 6

尽管各种文档(包括man dmesg)将其称为“内核环形缓冲区”,但最好将其称为内核日志缓冲区,因为“环形缓冲区”是一个通用术语,我相信内核也使用环形缓冲区各种完全不相关的东西的缓冲区。“printk 缓冲区”也很合适,在用于写入它的内核空间函数之后。

无论如何,它驻留在内核空间中,并且通过 提供了一个读接口/proc/kmsg和一个读写接口/dev/kmsg。因此,如果您以 root 身份执行以下操作:

echo "Hello Kernel!" > /dev/ksmg
Run Code Online (Sandbox Code Playgroud)

如果你那时你会看到它cat /dev/ksmg(你可能不会在任何日志中看到它,但是 - 请参阅下面的 Matthew Phipps 评论以了解可能的原因)。这是原始输出,与您从dmesg日志文件中看到的内容或在日志文件中看到的内容并不完全相同。内核源代码中提供了一些关于此的文档。如果 (r)syslog 正在运行,建议从/proc/kmsg(与 不同/dev/ksmg)读取。

Rsyslog 是linux 上常用的许多syslog实现之一。这些是用户态应用程序,它们/proc/ksmg通过套接字从其他用户态进程获取内核消息和消息/dev/log

  • 我要指出 rsyslog 默认关闭 $KLogPermitNonKernelFacility,这就是为什么来自 /proc/kmsg 的非内核消息将被 rsyslog 忽略的原因,除非您打开该选项。这实际上会变得非常混乱,因为例如 Upstart 使用非内核工具登录到 /proc/kmsg。 (2认同)