第5章 Chrony スイートを使用した NTP の設定

5.1. chrony を使用した NTP の設定の概要

IT では、多くの理由で正確な時間の維持が重要です。たとえばネットワーキングでは、パケットとログのタイムスタンプが正確であることが必要です。Linux システムでは、NTP プロトコルがユーザースペースで実行しているデーモンにより実装されます。

ユーザースペースのデーモンは、カーネルで実行されているシステムクロックを更新します。システムクロックはさまざまなクロックソースを使用して時間を維持しています。一般的に使用されるのは Time Stamp Counter (TSC) です。TSC は、最後にリセットされた時点からのサイクル数を計測する CPU レジスターです。非常に高速でハイレゾリューションであり、中断も発生しません。

Red Hat Enterprise Linux 8 では、NTP プロトコルは chronyd デーモンにより実装されます。このデーモンは、chrony パッケージのリポジトリーから利用できます。

本セクションは、chrony スイートの使用を説明します。

5.2. chrony スイートの概要

chronyNetwork Time Protocol (NTP) の実装です。chrony は、以下に使用できます。

  • システムクロックを、NTP サーバーと同期する
  • システムクロックを、GPS レシーバーなどの基準クロックと同期する
  • システムクロックを、手動で入力した時間と同期する
  • ネットワーク内の他のコンピューターにタイムサービスを提供する NTPv4(RFC 5905) サーバーまたはピアとして

chrony は、ネットワーク接続が頻繁に切断される、ネットワークの混雑が長時間続く、温度が変わる (一般的なコンピューターのクロックは温度に敏感) といったさまざまな状況や、継続的に実行されない、または仮想マシンで実行されているといったシステムにおいても、良好に動作します。

インターネット上で同期している 2 つのマシン間の一般的精度は数ミリ秒以内、LAN 上のマシン間では数十マイクロ秒以内です。ハードウェアタイムスタンプまたはハードウェア基準クロックは、同期している 2 つのマシン間の精度をサブマイクロ秒レベルにまで高めることができます。

chrony は、ユーザースペースで実行する chronyd と、chronyd のパフォーマンスを監視し、実行時にさまざまなオペレーティングパラメーターを変更するのに使用できるコマンドラインプログラムである chronyc で構成されます。

chrony デーモンである chronyd は、コマンドラインユーティリティーの chronyc を使用して監視と管理を行います。このユーティリティーは、chronyd の現在の状態にクエリーを実行し、その設定を変更する多数のコマンド入力を可能にするコマンドプロンプトを提供します。デフォルトでは、chronydchronyc のローカルインスタンスのコマンドのみを受け付けますが、リモートホストから監視コマンドを受け付けるように設定することも可能です。リモートアクセスは制限することが推奨されます。

5.2.1. chronyc を使用した chronyd の制御

対話モードでコマンドラインユーティリティー chronycを使用して chronyd のローカルインスタンスを変更するには、root で以下のコマンドを実行します。

~]# chronyc

制限されているコマンドを使用する場合は、rootchronyc を実行する必要があります。

以下のように、chronyc コマンドプロンプトが表示されます。

chronyc>

そのコマンドの一覧を表示するには、help と入力します。

このユーティリティーは、以下のようなコマンドで呼び出すと、非対話型コマンドモードでも呼び出すことができます。

chronyc command
注記

chronyc を使用して変更した内容は永続的ではなく、chronyd を再起動すると元に戻ります。永続的に変更する場合は、/etc/chrony.conf を変更してください。

5.3. chrony と ntp の相違点

Network Time Protocol (NTP) には、基本的な機能が似ている 2 つの実装 (ntpchrony) があります。

ntpchrony のいずれも、NTP サーバーにシステムクロックを同期させる NTP クライアントとして動作したり、ネットワーク上の別のコンピューターに対する NTP サーバーとして動作できます。各実装には、固有の機能があります。ntp および chrony の比較は「Comparison of NTP implementations」を参照してください。

NTP クライアントに固有の設定は、ほとんどの場合同じです。NTP サーバーは、server ディレクティブで指定します。サーバーのプールは、pool ディレクティブで指定します。

NTP サーバーに固有の設定は、クライアントアクセスの制御方法により異なります。デフォルトでは、ntpd は任意のアドレスからクライアントリクエストに応答します。このアクセスは restrict ディレクティブで制御できますが、ntpd が任意のサーバーをクライアントとして使用している場合は、アクセスを完全に無効にできません。chronyd は、デフォルトではいずれのアクセスも許可せず、NTP クライアントとして動作します。chronyNTP サーバーとして動作させるようにするには、allow ディレクティブでいくつかのアドレスを指定する必要があります。

ntpdchronyd は、システムクロックの修正に対するデフォルト動作も異なります。ntpd は、オフセットが 128 ミリ秒より大きい場合に、step でクロックを修正します。オフセットが 1000 秒よりも大きい場合は、これがクロックの最初の修正でない場合は ntpd が終了し、-g オプションで ntpd が起動します。chronyd は、デフォルトでクロックを一気に修正する (step) ことはしませんが chrony パッケージで提供されているデフォルトの chrony.conf ファイルでは、クロックの最初の 3 つの更新で step を許可します。その後の修正はすべて、クロックの速度を速めるか遅らせて徐々に修正します。chronyc makestep コマンドを実行すれば、chronyd によりクロックを強制的に step できます。

5.4. chrony への移行

Red Hat Enterprise Linux 7 では、正確な時間管理を行う方法として、ntp または chrony を選択できます。ntpchrony の相違点、および ntpdchronyd の相違点は「Differences between ntpd and chronyd」を参照してください。

Red Hat Enterprise Linux 8 では ntp がサポートされなくなりました。デフォルトで chrony が有効になります。このため、ntp から chrony への移行が必要になる場合があります。

ntp から chrony への移行は、ほとんどの場合簡単です。対応するプログラムの名前、設定ファイルおよびサービスは、次のとおりです。

表5.1 ntp から chrony へ移行する際に、プログラム、設定ファイル、サービスに対応する名前

ntp の名前chrony の名前

/etc/ntp.conf

/etc/chrony.conf

/etc/ntp/keys

