tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

Linuxの時刻関連

NTP

NTP(Network Time Protocol)は、コンピュータに内蔵されているシステムクロックをネットワークを介して正しく同期させるためのプロトコルである。NTPは階層的なクライアントサーバモデルとなっており、NTPクライアントはNTPサーバから時刻を同期する。NTPサーバにも上位のNTPサーバが存在しており、階層的に時刻同期を行う。

NTPの階層構造はstratumと呼ばれ、最上位のNTPサーバが原子時計GPSの正確な時刻源から正しい時刻情報を得て、下位のNTPサーバはそれを参照して時刻同期を行っていく。最上位のNTPサーバはstratum 1であり、階層を降りるごとにstratumの値が増えていく。

NTPの通信は123番ポートが利用されるが、後述するChronyではデフォルトの123から変更することも可能。

Chrony

NTPクライアントとNTPサーバーの実装のひとつである。NTPのリファレンス実装*1のntpdより効率良く正確な時刻同期を提供できる。chronyの設定ファイルは/etc/chrony.confに記載されている。

# cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.centos.pool.ntp.org iburst
(略)

poolというのは、仮想的なNTPサーバでNTPサーバのクラスタから構成されている。NTPクライアントから見ると個々の実NTPサーバを意識する必要がない。CentOSでデフォルトで設定されている2.centos.pool.ntp.orgはpool.ntp.orgという何百万ものクライアントへ 使いやすく安定した NTP サービスを提供するプロジェクトによって提供されている。

chronyc trackingコマンドで同期先のNTPサーバ等の時刻同期状況を調べることができる。

# chronyc tracking
Reference ID    : D4120312 (ntp1.m-online.net)
Stratum         : 3
Ref time (UTC)  : Sun Mar 21 13:59:57 2021
System time     : 0.000853356 seconds fast of NTP time
Last offset     : +0.000408658 seconds
RMS offset      : 0.000285201 seconds
Frequency       : 11.395 ppm slow
Residual freq   : +0.001 ppm
Skew            : 0.040 ppm
Root delay      : 0.257479399 seconds
Root dispersion : 0.004164010 seconds
Update interval : 1041.4 seconds
Leap status     : Normal

chronyc sourcesコマンドで同期先候補のNTPサーバ一覧をリストできる。

# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ nsa.lds.net.ua                3  10   357   353   -132us[+6293ns] +/-  186ms
^+ 198.51-174-198.customer.>     2  10   377  1070  -2307us[-2166us] +/-  133ms
^+ ns2.vedur.is                  3  10   377    87    +17ms[  +17ms] +/-  279ms
^* ntp1.m-online.net             2  10   377   132    +12ms[  +13ms] +/-  155ms

タイムゾーンの設定

タイムゾーンに関する設定にtimedatectlを使う。オプションをつけないと現在の設定を確認することができる。

# timedatectl
               Local time: Sun 2021-03-21 23:21:12 JST
           Universal time: Sun 2021-03-21 14:21:12 UTC
                 RTC time: Sun 2021-03-21 14:21:12
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

設定可能なタイムゾーンの一覧はtimedatectl list-timezonesコマンドで確認できる。

# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
(略)

タイムゾーンの変更はtimedatectl set-timezoneコマンドで可能。試しにパリ時間に変更してみる。dateコマンドの出力も変わっていることがわかる。

# timedatectl
               Local time: Sun 2021-03-21 23:25:15 JST
           Universal time: Sun 2021-03-21 14:25:15 UTC
                 RTC time: Sun 2021-03-21 14:25:15
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
# date
Sun Mar 21 23:25:18 JST 2021
# timedatectl set-timezone Europe/Paris
# timedatectl
               Local time: Sun 2021-03-21 15:25:58 CET
           Universal time: Sun 2021-03-21 14:25:58 UTC
                 RTC time: Sun 2021-03-21 14:25:58
                Time zone: Europe/Paris (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
# date
Sun Mar 21 15:26:15 CET 2021

ちなみに、この方法での変更は再起動しても永続している。

# reboot
(再起動後)
# timedatectl
               Local time: 日 2021-03-21 15:29:39 CET
           Universal time: 日 2021-03-21 14:29:39 UTC
                 RTC time: 日 2021-03-21 14:29:39
                Time zone: Europe/Paris (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

内部的な時計について

カーネル内の多くのサブシステム*2が、時間に関する処理をする際にWall clockと呼ばれる時刻を参照する。Wall clockを呼び出すAPIが用意されており、それによって現在の時刻を得る。カーネル内の時刻はNTPの補正を受ける。

参考にしたもの

TCP/IP - NTPとは

リファレンス実装 - Wikipedia

qiita.com

qiita.com

ttlx.hateblo.jp

eng-entrance.com

www.valinux.co.jp

hackers-high.com

www.server-world.info

pool.ntp.org: the internet cluster of ntp servers

*1:他者がそれを参考にして独自に実装することを助ける目的で作られた実装のこと。

*2:カーネルの各機能、もしくはカーネルを構成するプログラム群という理解でよいと思う。