【CentOS8】chronyの仕様や設定~[chrony.conf] や[chronyc sources] 表示結果の見方~

Linuxのクロックの取り扱い

Linux は Windows とは異なりシステムクロックハードウェアクロックを分離して管理しています。

ハードウェアクロックは『マザーボードに存在する、電源OFFにしても動き続けるもの

一方、システムクロックは『OS 等が起動時にハードウェアクロックからコピーし、その後は OS 上で独自に動き続けるもの』です。

Cisco も同様に動作しています。

もう少し細かく分類すると、Linux では以下 3 種類の時刻を管理しています。

1. Local Time (Location 情報に紐づいた時間。JST など)
2. Universal Time (UTC)
3. RTC Time (ハードウェアクロック)

ハードウェアクロック自体に Location 情報はありませんが、OS (Linux) からは管理が可能です。

コマンドとしては hwclock があります。また、管理ファイルとしては

/etc/adjtime に { UTC or LOCAL }

/etc/sysconfig/clock に UTC= { True or False }

というパラメータがセットされています。

UTC = False にすると、ハードウェアクロックを Local Time として解釈します。

一方、システムクロックは UTC での管理が前提となります。

/etc/localtime という binary ファイルでローカル情報を持っており、 /usr/share/zoneinfo/ 配下にあるファイルと置き換えることで変更が可能です。

Chronyの仕様・設定について

CentOS7 や RHEL7 以降では NTP クライアント,サーバは Chrony (読み方:クローニー) がデフォルトとなっています。

NTP クライアントの機能をchronyc , NTP サーバの機能を chronyd と呼びますが、設定ファイルは /etc/chrony.conf の 1 つのみです。

Chrony は ntpd に代わるもので、機能的に大きな変更はありませんが、chrony では conf ファイルに rtcsync という設定で、ハードウェアクロックとの同期が可能となっています。

CentOS8 の /etc/chrony.conf はデフォルトで以下のようになっています。

[root@localhost ~]# 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

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
#local stratum 10

# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys

# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking
[root@localhost ~]#

pool 2.centos.pool.ntp.org iburst

chronyc における 同期 NTP サーバプールを指定します。

2.centos.pool.ntp.org を名前解決すると、4 つの IP アドレスが返ってきます。

C:\>nslookup 2.centos.pool.ntp.org
サーバー:  dns.google
Address:  8.8.8.8

権限のない回答:
名前:    2.centos.pool.ntp.org
Addresses:  2403:bd80:c103:a001::123
          2400:8500:1302:845:a150:95:187:1280
          2606:4700:f1::1
          2406:da14:890:3e00:a587:d89d:5f0f:929c
          133.243.238.243
          202.181.103.212
          103.202.217.106
          157.7.153.56

CentOS7 では server オプションを 4 つ並べていましたが、pool を使うことで 1 行にまとめて設定されています。

iburst の意味は Initial Burst です。

NTPプロトコルの概要・仕組み』で記載している通り、NTP は統計情報を扱うため、1 回だけ時刻同期のやり取りをしても精度の高い時刻を測れません。

そのため、起動時は短い時間に 4 回連続 NTP サーバへ問い合わせに行き、統計情報のためのサンプルを少しでも多く集めるように動作します。

iburst 以外にも、優先的に時刻同期ソースにする prefer や、絶対的に信頼する trust といったオプションも利用可能です。(絶対的に信頼する、というのは多数決アルゴリズム Selection Algorithm を無視して少数派でも時刻同期ソースとして信頼する、という意味です。)

stratumweight 0

一般に NTP クライアントは NTP サーバからの NTP パケットにある [ Root Delay および Root Dispersion ] から、NTP サーバとの距離 = Distance を計算しています。

また、NTP クライアントは複数ある NTP サーバから、Distance 値の小さい NTP サーバ 3 台を選定して同期しますが、この設定ではその選定基準として Distance 値だけでなく Stratum も考慮する設定をすることができます。

例えば『stratumweight 2』 と設定した場合chronyc は Stratum が 1 上がる毎に、Distance 値に 2 を加える操作をし、Distance の近い 3 台を選定します。

driftfile /var/lib/chrony/drift

drift ファイルを配置するファイルのフルパスを指定します。

drift とは、ハードウェアクロックが本来的にどのくらいズレる傾向にあるかを測り、それを自動で補正するものです。

例えばハードウェアクロックが 1 日に 0.001 秒速く進むのであればその情報をこのファイルに保管しておき、例え NTP サーバに通信できない場合であってもこのファイルを元に自動で補正する動きをします。

このハードウェアクロックのズレは、CPU やシステムのクロック周波数と関連があり、その特性に応じて生じるものです。

makestep 1.0 3

chronyc が起動し、最初の 3 回の NTP パケットの往復の中で、1 秒以上ズレている場合は STEP モードで一気に時刻を修正します。