/etc/chrony.keys

ntpd

chronyd

ntpq

chronyc

ntpd.service

chronyd.service

ntp-wait.service

chrony-wait.service

ntpdate ユーティリティーおよび sntp ユーティリティーは ntp ディストリビューションに含まれていますが、-q オプションまたは -t オプションを使用して chronyd に置き換えることができます。この設定は、/etc/chrony.conf を読み込まないようにコマンドラインで指定できます。たとえば、ntpdate ntp.example.com を実行する代わりに、以下のように chronyd を起動できます。

# chronyd -q 'server ntp.example.com iburst'
2018-05-18T12:37:43Z chronyd version 3.3 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
2018-05-18T12:37:43Z Initial frequency -2.630 ppm
2018-05-18T12:37:48Z System clock wrong by 0.003159 seconds (step)
2018-05-18T12:37:48Z chronyd exiting

ntpstat ユーティリティーは、ntp パッケージに含まれていましたが、ntpd だけをサポートしていました。現在は、ntpdchronyd の両方をサポートします。これは、ntpstat パッケージで入手できます。

5.4.1. 移行スクリプト

chrony パッケージのドキュメント (/usr/share/doc/chrony) には、ntp2chrony.py という名前の Python スクリプトがあります。このスクリプトは、既存の ntp 設定を chrony に自動的に変換します。ntp.conf ファイルで最も一般的なディレクティブおよびオプションがサポートされます。変換で無視されている行はすべて、確認のために、生成された chrony.conf ファイルにコメントとして追加されます。ntp 鍵ファイルに指定し、ntp.conf で信頼される鍵としてマークされていない鍵は、生成された chrony.keys ファイルにコメントとして追加されます。

デフォルトでは、スクリプトはいずれのファイルも上書きしません。/etc/chrony.conf または /etc/chrony.keys がすでに存在する場合は、-b オプションを使用してファイルの名前を変更してバックアップとして使用できます。このスクリプトはその他のオプションもサポートします。--help オプションを使用すると、サポートされるすべてのオプションが表示されます。

ntp で提供されるデフォルトの ntp.conf を使用したスクリプトの呼び出し例は以下のようになります。

# python3 /usr/share/doc/chrony/ntp2chrony.py -b -v
Reading /etc/ntp.conf
Reading /etc/ntp/crypto/pw
Reading /etc/ntp/keys
Writing /etc/chrony.conf
Writing /etc/chrony.keys

この場合に無視される唯一のディレクティブは disable monitor です。これは、noclientlog ディレクティブで chrony に相当するものがありますが、増幅攻撃を軽減するためだけに、デフォルトの ntp.conf に含まれていました。

生成した chrony.conf ファイルには、通常、ntp.conf の制御行に対応する allow ディレクティブが多数含まれています。chronydNTP サーバーとして実行しない場合は、allow ディレクティブをすべて chrony.conf から削除します。

5.5. chrony の設定

chronyd のデフォルト設定ファイルは /etc/chrony.conf です。-f オプションは、代替の設定ファイルパスを指定するのに使用できます。詳細は man ページの chrony.conf(5) を参照してください。使用できるディレクティブの一覧は「The chronyd configuration file」を参照してください。

以下は、chronyd 設定オプションです。

コメント
コメントの前には、#、%、;、または ! を付けます。
allow

必要に応じて、NTP サーバーとして動作しているマシンへの接続が許可されるホスト、サブネット、またはネットワークを指定します。デフォルトでは、接続は許可されません。

以下に例を示します。

allow 192.0.2.0/24

特定のネットワークへのアクセスを許可するときにこのコマンドを使用します。

allow 2001:0db8:85a3::8a2e:0370:7334

このコマンドを使用して、IPv6 へのアクセスを付与します。

クライアントアクセスを可能にするため、ファイアウォールで UDP ポート番号 123 を開いておく必要があります。

~]#  firewall-cmd --zone=public --add-port=123/udp

ポート 123 を永続的に開くには、--permanent オプションを使用します。

~]#  firewall-cmd --permanent --zone=public --add-port=123/udp
cmdallow
これは allow ディレクティブと似ていますが (allow セクションを参照)、特定のサブセットまたはホストへの制御アクセスを許可します (これは NTP クライアントアクセスとは異なります)。「制御アクセス」とは、chronyc がこのようなホストで実行可能であり、このコンピューター上で chronyd に正常に接続できることを意味します。構文は同じになります。また、cmdallow all ディレクティブと動作が似ている cmddeny all もあります。
dumpdir
chronyd の再起動にまたがる測定履歴を保存するディレクトリーへのパスです (これが実行していない時にシステムクロックの動作が変更されていないことを想定しています)。(設定ファイルの dumponexit コマンド、chronycdump コマンドから) この機能を使用する場合は、dumpdir コマンドを使用して測定履歴を保存するディレクトリーを定義してください。
dumponexit
このコマンドが存在する場合は、chronyd が、プログラムの終了時に常に記録された時間ソースの測定履歴を保存することを示しています (上記の dumpdir コマンドを参照)。
hwtimestamp
hwtimestamp ディレクティブは、ハードウェアタイムスタンプの非常に精度の高い同期を可能にします。詳細は man ページの chrony.conf(5) を参照してください。
local

local キーワードは、現行の同期ソースがない場合でも、(それをポーリングしているクライアントから見ると) chronyd がリアルタイムに同期しているように見えるようにします。このオプションは、通常、孤立したネットワークで「master」となるコンピューターで使用されます。ここでは、いくつかのコンピューターが相互に同期するようになり、「master」は、手動入力でリアルタイムと一致させます。

以下はコマンド例を示します。

local stratum 10

10 という大きな値が示しているのは「基準クロックからのホップ数が非常に多いため、時間の信頼性が低い」ということです。基準クロックに最終的に同期している別のコンピューターにアクセスするコンピューターは、確実に 10 よりも下の階層に存在することになります。このため、local コマンドで 10 のように高い値を設定すると、リアルサーバーの視認性があるクライアントにリークしたとしても、マシン自体の時間がリアルタイムと混乱することを防ぎます。

log

log コマンドは、特定情報がログ記録されることを意味します。以下のオプションを取ります。

