Debian
Linux 系統時間與 RTC 時間不同
我正在執行 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 提前,並顯示最小時鐘值。
root@debian-vm:~# journalctl -b | grep time | grep systemd Nov 03 17:16:43 debian-vm systemd[1]: System time before build time, advancing clock. root@debian-vm:~# date --date="$(uptime -s)" +%s 1478193400 root@debian-vm:~# uptime -s 2016-11-03 17:16:40
您可以在此處查看檢查最小時鐘的 systemd 原始碼