それ以外の場合は SLEW モードで緩やかに時刻修正を行います。

rtcsync

前述の通り、同期した時刻をハードウェアクロックに上書きします。なお、VMware の仮想マシンにはハードウェアクロックを保存する領域があるようですが、KVM の仮想マシンにはそれが無く、毎回ホストのハードウェアクロックから初期時刻を引っ張ってきますので、KVM 上の VM はこの設定は意味を為しません。

#hwtimestamp *

NIC 内部にハードウェアクロックを持っているものがあり、そのハードウェアクロックを NTP パケットのタイムスタンプとして使う設定ができます。

* は全てのインタフェースを示しますが、eth0 等の特定インタフェースのみに指定することも可能です。

#minsources 2

これは RFC5905 にあるパラメータ "CMIN" のことを言っています。

Selection Algorithm によって、複数ある同期先 NTP サーバの中から明らかに偏って時刻がずれていると思われるものを除外するのですが、除外した後、最低いくつの NTP サーバを残すかを設定します。デフォルトは 1 です。

#allow 192.168.0.0/16

NTP クライアントからのアクセスを受け付ける範囲を限定します。

デフォルトでは全て拒否されるため、NTP サーバとして動作させるためには設定変更が必要です。コメントインして適した NW アドレスを許可しましょう。

#local stratum 10

デフォルト設定の場合、上位 NTP サーバから時刻同期できていない場合はStratum 16 となり、下位 NTP クライアントに時刻提供ができません。

ですが例えば『local stratum 10』と設定した場合、上記 NTP サーバから時刻同期できていない場合であっても自身を『Stratum 10』と定義し、下位 NTP クライアントへの時刻提供が可能となります。

keyfile /etc/chrony.keys

NTP version 3 以降で利用可能である、NTP の認証で使う鍵ファイルを指定します。

NTP の認証は、クライアントからサーバに対して行うものです。

logdir /var/log/chrony

ログを配置するディレクトリを指定する設定です。

#log measurements statistics

どの項目についてログを取るか指定します。ログにはいくつか種類がありますが、代表的なものを示します。

measurements

ntp パケットの情報を記録します。

statistics

最新の NTP パケットを受信したタイミングで、それまでに受信した NTP パケットを元に推定された各パラメータ (jitter 等) を記録します。

tracking

周波数のゲインやロス (ハードウェアに起因する時刻のずれ) の推定値がどの程度変化したか、slew がどの程度為されたかを記録します。

chronyc sources の見方

chronyc sources は自身の上位サーバと同期取れているか状態を確認するコマンドです。

[root@localhost ~]# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- y.ns.gin.ntt.net              2   6   377    47    +11ms[  +28ms] +/-  135ms
^* ntp-b2.nict.go.jp             1   6   377    47    +12ms[  +29ms] +/-   34ms
^- mx.execve.net                 3   6   377    45    +14ms[  +14ms] +/-  102ms
^- hit-bridge.com                2   6   367    44  +5457us[+5457us] +/-   69ms
[root@localhost ~]#

chronyc sources の表示が遅いときは名前解決待ちの可能性が高いです。

chronyc -n sources を使うと速く表示されます。

左端から見ていきます。

M = Mode

^ はサーバモード、= はピアモード、# はローカルを意味します。

S = State

* は同期中、+ は "selected source" として承認中、- は "combinding algorithm" により (精度が悪いため) 除外されている状態、? は起動直後のためサンプルが集まっていないか、接続性が悪い状態、x は falseticker (時刻がずれていると判断される状態), ~ は jitter の変動が大きい状態を示します。

Name/IP address

接続先 NTP サーバのホスト名もしくは IP アドレスを示しています。

Stratum

ストラタムです。Stratum が 16 でなければ同期が取れた状態になります。

Poll

ポール間隔を示します。2 の乗数 (秒) です。値が『6』 であれば 2^6 = 64 秒間隔で ntp パケットを送出します。

Reach

相手 (sources) から NTP パケットを受け取れたかどうかを示します。8 bit を 8 進数で示しています。全部成功していたら 11 111 111 なので 377 です。

上記の例では 367 がありますがこれは 11 110 111 なので 4 つ前のパケットは受け取れていなかった、ということが分かります。

LastRX

何秒前に最後のパケットを受信したかを示します。これは 10 進数です。

Last sample

最後の計測で自身のクロックと NTP パケットが示すクロックがどの程度離れていたかを示します。[] の左側の数値が slew モードでの調整後の乖離値であり、補正として適用される数値です。[] の中の数値は、最後の計測の1回のみでの乖離値、+/- は標準誤差です。

NTP の詳しい動作については下記ページもご参照下さい。

https://milestone-of-se.nesuke.com/l7protocol/ntp/ntp-summary/