measurements
このオプションは、生の NTP 測定値とその関連情報を、measurements.log という名前のログファイルに記録します。
statistics
このオプションは、回帰処理の情報を statistics.log ファイルにログ記録します。
tracking
このオプションは、システムの時間が進んだり遅れたりする予測に対する変更や、発生した slew 調整を、tracking.log と呼ばれるファイルにログ記録します。
rtc
このオプションは、システムのリアルタイムクロックに関する情報をログ記録します。
refclocks
このオプションは、生およびフィルター処理された基準クロックの測定を、refclocks.log ファイルにログ記録します。
tempcomp

このオプションは、温度測定とシステムレートの補正を tempcomp.log と呼ばれるファイルにログ記録します。

ログファイルは、logdir コマンドが指定するディレクトリーに書き込まれます。

以下はコマンド例を示します。

log measurements statistics tracking
logdir

このディレクティブは、ログファイルが書き込まれるディレクトリーを指定します。

このディレクティブの使用例は、以下のようになります。

logdir /var/log/chrony
makestep

通常、chronyd は、必要に応じてクロックの速度を下げるかまたは上げることで、システムに対して時間オフセットの段階的修正を実施します。特定の状況では、このスルーイング (slewing) プロセスでシステムクロックを修正するのに非常に時間がかかり、システムクロックが不安定な状態になることがあります。このディレクティブは、調整がしきい値を上回ったときに、chronyd にシステムクロックを一度に修正 (step) します。 ただしこれは、chronyd が起動した後に、指定した制限を超えてクロック更新が行われなかった場合に限ります (負の数は制限値の無効化に使用されます)。initstepslew ディレクティブは NTP のソースのみに対応しているため、この方法は基準クロックを使用しているときに特に有用です。

このディレクティブの使用例は、以下のようになります。

makestep 1000 10

この場合、調整幅が 1000 秒よりも大きければシステムクロックは更新されますが、最初の 10 回の更新しか行われません。

maxchange

このディレクティブは、クロック更新で修正される許容オフセットの最大値を設定します。更新が指定された回数行われた後にのみチェックが実行されるため、システムクロックの初回の調整が大きくなります。指定された最大値よりも大きなオフセットが発生すると、そのオフセットは指定した回数の間無視され、その後に chronyd が終了します (マイナス値を使用すると、終了しないようになります)。いずれの場合も、メッセージは syslog に送信されます。

このディレクティブの使用例は、以下のようになります。

maxchange 1000 1 2

最初のクロック更新後に、chronyd がすべてのクロック更新でオフセットをチェックし、1000 秒よりも大きい調整を 2 回無視して、3 回目に終了します。

maxupdateskew

chronyd のタスクの 1 つは、コンピュータのクロックがその基準源に対してどれくらい速くまたは遅く動くかを調べることです。また、推定値の誤差範囲の推定値を計算します。

エラーの範囲が広すぎる場合は、測定が落ち着いていないこと、そして推定増加または損失率に信頼性があまりないことを示しています。

maxupdateskew パラメーターは、パラメーター推定値を使用できるほどには信頼できないかどうかを判定するためのしきい値です。デフォルトでは、しきい値は 1000 ppm です。

構文は以下のようになります。

maxupdateskew skew-in-ppm

skew-in-ppm の一般的な値は、電話回線を介してサーバーにダイアルアップ接続を行う場合は 100、LAN 上のコンピューターの場合は 5 または 10 になります。

信頼性のない予測の使用に対する保護の方法は、これだけではないことに注意してください。chronyd は常に、予想される進みまたは遅れのレートと、予測のエラー範囲を追跡しています。ソースの 1 つで測定が作成された後に別の予測が新たに生成されると、加重組み合わせのアルゴリズムを使用してマスター予測が更新されます。このため、chronyd に信頼性の高い既存のマスター予測があり、エラー範囲の広い新たな予測が生成されると、既存のマスター予測が新規のマスター予測を特徴づけることになります。

minsources

minsources ディレクティブは、ローカルクロックを更新する前にソース選択アルゴリズムで選択可能なものとして考慮されるべきソースの最小数を設定します。

構文は以下のようになります。

minsources number-of-sources

number-of-sources は、デフォルトでは 1 です。数値を 1 よりも大きくすると、信頼性が向上します。複数のソースが互いに対応することが必要となるためです。

noclientlog
引数を取らないこのディレクティブは、クライアントアクセスをログに記録しないことを指定します。通常はログに記録されますが、統計を chronyc でクライアントコマンドを使用して報告し、クライアントが server ディレクティブの xleave オプションでインターリーブモードを使用するようにできます。
reselectdist

chronyd が、利用可能なソースから同期ソースを選ぶ際に、同期距離が最短のものを優先します。ただし、同様の距離のソースが複数存在して、再選択が繰り返されるのを回避するため、現在選択されていないソースからの距離に、固定距離が追加されます。これは、reselectdist オプションで設定できます。デフォルトでは、この距離は 100 ミリ秒となります。

構文は以下のようになります。

reselectdist dist-in-seconds
stratumweight

stratumweight ディレクティブは、chronyd が利用可能なソースから同期ソースを選択する際に、階層ごとに追加される同期距離を設定します。

構文は以下のようになります。

stratumweight dist-in-seconds

デフォルトでは、dist-in-seconds は 1 ミリ秒です。つまり、通常、より低い stratum を持つソースは、たとえ距離が著しく離れていても、より高い stratum を持つソースを選びます。stratumweight を 0 に設定すると、chronyd はソースを選択するときに stratum を無視します。

rtcfile

rtcfile ディレクティブは、システムのリアルタイムクロック (RTC) の正確性の追跡に関連するパラメーターを chronyd が保存できるファイル名を定義します。

構文は以下のようになります。

rtcfile /var/lib/chrony/rtc

chronyd は、このファイルが存在し、chronycwritertc コマンドを実行すると、情報をこのファイルに保存します。保存される情報は、あるエポックでの RTC のエラー、そのエポック (1970 年 1 月 1 日以降の秒数)、および RTC の時間が早まるもしくは遅れる変化量です。リアルタイムクロックのコードはシステム固有のものなので、すべてのリアルタイムクロックがサポートされるわけではありません。このディレクティブを使用する場合は、リアルタイムクロックを手動で調整しないでください。リアルタイムクロックがランダムな間隔で調整されると、その変化量を測定する chrony の必要性が干渉されるためです。

