朝から昼寝

(ブログ準備中) IT技術、健康、日常

Chronyで時刻同期

概要

Chronyは、RHEL7、CentOS7以降におけるデフォルトの時刻同期機能(NTP実装)です。従来はntpdがありました。
本記事は、常時起動させておくサーバシステムにおいて、時刻同期のためChronyを使用するときのポイントをまとめたものです。主に、RHEL7、CentOS7以降でOS標準のChronyを使用した環境を対象としていますが、基本的にはどのシステムでも共通です。

  • ChronyでNTPサーバを参照して時刻同期する。
  • 時刻ズレやうるう秒の発生時に考慮すべきポイントを抑えておく。

基本設定

参照先NTPサーバを指定する(server)

# vi /etc/chrony.conf

#server 0.rhel.pool.ntp.org   iburst 
#server 1.rhel.pool.ntp.org   iburst 
#server 2.rhel.pool.ntp.org   iburst 
#server 3.rhel.pool.ntp.org   iburst
server ntp-server1.domain.com iburst
server ntp-server2.domain.com iburst

1~4行目のserver行は、上記の例ではRHEL用のデフォルトのNTPサーバ設定です。別のNTPサーバを使用する場合は全てコメントアウトします。
新たにserver行を追加し、ntp-server1.domain.com部分に参照先NTPサーバを記載します。
iburstはデフォルトです。chronyd起動時、NTPサーバに短い間隔で4回問合せし、早く時刻同期できるようにするものです。特に理由が無ければiburstを記載したままで良いです。
参照するNTPサーバが複数ある場合、優先順に記載していきます。

設定反映

/etc/chrony.confの変更後はサービスを再起動して設定反映します。
# systemctl restart chronyd
# systemctl status chronyd

…
Active: active (running) since xxx
…

Active:行が「active (running)」、since xxxが# systemctl restartを実行した時刻になっていればサービス再起動完了です。

基本動作確認

NTPサーバと時刻同期できていることの確認(chronyc sources)

$ chronyc sources

MS Name/IP address         Stratum Poll Reach LastRx Last sample               
========================================================
^* ntp-server1.domain.com          1   3   111    22  -1000us[ -100ms] +/-   10ms
^? ntp-server2.domain.com          1   3   111    22  -1000us[ -100ms] +/-   10ms
※値はダミーです

行頭が ^* になっている行のNTPサーバと時刻同期できています。
行頭が ^? になっている行のNTPサーバとは、通信が成功していません。ファイアウォールの設定を確認する等が必要です。
通信可能なNTPサーバであっても、chronydのサービス起動後、数十秒間は ^? のままで、その後 ^* になります。
各項目の簡易説明は$ chronyc -v sourcesで表示できます。
他に$ chronyc trackingというオプションもあるので、それは後述します。

詳細設定

stepモードによる時刻同期の考慮(makestep)

chronyd のデフォルト設定では、サービス起動時にNTPサーバと大幅に時刻がズレていた場合、一気に時刻修正(stepモード)が行われます。
デフォルトでは「makestep 1.0 3」の設定により、chronyd 起動直後のNTPサーバとのやり取り時に1.0 秒以上の時刻ズレが3回続けて検知された場合に step モードで時刻修正されます。
一気に時刻修正されると問題があるシステムでは、この設定を予め無効化しておきましょう。例えば、時刻を正確に扱う必要性のあるデータベースシステムなどです。
chrony.confのmakestep行をコメントアウトしてchronydを再起動すると無効化できます。
/etc/chrony.conf

#makestep 1.0 3

なお、このmakestepによる動作は、chronydのサービス起動時に適用されます。つまり、OS再起動時だけでなく、chronydのサービスを再起動しただけでも適用されます。

うるう秒発生時の振る舞いの考慮(leapsecmode)

数年に1度、60秒目が挿入されることがあります。23:59:60(日本時刻で8:59:60)。システムによっては問題が生じる可能性があるため、うるう秒発生時の振る舞いを考慮しておく必要性があります。
chronydのデフォルト設定では、leapsecmode systemです。これは23:59:59を2回刻むことになるので、1秒間の時刻の逆進が発生します。
chrony.confのマニュアルでは、うるう秒対策(leap smear)として、以下の設定例が記載されています。

leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001 leaponly

この設定は、うるう秒挿入時に23:59:59を2回刻まずゆっくり時刻調整(slewモード)します。また調整速度(maxslewrate)を1000ppmに抑えます(maxslewrateについては後述)。smoothtimeは正確に理解できていませんが、システムが長時間オフラインだった場合などに備え、時刻修正速度(offset)の変化を緩やかにするためのオプションのようです。うるう秒発生時にのみ適用されます(leaponly)。 このうるう秒対策の設定は一部の古いシステムでは対応不可のようですので、使用しているシステムのchronyのマニュアル等を確認しましょう。
なお、上記のmaxslewrate 1000は、デフォルトの約80分の1の値です。うるう秒挿入時だけでなく普段の時刻修正の最大速度が制限される設定であるという点は認識しておくべきです(maxslewrateについては後述)。
上記のような細かい設定まではしたくない場合、leapsecmode ignoreとしておいても、うるう秒挿入時に23:59:59を2回刻まず、通常のchronydの動作に従い時刻修正されます。
このうるう秒対策の日本語解説は、RedHat社のページが詳しいです。

時刻修正の速さ(maxslewrate)

chronydは通常動作時、slewモードでゆっくり時刻修正されます。その時刻修正の最大速度がmaxslewrateで設定されます。
maxslewrateのデフォルト値は83333.333 ppmで、これは「1秒の時刻ズレを12秒間で修正」するものです。単位がppm(parts per million)なので、83,333.333 ÷ 1,000,000 ≒ 0.083 (1秒間に1/12秒くらい時刻修正する)ということです。1分間の時刻ズレを修正するのにかかる時間が最速で720秒(12分)です。
従来のntpdでは、500ppm相当の固定値でしたので、それに比べるとかなり速いです。
大きな時刻ズレが生じたときに、条件によってはずっと時刻修正が完了しないままになるといったようなトラブルを回避する上ではある程度速い方が良いです。

詳細動作確認

NTPサーバとの時刻同期状況の詳細確認(chronyc tracking)

前述のchronyc sources以外に、以下のような確認も可能です。
$ chronyc tracking

(★マークは説明用の目印です)
Reference ID    : AB00123C (domain.com)
Stratum         : 1
Ref time (UTC)  : Fri Apr 29 01:22:33 2022
System time     :  0.000000555 seconds slow of NTP time ★
Last offset : -0.000000140 seconds ★ 
RMS offset : 0.000000280 seconds ★
Frequency       : 1.111 ppm slow
Residual freq   : 0.000 ppm
Skew            : 0.090 ppm
Root delay      : 0.00140302 seconds
Root dispersion : 0.001200221 seconds
Update interval : 54.1 seconds
Leap status     : Normal
※値はダミーです。

System Time: 行は「X seconds slow of NTP time」と記載されていれば、NTPサーバより時刻がX秒遅れている、「X seconds fast of NTP time」と記載されていれば、NTPサーバより時刻がX秒進んでいるという意味です。
offsetは、chronyでは、NTPサーバとの時刻差そのものでなく、算出された時刻修正量を表しているようです(正確に把握できていません)。

参考

他にもchronycにはオプションがあります。詳細は$ man chronycにて。
chrony.confの各設定詳細は$ man chrony.confにて。