Linuxのクロックの取り扱い
Linux は Windows とは異なり、システムクロックとハードウェアクロックを分離して管理しています。
ハードウェアクロックは『マザーボードに存在する、電源OFFにしても動き続けるもの』
一方、システムクロックは『OS 等が起動時にハードウェアクロックからコピーし、その後は OS 上で独自に動き続けるもの』です。
Cisco も同様に動作しています。
もう少し細かく分類すると、Linux では以下 3 種類の時刻を管理しています。
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 つ並べていましたが、CentOS8 では 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 の詳しい動作については下記ページもご参照下さい。
コメント