rtcsync
rtcsync ディレクティブは、デフォルトで /etc/chrony.conf ファイルにあります。これにより、システムクロックが同期されていることがカーネルに知らされ、カーネルによりリアルタイムクロックが 11 分ごとに更新されます。

5.5.1. chrony でセキュリティーの設定

chronyc は、以下の 2 つの方法で chronyd にアクセスします。

  • インターネットプロトコル (IPv4 または IPv6)
  • Unix ドメインソケット (ユーザー root または chrony がローカルにアクセス可能)

デフォルトでは、chronyc は、Unix ドメインソケットに接続します。デフォルトのパスは /var/run/chrony/chronyd.sock です。この接続に失敗すると (たとえば非特権ユーザーで chronyc を実行していると失敗する可能性があります)、chronyc は 127.0.0.1 への接続を試み、その後 ::1 を試みます。

chronyd の動作に影響しない次の監視コマンドのみが、ネットワークに許可されています。

  • activity
  • manual list
  • rtcdata
  • smoothing
  • sources
  • sourcestats
  • tracking
  • waitsync

chronyd がこのコマンドを受け取るホスト郡は、chronyd の設定ファイルにある cmdallow ディレクティブ、または chronyccmdallow コマンドで設定できます。デフォルトでは、このコマンドが許可されるのは、ローカルホスト (127.0.0.1 or ::1) のものだけになります。

その他のコマンドはすべて、Unix ドメインソケットのみを介して許可されます。ネットワーク上で送信されると、たとえローカルホストであっても、chronydNot authorised エラーを返します。

chronyc を使用して chronyd にリモートでアクセス

  1. 以下を /etc/chrony.conf ファイルに追加すると、IPv4 と IPv6 の両方のアドレスからアクセスが可能になります。

    bindcmdaddress 0.0.0.0

    または

    bindcmdaddress :
  2. cmdallow ディレクティブを使用すると、リモート IP アドレス、ネットワーク、またはサブネットからのコマンドが許可されます。

    /etc/chrony.conf ファイルに以下の内容を追加します。

    cmdallow 192.168.1.0/24
  3. ファイアウォールでポート 323 を開き、リモートシステムから接続します。

    ~]#  firewall-cmd --zone=public --add-port=323/udp

    ポート 323 を永続的に開く場合は、--permanent を使用します。

    ~]#  firewall-cmd --permanent --zone=public --add-port=323/udp

allow ディレクティブは NTP のアクセス用で、cmdallow ディレクティブは、リモートコマンドの受け取りを可能にします。ローカルで実行している chronyc を使用すると、この変更を一時的なものにできます。永続的に変更するときは設定ファイルを変更します。

5.6. chrony の使用

5.6.1. chrony のインストール

Red Hat Enterprise Linux では、chrony スイートがデフォルトでインストールされます。インストールされていることを確認するには、root で以下のコマンドを実行します。

~]# yum install chrony

chrony デーモンのデフォルトの場所は /usr/sbin/chronyd です。このコマンドラインユーティリティーは /usr/bin/chronyc にインストールされます。

5.6.2. chronyd ステータスの確認

chronyd のステータスを確認するには、以下のコマンドを実行します。

~]$ systemctl status chronyd
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
   Active: active (running) since Wed 2013-06-12 22:23:16 CEST; 11h ago

5.6.3. chronyd の起動

chronyd を開始するには、root で以下のコマンドを実行します。

~]# systemctl start chronyd

システムの起動時に chronyd を自動的に起動するように設定するには、root で以下のコマンドを実行します。

~]# systemctl enable chronyd

5.6.4. chronyd の停止

chronyd を停止するには、root で以下のコマンドを実行します。

~]# systemctl stop chronyd

システムの起動時に chronyd を自動的に起動しないように設定するには、root で以下のコマンドを実行します。

~]# systemctl disable chronyd

5.6.5. chrony の同期確認

chrony が同期されているかどうかを確認するには、tracking コマンド、sources コマンド、および sourcestats コマンドを使用します。

5.6.5.1. chrony トラッキングの確認

chrony のトラッキングを確認するには、以下のコマンドを実行します。

~]$ chronyc tracking
Reference ID    : CB00710F (foo.example.net)
Stratum         : 3
Ref time (UTC)  : Fri Jan 27 09:49:17 2017
System time     :  0.000006523 seconds slow of NTP time
Last offset     : -0.000006747 seconds
RMS offset      : 0.000035822 seconds
Frequency       : 3.225 ppm slow
Residual freq   : 0.000 ppm
Skew            : 0.129 ppm
Root delay      : 0.013639022 seconds
Root dispersion : 0.001100737 seconds
Update interval : 64.2 seconds
Leap status     : Normal

各フィールドは、以下のとおりです。

Reference ID
コンピューターが同期しているサーバー (利用可能である場合) の参照 ID および参照名 (または IP アドレス) です。参照 ID は IPv4 アドレスとの混同を避けるため 16 進数の数値になっています。
Stratum
基準クロックのあるコンピューターから何ホップ離れているかを示します。上記の例のコンピューターは stratum-1 コンピューターであるため、2 ホップ離れていることになります (つまり、a.b.c が stratum-2 で、stratum-1 から同期しています)。
Ref time
参照ソースからの最後の測定が処理された時間 (UTC) です。
System time
chronyd は、通常の操作ではシステムクロックを更新しません。タイムスケールにおけるジャンプは、いかなるものでも特定のアプリケーションプログラムに有害な結果をもたらすためです。代わりに、システムクロックのエラーをわずかに早めたり遅くしたりして、エラーがなくなるまで修正し、修正が完了したら、システムクロックを通常のスピードに戻します。その結果、(gettimeofday() システムコールを使用した他のプログラム、またはシェルの日付コマンドが読み取る) システムクロックは、chronyd が予測する現在の実際の時間 (サーバーモードで稼働している場合はこれを NTP クライアントに報告) と異なることになります。この行で報告される値は、これによる差異です。
Last offset
最後のクロック更新におけるローカルオフセットの予測です。
RMS offset
長期的な、オフセット値の平均です。
Frequency
「frequency」は、chronyd が修正しない場合にシステムクロックが間違う変化量です。これは、ppm (100 万分の 1) で表されます。たとえば、1 ppm という値は、システムクロックにおける 1 秒が、実際の時間と比較すると 1.000001 秒進んでいることを意味します。
Residual freq

