39 NTPによる時刻の同期 #
NTP (network time protocol)メカニズムは、システムの時刻をネットワーク上で同期させるためのプロトコルです。最初に、マシンは信頼できる時刻を持つサーバに時刻を照会できます。次に、ネットワーク上の他のコンピュータがこのマシン自体に対し、時刻を照会できます。目的は2つあり、絶対的な時間を維持することと、ネットワーク内のすべてのマシンのシステム時刻を同期させることです。
正確なシステム時刻を維持することはさまざまな場で重要です。ハードウェア組み込み型クロックがデータベースやクラスタなどのアプリケーション要件に合致しないことがよくあります。システムタイムを手動で修正することは時に問題を発生させる可能性があります。たとえば、時間を逆廻りに戻すことで重要なアプリケーションの誤動作を誘発することもあります。ネットワーク内では、すべてのマシンのシステムタイムを同期させることが通常必要とされますが、手動での時刻調整はよい方法ではありません。NTPには、これらの問題を解決するメカニズムがあります。NTPサービスは、ネットワーク内の信頼できるタイムサーバを使用して、システム時間を継続的に調整します。さらに、電波時計のようなローカルリファレンスクロックを管理する機能があります。
SUSE Linux Enterprise Desktop 15以降、chrony
は、NTPでデフォルトで実装されるようになりました。chrony
は2つの部分で構成されています。chronyd
は、ブート時に起動可能なデーモンであり、chronyc
は、chronyd
のパフォーマンスを監視し、実行時に動作パラメータを変更するためのコマンドラインインタフェースプログラムです。
SUSE Linux Enterprise Desktop 15.2以降、NTPクライアント設定用のYaSTモジュールは、デーモンとして実行するように設定されていない場合に、cronデーモンではなくsystemd-timerを設定し、chrony
を実行します。
アクティブディレクトリによる時間同期を有効にするには、Procedure 7.2, “Joining an Active Directory domain using にある指示に従います。 ”
39.1 YaSTでのNTPクライアントの設定 #
chrony
パッケージ付属のNTPデーモン(chronyd
)は、ローカルコンピュータハードウェアクロックを時間の参照に使用するように事前設定されています。ハードウェアクロックの精度は、その時間ソースに大きく依存します。たとえば、原子時計やGPS受信機は正確な時間ソースですが、一般的なRTCチップは信頼できる時間ソースではありません。YaSTを利用すれば、NTPクライアントを簡単に設定することができます。
YaST NTPクライアント設定(
› )ウィンドウでは、NTPデーモンの開始時期や設定ソースの種類を指定したり、カスタムタイムサーバを追加することができます。39.1.1 NTPデーモン開始 #
NTPデーモンを開始する時期は、次の3つのオプションから選択できます。
chrony
デーモンが手動で起動します。chrony
を使用せずに、定期的にシステム時間を設定します。 を設定できます。システムのブート時に自動的に
chronyd
を起動するには、 を選択します。この設定をお勧めします。
39.1.2 設定元のタイプ #
ドロップダウンボックスで、 または のいずれかを選択します。お使いのサーバが(パブリック) NTPサーバの固定セットのみを使用している場合は、 を設定し、内部ネットワークがDHCP経由でNTPサーバを提供している場合は、 が適しています。
39.1.3 タイムサーバの設定 #
ウィンドウの下部に、クライアントからの問い合わせ先となるタイムサーバが一覧表示されます。必要に応じて、 、 、および を使用してこのリストを変更します。
新しいタイムサーバを追加するには
をクリックします。コンピュータの時刻の同期元とするタイムサーバまたはそのプールのURLを
フィールドに入力します。URLを入力したら、 をクリックして、有効なタイムソースを指していることを確認します。chronyd
デーモンの開始時により多くの要求を送信することによって時刻同期を高速化するには、 を有効にします。ブート時に
chronyd
デーモンを自動的に開始しインターネットに接続されていない可能性のあるシステムでブート時間を短縮するには、 を有効にします。ネットワーク接続がNetworkManagerで管理されているノートパソコンなどで、このオプションが効果的です。
39.2 ネットワークでのNTPの手動設定 #
chrony
は、その設定を/etc/chrony.conf
ファイルから読み込みます。コンピュータのクロックを同期させるには、使用するタイムサーバをchrony
に指示する必要があります。特定のサーバ名またはIPアドレスを使用できます。以下に例を示します。
0.suse.pool.ntp.org 1.suse.pool.ntp.org 2.suse.pool.ntp.org 3.suse.pool.ntp.org
プール名を指定することもできます。プール名は複数のIPアドレスに解決されます。
pool pool.ntp.org
同じネットワーク上の複数のコンピュータで時刻を同期させる場合、それらのコンピュータをすべて外部サーバと同期させることはお勧めしません。1つのコンピュータを、外部のタイムサーバと同期させるタイムサーバとし、他のコンピュータを、クライアントとして機能させることをお勧めします。信頼性のあるタイムサーバと区別するには、サーバの/etc/chrony.conf
にlocal
ディレクティブを追加します。
local stratum 10
chrony
を起動するには、次のコマンドを実行します。
systemctl start chronyd.service
chronyd
を初期化した後、時間が安定するまでにある程度時間がかかり、ローカルコンピュータクロックを修正するためのドリフトファイルが作成されます。ドリフトファイルを用いることで、ハードウェアクロックの定誤差はコンピュータの電源が入った時点で算出されます。修正はすぐに反映されるため、システム時刻がより安定します。
ブート時にchrony
が自動的に起動するようにサービスを有効にするには、次のコマンドを実行します。
systemctl enable chronyd.service
yast-timesync.service
サービスの競合
chronyd.service
サービスのほかに、SLEDには、yast-timesync.service
が含まれています。yast-timesync.service
は、5分ごとにタイマーによってトリガされ、-q
オプションを指定してchronyd
を実行し、システム時刻を設定して終了します。任意の時点で実行できるchronyd
のインスタンスは1つのみであるため、chronyd
関連のサービスを両方同時に有効化または起動しないでください。
39.3 NTSの設定 #
ネットワークタイムプロトコル(NTP)は、ネットワーク内の1つ以上のホストのシステム時刻を同期し、正確に保つために使用されるプロトコルです。この記事では、ネットワークタイムセキュリティ(NTS)を使用してNTPを保護する方法について説明します。
NTPプロトコルでは、タイムサーバとクライアント間の通信を認証および暗号化するためのセキュリティメカニズムは導入されていません。ネットワークタイムセキュリティ(NTS)は、NTPのセキュリティを強化する拡張機能です。chrony
はNTSをサポートし、時間ソースを認証して特定のネットワーク攻撃から保護することができます。
以下の手順では、安全な時刻同期のためにタイムサーバとクライアントマシンを設定する方法について説明します。
(オプション) NTS経由で時刻を更新するようにタイムサーバを設定することをお勧めします。これにより、同期チェーンの最初から安全な時刻同期が保証されます。
/etc/chrony.conf
内のNTSをサポートしていない既存の時間ソースをコメントアウトし、NTSをサポートする時間ソースを少なくとも1つ追加します。次に例を示します。server time.cloudflare.com iburst nts
ヒントnts
オプションは、NTS接続が利用可能な場合はそれを要求し、NTSが利用できない場合はNTPにフォールバックします。chronyd
サービスを再起動します。>
sudo
systemctl restart chronyd.srvice
設定された時間ソースを確認します。
>
chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? time.cloudflare.com 3 6 1 2 -947ms[ -947ms] +/- 12ms ^? pyrrha.fi.muni.cz 2 6 1 1 -948ms[ -948ms] +/- 39ms ^* whitesoft-intex16.c.cbsn> 1 6 1 2 -948ms[ -948ms] +/- 5444us ^? mail.combatostrich.dev 2 6 1 1 -948ms[ -948ms] +/- 28ms注記^*
で始まる行には、最適として選択された時間ソースが含まれます。設定された時間ソースがNTSモードを使用していることを確認します。
>
chronyc -N authdata
Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen ========================================================================= [...] time.cloudflare.com NTS 1 15 256 3 0 0 8 96サーバ設定に、どのクライアントがタイムサーバと時刻を同期できるかを指定する、
allow
オプションが含まれていることを確認します。次に例を示します。allow 192.168.1.0/24
(オプション) タイムサーバがファイアウォールの背後で実行されている場合は、NTPとNTSの両方のポートでの通信を許可します。デフォルトでは123と4460です。
TLS証明書と対応する秘密鍵を取得し、
/var/lib/chrony/
にコピーします。chrony
で読み取り可能であることを確認します。次に例を示します。>
sudo
install -m 0440 -o chrony -g chrony nts.key /var/lib/chrony/>
sudo
install -m 0440 -o chrony -g chrony nts.crt /var/lib/chrony//etc/chrony.conf
を編集し、ntsdumpdir /var/lib/chrony
オプションがアクティブであることを確認します。次に、TLSキーと証明書へのパスを追加します。ntsdumpdir /var/lib/chrony ntsserverkey /var/lib/chrony/nts.key ntsservercert /var/lib/chrony/nts.crt
chronyd
サービスを再起動します。>
sudo
systemctl restart chronyd.service
既存のNTPソースを無効にします。次に例を示します。
#server 192.168.1.1 iburst
ソース設定は、
/etc/chrony.conf
または/etc/chrony.d/
の下のファイルに含まれています。クライアントホストは、TLS証明書に署名したルートCAを信頼する必要があります。CA証明書ストアを管理する方法の詳細については、専用の記事をご覧ください。
手順39.1「NTSタイムサーバの設定」で設定したNTSタイムサーバソースを、
/etc/chrony.conf
のクライアントchrony
設定に追加します。次に例を示します。server nts1.example.com iburst nts
chronyd
サービスを再起動します。>
sudo
systemctl restart chronyd.serviceクライアントで設定されたタイムソースを確認し、接続が認証されていることを確認します。
>
sudo
chronyc sources -v>
sudo
chronyc -N authdataNTSタイムサーバで、NTS接続に関するクライアントごとの統計情報を確認します。
>
sudo
chronyc -N clients -k
39.4 chronyc
を使用した実行時のchronyd
の設定 #
実行時にchronyc
を使用してchronyd
の動作を変更することができます。chronyd
の操作に関するステータスレポートも生成します。
chronyc
は、対話的または非対話的モードで実行できます。chronyc
を対話形式で実行するには、コマンドラインでchronyc
を入力します。プロンプトを表示し、コマンド入力を待ちます。たとえば、オンラインまたはオフラインのNTPソースの数を確認するには、次のコマンドを実行します。
#
chronyc
chronyc> activity 200 OK 4 sources online 2 sources offline 1 sources doing burst (return to online) 1 sources doing burst (return to offline) 0 sources with unknown address
chronyc
のプロンプトを終了するには、quit
またはexit
を入力します。
対話型プロンプトを使用する必要がない場合は、次のようにコマンドを直接入力します。
#
chronyc
activity
chronyc
を使用して行われた変更は、永続的ではありません。変更内容は、次のchronyd
の再起動後に失われます。永続的な変更を行う場合は、/etc/chrony.conf
を変更してください。
chronyc
コマンドの完全なリストについては、そのマニュアルページ(man
1 chronyc
)を参照してください。
39.5 ランタイム時の動的時刻同期 #
chronyd
は、ネットワーク接続なしでブートするシステムでは正常に起動しますが、ツールは設定ファイルで指定されたタイムサーバのDNS名を解決できません。
chronyd
は、server
、pool
、およびpeer
ディレクティブによって指定されたタイムサーバ名を、時間間隔を増やして成功するまで解決しようとします。
chronyd
の起動時にタイムサーバにアクセスできない場合は、offline
オプションを指定することができます。
server server_address offline
次のコマンドでサーバのポーリングを有効にしない限り、chronyd
ではサーバがポーリングされません。
#
chronyc online server_address
auto_offline
オプションが設定されている場合、タイムサーバに2つの要求を送信して応答を受信しなかったときに、chronyd
はそのタイムサーバがオフラインになったとみなします。このオプションを使用することで、ネットワークリンクを切断するときにchronyc
からoffline
コマンドを実行する必要がなくなります。
39.6 ローカルリファレンスクロックの設定 #
ソフトウェアパッケージchrony
は、SHMまたはSOCKドライバを介してタイミングデータにアクセスするために、他のプログラム(gpsd
など)を利用しています。/etc/chrony.conf
のrefclock
ディレクティブを使用して、タイムソースとして使用するハードウェア基準時計を指定します。これには、2つの必須パラメータ(ドライバ名とドライバ固有のパラメータ)があります。2つのパラメータの後には、ゼロ以上のrefclock
オプションが続きます。chronyd
には、次のドライバが含まれています。
PPS - カーネル
pulse per second
APIのドライバ。次に例を示します。refclock PPS /dev/pps0 lock NMEA refid GPS
SHM - NTP共有メモリドライバ。次に例を示します。
refclock SHM 0 poll 3 refid GPS1 refclock SHM 1:perm=0644 refid GPS2
SOCK - Unixドメインソケットドライバ。次に例を示します。
refclock SOCK /var/run/chrony.ttyS0.sock
PHC - PTPハードウェアクロックドライバ。次に例を示します。
refclock PHC /dev/ptp0 poll 0 dpoll -2 offset -37 refclock PHC /dev/ptp1:nocrossts poll 3 pps
個々のドライバのオプションについて詳しくは、man 8
chrony.conf
を参照してください。
39.7 ETR (External Time Reference)とのクロックの同期 #
ETR(External Time Reference)とのクロック同期のサポートを利用できます。ETRは、2**20(2の20乗)マイクロ秒ごとに、発振器信号と同期信号を送信して、すべての接続先サーバのTODクロックの同期を保ちます。
可用性のため、2ユニットのETRをコンピュータに接続できます。クロックが同期チェックの許容値を超えた場合は、すべてのCPUがマシンをチェックし、クロックが同期していないことを示します。この事態が発生した場合は、XRC対応デバイスへのすべてのDASD I/Oがクロックの再同期まで停止します。
ETRサポートは2つのsysfs
属性を介して有効化されます。root
として次のコマンドを実行します。
echo 1 > /sys/devices/system/etr/etr0/online echo 1 > /sys/devices/system/etr/etr1/online