Journald 如何从内核获取启动消息?

Journald 如何从内核获取启动消息?

我相信 systemd-journald 在内核启动后开始记录,并且需要一些时间来设置存储和网络服务等系统。但是日志日志有像 dmesg 一样的内核消息,甚至它们有真实的时间戳,尽管内核没有机会在这么早的阶段从 RTC 恢复真实的日期/时间。 Journald 如何获取/显示内核日志消息?

答案1

Journald 从 读取/dev/kmsg,其中包含内核日志的环形缓冲区。 dmesg访问同一个缓冲区。在日志启动之前,我不相信“真实日期/时间”对于初始内核日志来说是超级准确的。

这是一个例子。dmesg和都journalctl显示与启动相同的偏移量

root@ubuntu:~# dmesg | head -n 1
[    0.000000] Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

root@ubuntu:~# journalctl --quiet -k -b --output short-monotonic | head -n 1
[    0.000000] ubuntu kernel: Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

然而,初始内核日志消息的实际时间相差超过 9 秒

root@ubuntu:~# dmesg --time-format iso | head -n 1
2022-11-02T20:29:35,000000+00:00 Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

root@ubuntu:~# journalctl --quiet -k -b --output short-iso-precise | head -n 1
2022-11-02T20:29:44.345820+0000 ubuntu kernel: Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

我怀疑初始内核日志的“实时”差异接近日志启动之前所花费的时间是否是巧合。

[    8.335415] systemd[1]: Started Journal Service.

Journald 启动后的“实时”距离dmesgjournalctl非常接近,但不完全相同。

这是另一个例子。写入新的内核日志。

root@ubuntu:~# echo "THE TIME IS NOW: $(date --iso-8601=ns)" | tee /dev/kmsg
THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

偏移量保持相同。

root@ubuntu:~# dmesg | tail -n 1
[ 6467.404507] THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

root@ubuntu:~# journalctl --quiet -b -k --output short-monotonic | tail -n 1
[ 6467.404507] ubuntu unknown: THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

“实时”还是略有不同。

root@ubuntu:~# dmesg --time-format iso | tail -n 1
2022-11-02T22:17:22,404507+00:00 THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

root@ubuntu:~# journalctl --quiet -b -k --output short-iso-precise | tail -n 1
2022-11-02T22:17:22.988718+0000 ubuntu unknown: THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

我相信dmesg正在努力计算时间journalctl使用时的偏移量__REALTIME_TIMESTAMP字段包含在日记中。我希望我能更加确定。

相关内容