これは、現在選択されている基準源の「残留周波数」を示しています。これは、基準源からの測定値が、示すべき周波数と、実際に使用されている周波数との違いを反映しています。

これが常にゼロにならない理由は、補正する手順が周波数に提供されているためです。参照ソースから測定を取得し、新たな剰余周波数が計算されるたびに、この剰余の予測される正確性は、既存の周波数の値の予測される正確性 (skew を参照) と比較されます。新たな周波数の加重平均は、加重がその正確性に依存して計算されます。参照ソースからの測定に一貫した傾向がある場合、剰余は時間をかけてゼロになります。

Skew
周波数の予測されるエラー範囲です。
Root delay
コンピューターが最終的に同期する stratum-1 コンピューターの、ネットワークパスの遅延の合計数です。Root delay の値はナノ秒の分解能で出力されます。値は、極端な状況では負数になります (これは、コンピューター同士が互いの周波数を追跡せず、各コンピューターのターンアラウンド時間に比較してネットワークの遅延が非常に短い、対称的なピア配置において発生する場合があります)。
Root dispersion
コンピューターが最後に同期する stratum-1 コンピューターへ戻るすべてのコンピューターの分散を累積した合計値です。分散は、システムクロックの分解能や統計的測定の変動等に起因します。Root の分散値は、ナノ秒の分解能で出力されます。
Leap status
Leap のステータスで、Normal、Insert second、Delete second、または Not synchronized のいずれかになります。

5.6.5.2. chrony ソースの確認

sources コマンドは、chronyd がアクセスしている現行時間ソースの情報を表示します。

任意の引数 -v (verbose (詳細) の意) を指定できます。この例では、余分なキャプション行は、コラムの意味を説明するものとして表示されます。

~]$ chronyc sources
	210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#* GPS0                          0   4   377    11   -479ns[ -621ns] /-  134ns
^? a.b.c                         2   6   377    23   -923us[ -924us] +/-   43ms
^ d.e.f                         1   6   377    21  -2629us[-2619us] +/-   86ms

各コラムの表示内容は、以下のとおりです。

M
ソースのモードを示します。^ はサーバーを、= はピアを、# はローカル接続している基準クロックを意味します。
S
このコラムは、ソースの状態を示します。「*」は、chronyd が現在同期しているソースを示します。「+」は、選択したソースと結合する受け入れ可能なソースを示します。「-」は、受け入れ可能なソースで、結合アルゴリズムにより除外されたものを示します。「?」は、接続が切断されたソース、またはパケットがすべてのテストをパスしないソースを示します。「x」は、chronydfalseticker と考える (つまり、その時間が他の大半のソースと一致しない) クロックを示します。「~」は、時間の変動性が大きすぎるように見えるソースを示します。「?」条件は、少なくとも 3 つのサンプルが収集されるまで開始時にも表示されます。
Name/IP address
ソースの名前または IP アドレス、もしくは基準クロックの参照 ID を表示します。
Stratum
直近で受信したサンプルでレポートされているソースの stratum を表示します。Stratum 1 は、ローカルで基準クロックに接続されているコンピューターを示します。Stratum 1 コンピューターに同期しているコンピューターは、stratum 2 に存在することになります。Stratum 2 コンピューターに同期しているコンピューターは stratum 3 に存在することになり、以後も同様に続きます。
Poll

ソースがポーリングされるレートで、間隔のベース-2 対数を秒数で示します。つまり、値が 6 の場合は、64 秒ごとに測定が行われます。

chronyd は、一般的な条件に応じて、ポーリングレートを自動的に変更します。

Reach
ソースの到達可能性のレジスターで、8 進法で表示されます。レジスターは 8 ビットで、ソースからパケットを受信するたびに、またはミスするたびに更新されます。値が 377 の場合、最近の 8 回の通信全体についての有効な返信が受信されたことを意味します。
LastRx
このコラムは、ソースから最後のサンプルがいつ受信されたかを表示します。通常は、秒数で表示されます。mhd、および y の各文字は、それぞれ分、時間、日、年を意味します。値が 10 年の場合は、このソースからまだサンプルを受信していないことを示します。
Last sample
このコラムは、ローカルクロックと、最後に測定されたソースの間のオフセットを表示します。角括弧内の数字は、実際に測定されたオフセットを表示します。これには ns (ナノ秒)、us (マイクロ秒)、ms (ミリ秒)、または s (秒) の各接尾辞が付く場合があります。角括弧の左側は元の測定を示し、slew がそれ以降にローカルクロックに適用可能になるように調整されています。+/- に続く数字は、測定におけるエラーのマージンを示します。オフセットの値がプラスの場合は、ローカルクロックがソースよりも進んでいることを意味します。

5.6.5.3. chrony ソースの統計情報の確認

sourcestats コマンドは、chronyd が現在調べている各ソースに関するドリフト量とオフセット推定プロセスの情報を表示します。

任意の引数 -v (verbose (詳細) の意) を指定できます。この例では、余分なキャプション行は、コラムの意味を説明するものとして表示されます。

~]$ chronyc sourcestats
210 Number of sources = 1
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
===============================================================================
abc.def.ghi                11   5   46m     -0.001      0.045      1us    25us

各コラムの表示内容は、以下のとおりです。

