私は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リポジトリの4.9.168カーネルとStretch-backportsの4.19.37カーネルを使用してこれを観察しました。 Stretchと4.9.168を実行するDigitalOcean Dropletでもこれを再現できました。
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 Dropletのログ:
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
答え1
これは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ソースコードを見ることができますここ