rsyslogd 有时不会将 dmesg 的初始位写入 /var/log/syslog

rsyslogd 有时不会将 dmesg 的初始位写入 /var/log/syslog

我有一台运行 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,它会跟踪感兴趣的文件何时被访问。长话短说,我rsysloglogd他们都启用了,他们都想阅读/proc/kmsg。然而,正如@JamesThomasMoon 指出的那样,/proc/kmsg在有人阅读后被清除。因此,根据是否rsyslogdlogd到达/proc/kmsg,我的系统有时会丢失系统日志。

以下是我为解决这个问题所采取的大致步骤......

  1. 像平常一样auditd使用进行安装。apt-get
  2. 添加一条auditd规则proc_kmsg,名为“每当有人阅读时/proc/kmsg,请记下来”
$ cat /etc/audit/rules.d/foobar.rule
-w /proc/kmsg     -p r    -k proc_kmsg
  1. 加载添加的规则使其生效。
$ augenrules --load
  1. 重新启动系统。
  2. 阅读auditd日志以查看尝试访问的内容/proc/kmsg
$ ausearch -k proc_kmsg --interpret
  1. 就我而言,我注意到有一行指示/usr/sbin/rsyslogdattempts to read /proc/kmsg,还有另一行指示/sbin/logdis also attempts to read /proc/kmsg。我从来没有打算启用rsyslogdlogd,所以我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 

相关内容