Name/IP address
これは、NTP サーバー (またはピア) の名前または IP アドレス、またはその行の残りの部分が関連する基準クロックの参照 ID です。
NP
現在サーバーで保持されているサンプルポイントの数です。誤差レートと現在のオフセットは、このポイントを使って線形回帰を実行することで予測されます。
NR
最新の回帰を追跡している同一サインを持つ剰余の実行数です。この数字がサンプル数に対して少なくなりすぎる場合は、直線がデータに適合しなくなったことを意味します。実行数が少なすぎる場合、chronyd は古いサンプルを破棄し、実行数が受け入れ可能なものになるまで回帰を再実行します。
Span
一番古いサンプルと最新のサンプルの間隔です。単位が表示されない場合は、秒数を表しています。この例の間隔は 46 分です。
Frequency
これは予測されるサーバーの剰余周波数で、ppm (100 万分の 1) で表されます。このケースでは、コンピューターのクロックはサーバーよりも 109 分の 1 遅く実行していると推定されています。
Freq Skew
Freq の予測されるエラー範囲です (ppm (100 万分の 1) で表されます) 。
Offset
ソースの予測されるオフセットです。
Std Dev
サンプルの予測される標準偏差です。

5.6.6. システムクロックの手動調整

システムクロックを徐々に調整していく (slew) のを止め、一度に修正 (step) するには、root で以下のコマンドを実行します。

~]# chronyc makestep

rtcfile ディレクティブを使用している場合は、リアルタイムクロックを手動で調整しないでください。ランダムな調整を行うと、リアルタイムクロックがずれる変化量を測定する必要がある chrony に影響を与えます。

5.7. 異なる環境での chrony の設定

5.7.1. 孤立したネットワークでのシステムにおける chrony の設定

インターネットに接続していないネットワークに関しては、1 台のコンピューターをマスタータイムサーバーとし、もう 1 台のコンピューターをマスタータイムサーバーの直接クライアント、またはクライアントのクライアントとします。マスターでは、ドリフトファイルは、システムクロックのドリフトの平均率を使用して手動で設定します。マスターは、再起動すると周囲のシステムから時間を取得し、平均値を計算してシステムクロックを設定します。ドリフトファイルは settime コマンドが使用されたときに自動的に更新されます。

マスターにしたシステムで、root でテキストエディターを実行し、以下のように /etc/chrony.conf を実行します。

driftfile /var/lib/chrony/drift
commandkey 1
keyfile /etc/chrony.keys
initstepslew 10 client1 client3 client6
local stratum 8
manual
allow 192.0.2.0

192.0.2.0 は、クライアントが接続できるネットワークアドレスまたはサブネットアドレスです。

マスターのダイレクトクライアントにしたシステムで、root でテキストエディターを実行し、以下のように /etc/chrony.conf を実行します。

server master
driftfile /var/lib/chrony/drift
logdir /var/log/chrony
log measurements statistics tracking
keyfile /etc/chrony.keys
commandkey 24
local stratum 10
initstepslew 20 master
allow 192.0.2.123

ここでの 192.0.2.123 はマスターのアドレスで、master はマスターのホスト名になります。この設定になっているクライアントは、システムが再起動するとマスターと再同期を行います。

マスターの直接のクライアントにはならないクライアントシステムの /etc/chrony.conf ファイルでは、local ディレクティブおよび allow ディレクティブが省略される以外は同じになるべきです。

孤立したネットワークでは、ローカルの参照モードを有効にする local ディレクティブも使用できます。このモードは、NTP サーバーが一度も同期されていなかったり、クロックの最終更新から長い時間が経過している場合でも、NTP サーバーが実時間に同期したように見せる chronyd のオペレーションを可能にします。

複数のサーバーをポーリングしているクライアントを混同することなく、ネットワーク上の複数のサーバーに同じローカル設定を使用し、互いを同期させるには、Orphan モードを有効にする local ディレクティブの orphan オプションを使用します。各サーバーは、他のすべてのサーバーを local でポーリングするように設定する必要があります。これにより、最小の参照 ID を持つサーバーでのみローカル参照が有効になり、他のサーバーはそれに同期します。サーバーが有効化に失敗すると別のサーバーが引き継ぎます。

5.8. ハードウェアのタイムスタンプを使用した Chrony

5.8.1. ハードウェアタイムスタンプの概要

ハードウェアタイムスタンプは、一部の Network Interface Controller (NIC) でサポートされている機能です。これは、送受信されるパケットの正確なタイムスタンプを提供します。NTP タイムスタンプは通常、カーネルおよび chronyd がシステムクロックを使用して作成します。ただし、ハードウェアのタイムスタンプを有効にしていると、パケットがリンク層または物理層に出入りする際に、NIC が独自のクロックを使用してタイムスタンプを生成します。ハードウェアタイムスタンプを NTP と共に使用すると、同期の精度を大幅に向上できます。最高精度を実現するには、NTP サーバーと NTP クライアントの両方がハードウェアタイムスタンプを使用している必要があります。理想的な条件下では、サブマイクロ秒単位の精度を実現できるかもしれません。

ハードウェアのタイムスタンプを使用する時間同期の別のプロトコルには、PTP があります。

NTP とは異なり、PTP は、ネットワークスイッチおよびルーターの補助に依存しています。同期の精度を最高の状態にしたい場合は、PTP をサポートしているスイッチやルーターがあるネットワークで PTP 使用し、そのようなスイッチおよびルーターがないネットワークでは NTP を使用することが推奨されます。

5.8.2. ハードウェアタイムスタンプのサポートの確認

NTP を使用したハードウェアのタイムスタンプがインターフェースで、サポートされていることを確認するには、ethtool -T コマンドを実行します。ethtool が、SOF_TIMESTAMPING_TX_HARDWARE 機能および SOF_TIMESTAMPING_TX_SOFTWARE 機能と、HWTSTAMP_FILTER_ALL フィルターモードを一覧表示する場合は、NTP でハードウェアタイムスタンプにインターフェースが使用できます。

例5.1 特定のインターフェースにおけるハードウェアタイムスタンプのサポートの確認

~]# ethtool -T eth0

出力:

