在查看另一台机器上的一些归档日志文件时,我注意到一些日志条目具有不同的__BOOT_ID
值,它们之间的时间间隔非常窄。例如,相隔几毫秒的日志条目将具有不同的__BOOT_ID
值。这应该是不可能的,因为机器无法在这么小的时间间隔内重新启动。
当我运行时,journalctl -o verbose --directory <dir path> | grep -B 30 -A 30 -- "-- Reboot --"
我可以看到引用以下真实示例,其中两个不同的引导 ID 值用于相隔 10 毫秒的日志事件。
Wed 2019-11-13 21:35:58.469925 ...
_TRANSPORT=kernel
PRIORITY=6
SYSLOG_FACILITY=0
SYSLOG_IDENTIFIER=kernel
_BOOT_ID=fec227a60ef24474aacd023d6c02733f
...
...
...
MESSAGE=spi1.0: ttyMAX1 at I/O 0x20 (irq = 30, base_baud = 3000000) is a MAX3109
-- Reboot --
Wed 2019-11-13 21:35:58.470352 ...
_SOURCE_MONOTONIC_TIMESTAMP=0
_TRANSPORT=kernel
PRIORITY=6
SYSLOG_FACILITY=0
SYSLOG_IDENTIFIER=kernel
MESSAGE=Booting Linux on physical CPU 0x0
_BOOT_ID=21b95aabab034009a19d1b7deac80327
...
...
...
我试图搜索可能导致引导 ID 像那样快速更改但没有任何成功的原因。查看版本 ( v243
) 的 systemd 源代码表明,sd_id128_get_boot()
这似乎是用于读取引导 ID 的函数,它只是从文件中读取内核生成的值。
if (sd_id128_is_null(saved_boot_id)) {
r = id128_read("/proc/sys/kernel/random/boot_id", ID128_UUID, &saved_boot_id);
if (r < 0)
return r;
}
*ret = saved_boot_id;
return 0;
最终结果是显示在日志中的重新启动列表,这些重新启动可能毕竟不是重新启动。有趣的是journalctl --list-boots
根本不会将这些显示为重新启动(目前正在尝试理解get_boots()
实现)。
如果有人早些时候看到过这种行为,请欣赏任何想法和意见。我知道这jounalctl --list-boots
是获取重新启动列表的好去处,但我正在尝试使用一组特定的重新启动信息来分析日志。这些误报污染了我正在尝试编写的脚本的结果。
我不认为引导 ID 实际上变化得那么快。我认为您正在同时查看几个不同靴子的日志,并且它们混合在一起。
如果您的系统没有电池供电的实时时钟,就会发生这种情况。
journalctl 使用挂钟时间对来自不同引导的日志消息进行排序。如果挂钟在每次启动时重置,看起来来自不同启动的消息同时发生,journalctl 会混淆它们。
请参阅Lennart Poettering对systemd 功能请求 #662的评论(强调我的):
确认这一点的一种方法是运行
journalctl --list-boots
并检查日期范围。如果它们重叠,则 journalctl 使用的是伪造的时间戳。