我有一台运行 Ubuntu 16.04.7 LTS 的 Linux 计算机,它使用rsyslogd
.我的理解rsyslogd
是,它将内容从内核环形缓冲区(即dmesg
)旋转到磁盘文件(即/var/log/syslog
)。
因此,名义上/var/log/syslog
,我希望在 中看到一条“开始”消息,然后是rsyslogd
我稍后可以在 中检索的内核消息dmesg
。请注意第一个内核消息如何在相对 0.0000 秒的时间开始。
$ cat /var/log/syslog
...
rsyslogd: [origin software="rsyslogd" swVersion="8.16.0" x-pid="4970" x-info="http://www.rsyslog.com"] start
...
kernel: [ 0.000000] Booting Linux on physical CPU 0x0
有时,当我查看 时/var/log/syslog
,我会注意到第一个内核消息晚于 40 秒以上才开始:
$ cat /var/log/syslog
...
rsyslogd: [origin software="rsyslogd" swVersion="8.16.0" x-pid="4970" x-info="http://www.rsyslog.com"] start
...
kernel: [ 45.829155] IRQ6 no longer affine to CPU4
如果我立即查看dmesg
,我会发现丢失的“在物理 CPU 0x0 上启动 Linux”消息。
$ dmesg | head -n1
kernel: [ 0.000000] Booting Linux on physical CPU 0x0
这一切让我觉得对于一些原因,rsyslogd
偶尔会遇到竞争条件,其中它不记录内核消息的第一位。但我不知道如何解决这个问题。我很想得到一些关于如何深入解决这个问题的指导。
答案1
我能够在 的帮助下解决这个问题auditd
,它会跟踪感兴趣的文件何时被访问。长话短说,我rsyslog
和logd
他们都启用了,他们都想阅读/proc/kmsg
。然而,正如@JamesThomasMoon 指出的那样,/proc/kmsg
在有人阅读后被清除。因此,根据是否rsyslogd
或logd
到达/proc/kmsg
,我的系统有时会丢失系统日志。
以下是我为解决这个问题所采取的大致步骤......
- 像平常一样
auditd
使用进行安装。apt-get
- 添加一条
auditd
规则proc_kmsg
,名为“每当有人阅读时/proc/kmsg
,请记下来”。
$ cat /etc/audit/rules.d/foobar.rule
-w /proc/kmsg -p r -k proc_kmsg
- 加载添加的规则使其生效。
$ augenrules --load
- 重新启动系统。
- 阅读
auditd
日志以查看尝试访问的内容/proc/kmsg
。
$ ausearch -k proc_kmsg --interpret
- 就我而言,我注意到有一行指示
/usr/sbin/rsyslogd
attempts to read/proc/kmsg
,还有另一行指示/sbin/logd
is also attempts to read/proc/kmsg
。我从来没有打算启用rsyslogd
和logd
,所以我logd
相应地禁用了,瞧。
type=PROCTITLE msg=audit(05/30/23 18:10:50.266:28) : proctitle=/usr/sbin/rsyslogd -n
和
type=PROCTITLE msg=audit(05/30/23 18:10:50.846:32) : proctitle=/sbin/logd