NTPに変わるChronyって何が変わったの?
RHEL7でも標準でもChronyは、標準で導入されていましたが、RHEL8BetaではChronyのみがサポートされるようになりました。 RHEL8は、現状Beta版ではありますが今年中には正式版もでるでしょうから、今のうちにchronyを調査・検証してみようと思います。
1. Chronyとは
1.1. Chronyとは
Chronyは、NTPクライアントとNTPサーバーの実装のひとつです。NTPのリファレンス実装であるntpdとは異なる時刻同期アルゴリズムを採用しているため、より効率良く正確な時刻同期を提供します。
また、Chronyはネットワーク接続が頻繁に切断される、ネットワークの混雑や遅延が発生する、温度が変わるといった様々な条件下や、時刻の同期が継続的に実行されない、または仮想マシンで実行されているといったシステムであっても時刻がずれないような工夫がされているようです。
1.2. NTPとの違いは?
-
NTPのバージョンが異なる chronydはNTPバージョン3(RFC1305)、ntpdはNTPバージョン4(RFC 5905)を使用する。 (バージョン3はバージョン4と完全互換性があります)
-
ハードウェアクロックとの同期 chronydはハードウェアクロックとの同期が可能、ntpdは不可。
-
slewモードのslewレート
NTPサーバと同様にChronyもstepモードとslewモードがあります。(stepモードがChronyのデフォルト)
ntpdのslewレートは500(msec/sec)の固定に対して、chronyはslewレートを変更可能となっている。(defaultは83333.333(msec/sec))
-
使用ポート
NTPは123固定でしたが、chronyはdefault:123ではあるが変更も可能。
2. chronyを導入してみる
2.1. 環境
OS:CentOS 7.5 ミドルウェア:chrony-3.2-2.el7.x86_64
OS:RHEL 8.0 Beta ミドルウェア:chrony-3.3-3.el8.x86_64
2.2. chrony導入
CentOS 7.5、RHEL 8.0 Betaのどちらも標準パッケージに同梱されているため、新たにインストールする必要はありません。 systemctlコマンドでサービスの起動設定するだけで使用できますが、CentOS、ではNTPと動作が被らないように
ちなみにRHEL7.3では、最小インストールでchrony-2.1.1-3.el7.x86_64
が導入されていました。
2.3. Chrony設定
各設定の詳細は、RHEL公式HPを参照して下さい。
chronyの設定ファイル 【/etc/chrony.conf】 はntpdの設定ファイル 【/etc/ntp.conf】 とほぼ同じフォーマットであり設定項目もかなり似ています。
以下はRHEL8Betaのdefault設定です。CentOS7.5との違いはNTPサーバの宛先指定がserverでRHEL8はpool指定となっているのとleapsectx right/UTC
が追加されていました。
【rtcsync】でリアルタイムクロック(HWクロック)を 11 分ごとに更新してくれるので設定しておいたほうがいいでしょう。
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.rhel.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.
leapsectx right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
2.3.1. NTP Clientとして設定
私の経験上、NTPをstepモードで使用することはなく、slewモードに変更して使用していましたのでslewモードに変更します。
[makestep]の行をコメントアウトし、[leapsecmode]で”slew”を設定
# vi /etc/chrony.conf
server Local_NTP_Server
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
#makestep 1.0 3
leapsecmode slew
noclientlog
logchange 0.5
logdir /var/log/chrony
2.3.2. NTPサーバとして設定
allow、denyでセキュリティを考慮しNTP Clientが接続してくるセグメントのみ許可したほうがいいでしょう。
以下の設定の場合は、全てを拒否し、192.168.120.0/24
を許可しています。
bindaddress
は、特定のIPをbindすることができるので
同期先サーバが1つもない場合の自身のstratumするためlocal
を設定する。
# vi /etc/chrony.conf
pool xxx.xxx.xxx.xxx
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
leapsecmode slew
deny all
allow 192.168.120
bindaddress 127.0.0.1
bindcmdaddress ::1
local stratum 10
#noclientlog
logchange 0.5
logdir /var/log/chrony
2.4. chrony関連コマンド
2.4.1. NTPサーバへの接続状態を示すコマンドchronyc sources
ntpdのntpq -p
コマンドの変わりに使用するコマンド。
$ chronyc sources
210 Number of sources = 4
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp3.jst.mfeed.ad.jp 2 10 377 962 +400us[ +472us] +/- 134ms
^* ntp-a2.nict.go.jp 1 10 377 61 +183us[ +259us] +/- 1518us
^- y.ns.gin.ntt.net 2 9 377 472 -1334us[-1260us] +/- 107ms
^- ec2-13-230-38-136.ap-nor> 2 10 377 32m -16us[ +63us] +/- 24ms
先頭のM
列が^
はNTPサーバーを指します。2番目のS
列では、*
が現在の同期元、+
が同期候補、-
が候補外を示します。時刻同期が動作していることが確認できますね。
2.4.2. トラッキング
[chronyc sources]は接続先を示すのに対して[chronyc tracking]は自身の状態をトラッキング(追跡)するのに使用します。そのため、自信の状態を詳細に出力します。
$ chronyc tracking
Reference ID : 85F3EEF3 (ntp-a2.nict.go.jp)
Stratum : 2
Ref time (UTC) : Fri Mar 08 07:10:48 2019
System time : 0.000014556 seconds fast of NTP time
Last offset : +0.000023046 seconds
RMS offset : 0.000064057 seconds
Frequency : 12.805 ppm fast
Residual freq : +0.000 ppm
Skew : 0.017 ppm
Root delay : 0.002851847 seconds
Root dispersion : 0.000952405 seconds
Update interval : 1043.9 seconds
Leap status : Normal
2.4.3. 手動による時刻合わせ
slewモードで設定していても、強制的一度に修正するstepモードでシステムクロックと同期します。
# chronyc -a makestep
200 OK
2.4.4. システムクロックとハードウェアクロックを同期させる
# chronyc -a trimrtc
200 OK
2.4.5. クライアントの情報
chrony.confのnoclientlog
をコメントアウトしてないとクライアント情報を確認することができませんので注意して下さい。
# chronyc -a clients
Hostname Client Peer CmdAuth CmdNorm CmdBad LstN LstC
================= ====== ===== ====== ====== ====== ==== ====
localhost 0 0 3 3 0 49y 0
192.168.1111.128 1 0 0 0 0 4 49y
2.4.6. ポーリング間隔
ポーリング間隔は、デフォルトで minpoll
値は 6、maxpoll
が10となっている。
NTPと同様にこの値は、設定値をnとすると$2^{n}$となる。なのでdefault minpoll
は、64秒、maxpoll
は1024秒ととなる。
この間隔を変えるには、/etc/chrony.conf
を変更することで変えられるがクロック精度を高めるためにはdefaultよりは小さくすべきでしょう。
server <NTP server address> minpoll 5 maxpoll 9
最後に
以上の検証から設定及び確認コマンドの違いについては理解でき、chronyの方が明らかに精度は上がっている。
ただし使用してみた感じ、検証の方法が悪いのだろうがNW切断や遅延でのchronyのメリットは感じられなかったw
後は検証する環境があればpeer設定での動作検証を後日できればな~