我相信 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 启动后的“实时”距离dmesg
和journalctl
非常接近,但不完全相同。
这是另一个例子。写入新的内核日志。
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
字段包含在日记中。我希望我能更加确定。