Timestamping parameters for eth0:
Capabilities:
        hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
        software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
        hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
        software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
        software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
        hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
        off                   (HWTSTAMP_TX_OFF)
        on                    (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
        none                  (HWTSTAMP_FILTER_NONE)
        all                   (HWTSTAMP_FILTER_ALL)
        ptpv1-l4-sync         (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
        ptpv1-l4-delay-req    (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
        ptpv2-l4-sync         (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
        ptpv2-l4-delay-req    (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
        ptpv2-l2-sync         (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
        ptpv2-l2-delay-req    (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
        ptpv2-event           (HWTSTAMP_FILTER_PTP_V2_EVENT)
        ptpv2-sync            (HWTSTAMP_FILTER_PTP_V2_SYNC)
        ptpv2-delay-req       (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)

5.8.3. ハードウェアタイムスタンプの有効化

ハードウェアタイムスタンプを有効にするには、/etc/chrony.conf ファイルの hwtimestamp ディレクティブを使用します。ディレクティブは、個別のインターフェースを指定できますが、ワイルドカードキャラクターを使用して、ハードウェアタイムスタンプをサポートするすべてのインターフェースでハードウェアタイムスタンプを有効にすることもできます。linuxptp パッケージの ptp4l などのアプリケーションなど、そのインターフェースでその他のアプリケーションがハードウェアタイムスタンプを使用していない場合があるため、ワイルドカード仕様を使用してください。chrony 設定ファイルで、複数の hwtimestamp ディレクティブが使用されます。

例5.2 hwtimestamp のディレクティブを使用したハードウェアタイムスタンプの有効化

hwtimestamp eth0
hwtimestamp eth1
hwtimestamp *

5.8.4. クライアントポーリング間隔の設定

インターネット上のサーバーのポーリング間隔は、デフォルトの範囲である 64 秒から 1024 秒が推奨されています。ローカルサーバーおよびハードウェアのタイムスタンプでは、システムクロックのオフセットを最小限にとどめるため、ポーリング間隔は短く設定する必要があります。

/etc/chrony.conf における以下のディレクティブは、1 秒のポーリング間隔を使用してローカルの NTP サーバーを指定します。

server ntp.local minpoll 0 maxpoll 0

5.8.5. インターリーブモードの有効化

ハードウェアの NTP アプライアンスではなく、chrony など、ソフトウェアの NTP 実装を実行する汎用コンピューターの NTP サーバーは、パケット送信後にのみハードウェア転送先タイムスタンプを取得します。この動作により、サーバーは、対応するパケットのタイムスタンプを保存できません。NTP クライアントが、転送後に生成された転送先タイムスタンプを受け取るようにするには、/etc/chrony.conf のサーバーディレクティブに xleave オプションを追加し、クライアントが NTP インターリーブモードを使用するように設定します。

server ntp.local minpoll 0 maxpoll 0 xleave

5.8.6. 多数のクライアント向けのサーバーの設定

デフォルトのサーバー設定では、最多で数千のクライアントが同時にインターリーブモードを使用できます。さらに多くのクライアント向けにサーバーを設定するには、/etc/chrony.confclientloglimit ディレクティブを増やします。このディレクティブは、サーバーでクライアントのアクセスログに割り当てられるメモリーの最大サイズを指定します。

clientloglimit 100000000

5.8.7. ハードウェアタイムスタンプの確認

インターフェースがハードウェアタイムスタンプを有効にできたことを確認するには、システムログを確認してください。ログには、chronyd からの各インターフェース向けメッセージに、有効にしたハードウェアタイムスタンプが追記されているはずです。

例5.3 ハードウェアタイムスタンプが有効になったインターフェースのログメッセージ

chronyd[4081]: Enabled HW timestamping on eth0
chronyd[4081]: Enabled HW timestamping on eth1

chronyd が、NTP クライアントまたはピアとして設定されている場合は、chronyc ntpdata コマンドにより、転送先と受信先のタイムスタンプ及びインターリーブモードを、各 NTP ソースに報告できます。

例5.4 各 NTP ソースの転送先および受信先のタイムスタンプおよびインターリーブモードの報告

~]# chronyc ntpdata

出力:

Remote address  : 203.0.113.15 (CB00710F)
Remote port     : 123
Local address   : 203.0.113.74 (CB00714A)
Leap status     : Normal
Version         : 4
Mode            : Server
Stratum         : 1
Poll interval   : 0 (1 seconds)
Precision       : -24 (0.000000060 seconds)
Root delay      : 0.000015 seconds
Root dispersion : 0.000015 seconds
Reference ID    : 47505300 (GPS)
Reference time  : Wed May 03 13:47:45 2017
Offset          : -0.000000134 seconds
Peer delay      : 0.000005396 seconds
Peer dispersion : 0.000002329 seconds
Response time   : 0.000152073 seconds
Jitter asymmetry: +0.00
NTP tests       : 111 111 1111
Interleaved     : Yes
Authenticated   : No
TX timestamping : Hardware
RX timestamping : Hardware
Total TX        : 27
Total RX        : 27
Total valid RX  : 27

例5.5 NTP 測定の安定性の報告

# chronyc sourcestats

ハードウェアタイムスタンプを有効にすると、NTP 測定の安定性は、通常のロードにおいて数十ナノ秒または数百ナノ秒となります。この安定性は、chronyc sourcestats コマンドの出力の Std Dev コラムに報告されます。

出力:

210 Number of sources = 1
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
ntp.local                  12   7    11     +0.000      0.019     +0ns    49ns

5.8.8. PTP-NTP ブリッジの設定

非常に精度が高い Precision Time Protocol (PTP) のグランドマスターが、PTP サポートのあるスイッチまたはルーターを持たないネットワークで利用可能な場合、コンピューターは、PTP スレーブおよび stratum-1 NTP サーバーとしての操作に専念する可能性があります。このようなコンピューターには、2 つ以上のネットワークインターフェースが必要なほか、グランドマスターに近いか、またはグランドマスターと直接接続されている必要があります。これにより、ネットーワークで非常に精度の高い同期が確実に実行されます。

1 つのインターフェースを使用して PTP を使用してシステムクロックを同期するように、linuxptp パッケージの ptp4l プログラムおよび phc2sys プログラムを設定します。

chronyd を設定して、その他のインターフェースを使用してシステム時間を提供するには、以下を行います。

例5.6 その他のインターフェースを使用してシステム時間を提供するように chronyd の設定

bindaddress 203.0.113.74
hwtimestamp eth1
local stratum 1

5.9. chrony において、以前 NTP でサポートされていたいくつかの設定を実現

ntp がサポートする Red Hat Enterprise Linux のメジャーバージョンにあった一部の設定が、chrony ではサポートされません。このセクションはそのような設定の一覧と、chrony を使用して、システムでそれを実現する方法を説明します。

5.9.1. ntpq および ntpdc によるモニタリング

chronyd は、ntp ディストリビューションの ntpq ユーティリティーおよび ntpdc ユーティリティーからは監視できません。なぜなら、chrony は、NTP モード 6 および 7 をサポートしないためです。これは、別のプロトコルをサポートし、 chronyc はクライアント実装です。詳細は man ページの chronyc(1) を参照してください。

chronyd で同期しているシステムクロックの状態を監視するには、次のことができます。

  • 追跡コマンドの使用
  • ntpstat ユーティリティーを使用します。これは、chrony をサポートし、ntpd で使用されたときと同様の出力を提供します。

例5.7 追跡コマンドの使用

$ chronyc -n tracking
Reference ID    : 0A051B0A (10.5.27.10)
Stratum         : 2
Ref time (UTC)  : Thu Mar 08 15:46:20 2018
System time     : 0.000000338 seconds slow of NTP time
Last offset     : +0.000339408 seconds
RMS offset      : 0.000339408 seconds
Frequency       : 2.968 ppm slow
Residual freq   : +0.001 ppm
Skew            : 3.336 ppm
Root delay      : 0.157559142 seconds
Root dispersion : 0.001339232 seconds
Update interval : 64.5 seconds
Leap status     : Normal

例5.8 ntpstat ユーティリティーの使用

$ ntpstat
synchronised to NTP server (10.5.27.10) at stratum 2
   time correct to within 80 ms
   polling server every 64 s

5.9.2. 公開鍵暗号に基づく認証メカニズムの使用

Red Hat Enterprise Linux 7 では、ntp がサポートする Autokey は、公開鍵暗号に基づく認証メカニズムです。Autokeychronyd ではサポートされていません。

Red Hat Enterprise Linux 8 システムでは、対称鍵を代わりに使用することが推奨されます。鍵の作成には chronyc keygen コマンドを使用します。クライアントおよびサーバーは、/etc/chrony.keys で指定した鍵を共有する必要があります。クライアントは、serverpoolpeer の各ディレクティブで、key オプションを使用して認証を有効にできます。

5.9.3. 一時的な対称関係の使用

Red Hat Enterprise Linux 7 では、ntpd が、ntp.conf 設定ファイルで指定しないピアからのパケットにより収集できる一時的な対称関係をサポートしていました。Red Hat Enterprise Linux 8 では、chronyd は、chrony.conf ですべてのピアを指定する必要があります。一時的な対称関係はサポートされません。

peer ディレクティブで有効にした対象モードと比べると、server ディレクティブまたは pool ディレクティブで有効になっているクライアント/サーバーモードを使用したほうが安全です。

5.9.4. マルチキャストまたはブロードキャストのクライアント

Red Hat Enterprise Linux 7 は、クライアントの設定を簡素化するブロードキャスト/マルチキャストの NTP モードをサポートしていました。このモードでは、個々のユーザーの特定名またはアドレスに対してリッスンする代わりに、マルチキャスト/ブロードキャストのアドレスに送られらたパケットのみをリッスンするようにクライアントを設定できます。これは、時間の経過とともに変化する場合があります。

Red Hat Enterprise Linux 8 では、chronyd はブロードキャストモードまたはマルチキャストモードをサポートしていません。主な理由は、通常のクライアント/サーバーおよび対象モードに比べて、あまり正確でなく、セキュリティーも保護されていないからです。

NTP のブロードキャスト/マルチキャスト設定からの移行には、オプションがいくつかあります。

  • 1 つの名前 (ntp.example.com など) を、異なるサーバーの複数のアドレスに変換するように DNS を設定します。

    クライアントには、複数サーバーと同期するために、プールディレクティブを 1 つだけ使用した静的な設定を指定できます。サーバーがプールから到達できない場合、または同期に適切ではない場合、クライアントは自動的に、プールの別サーバーに置き換えます。

  • DHCP における NTP サーバーリストを配布します。

    NetworkManager が、DHCP サーバーから NTP サーバーの一覧を取得すると、それを使用するように chronyd が自動的に設定されます。この機能は、PEERNTP=no/etc/sysconfig/network ファイルに追加すると無効にできます。

  • Precision Time Protocol (PTP) を使用します。

    このオプションは、サーバーが頻繁に変更する環境、または、大規模なクライアントグループが、宛先サーバーを持たずに、相互に同期できるようにする必要がある場合に主に適しています。

    PTP は、マルチキャストメッセージング用に設計されており、NTP ブロードキャストモードと同じように動作します。PTP 実装は、linuxptp パッケージから入手できます。

    通常、PTP が適切に動作するには、ハードウェアタイムスタンプとネットワークスイッチのサポートが必要になります。ただし、ブロードキャストモードでは、ソフトウェアタイムスタンプを使用し、ネットワークスイッチのサポートがない場合でも、PTP の方が NTP よりも適しています。

    1 つの通信経路に非常に多くの PTP スレーブがあるネットワークでは、そのスレーブが生成したネットワークトラフィックの量を減らすために、hybrid_e2e オプションで PTP スレーブを設定することが推奨されます。NTP クライアント (場合により NTP サーバー) として chronyd を実行するコンピューターを設定し、マルチキャストメッセージングを使用して、同期した時間を多数のコンピューターに配信する PTP グランドマスターとして動作させることができます。

5.10. 関連資料

以下の資料は、chrony に関するその他の情報を提供します。

5.10.1. インストールされているドキュメント

  • chronyc(1) の man ページ - chronyc コマンドラインインターフェースと、そのコマンドおよびコマンドオプションを説明します。
  • chronyd(8) の man ページ - chronyd デーモンと、そのコマンドおよびコマンドオプションが説明されています。
  • man ページの chrony.conf(5) - chrony 設定ファイルが説明されています。

5.10.2. オンラインのドキュメント

FAQ への回答は https://chrony.tuxfamily.org/faq.html を参照してください。