Linuxシステム時間はRTC時間とは異なります。

Linuxシステム時間はRTC時間とは異なります。

私はDebian StretchとLinuxカーネルバージョン4.9.110-3+deb9u4を修正された設定で実行しています。次のような奇妙な動作を観察しました。

  1. ハードウェア時計を次に設定します。2016-01-01 00:00:00 UTC
  2. 再起動
  3. dmesg以前に設定したものと同様のハードウェア時計の読み取りを報告します。
  4. 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ソースコードを見ることができますここ

おすすめ記事