我正在运行 Debian Stretch 和 Linux 内核版本 4.9.110-3+deb9u4,并修改了配置。我正在观察以下奇怪的行为
- 将硬件时钟设置为
2016-01-01 00:00:00 UTC
- 重启
dmesg
报告读取的硬件时钟与之前设置的类似date
报告2016-11-03 17:16:42 UTC
在任何日期之前都观察到上述行为2016-11-03 17:00:00 UTC
。我没有进一步缩小范围。
内核源代码没有改变,我也没有运行任何自定义内核模块。我在使用 Debian repos 中的 4.9.168 内核以及 stretch-backports 中的 4.19.37 内核时也观察到了这一点。我还能够在运行 Stretch 和 4.9.168 的 DigitalOcean 液滴上重现这一点。
当我在 2016-11-03 之后设置日期时,我没有看到这个问题发生。这似乎不太可能,但似乎内核正在强制一些最小日期。
有人对此有所了解吗?
来自我的虚拟机的日志:
root@debian-vm:~# timedatectl
Local time: Thu 2016-11-03 17:17:02 UTC
Universal time: Thu 2016-11-03 17:17:02 UTC
RTC time: Fri 2016-01-01 00:29:00
Time zone: Etc/UTC (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no
root@debian-vm:~# dmesg | grep rtc
[ 0.985653] rtc_cmos 00:01: registered as rtc0
[ 0.985670] rtc_cmos 00:01: alarms up to one month, y3k, 114 bytes nvram, hpet irqs
[ 1.032409] rtc_cmos 00:01: setting system clock to 2016-01-01 00:28:37 UTC (1451608117)
来自 DigitalOcean 液滴的日志:
root@debian-s-1vcpu-1gb-sfo2-01:~# timedatectl
Local time: Thu 2016-11-03 17:17:05 UTC
Universal time: Thu 2016-11-03 17:17:05 UTC
RTC time: Fri 2016-01-01 00:00:46
Time zone: Etc/UTC (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no
事实证明,这不是在 Linux 内核中,而是在 systemd 中。systemd 时钟实用程序在构建时定义了最小时钟值,如果从 RTC 读取的时间早于该时钟时间,它将强制系统时钟为该最小时间。这个“最短时间”可能是由 Meson 构建系统指定的,或者是从构建环境中 NEWS 文件的创建时间读取的。
以下日志显示时钟正在被 systemd 提前,并显示最小时钟值。
您可以在此处查看检查最小时钟的 systemd 源代码