はじめに (対象読者・この記事でわかること)

この記事は、Linuxサーバーを運用するエンジニアやシステム管理者を対象としています。特に、サーバーの時刻同期の重要性を理解し、正確な時刻管理を行いたいと考えている方におすすめです。

この記事を読むことで、以下のことがわかるようになります。

  • ChronyがNTPクライアントとして優れている理由
  • Chronyの基本的なインストールと設定方法
  • サーバーの用途に応じたChronyのチューニング方法
  • 時刻同期に問題が発生した場合のトラブルシューティングのヒント

サーバーの時刻は、ログの正確な記録、分散システムでの処理順序の保証、セキュリティ認証など、多岐にわたる重要な要素に関わっています。Chronyを効果的に活用し、サーバーの信頼性を向上させましょう。

Chronyとは? NTPとの違いとChronysが選ばれる理由

サーバーの時刻を正確に保つことは、システム全体の信頼性と安定性を維持するために不可欠です。例えば、複数のサーバーで構成される分散システムにおいて、各サーバーの時刻がずれていると、処理の順序が保証されず、予期せぬエラーやデータ不整合の原因となります。また、セキュリティ関連のログ記録や認証においても、正確な時刻情報は不可欠です。

この時刻同期を実現するためのプロトコルとして、NTP (Network Time Protocol) が広く利用されています。Chrony (Chronyc) は、このNTPプロトコルを実装したソフトウェアの一つですが、従来のNTPデーモン (ntpd) とは異なるアプローチで時刻同期を行います。

NTPとChronyの主な違い

特徴 ntpd (従来のNTP) Chrony
起動・停止時の挙動 起動時にネットワークが利用可能になるまで待機する必要がある。 起動時にネットワークが利用可能でなくても、後から自動的に同期を開始する。
同期精度 非常に高い精度を誇るが、常に同期を維持するためにCPUリソースを消費しやすい。 起動時やネットワーク状態に応じて、動的に同期頻度を調整するため、CPUリソース消費を抑えつつ高精度な同期を実現。
ネットワーク切断への対応 ネットワークが切断されると、同期が停止し、時刻がずれていく。 ネットワークが切断されても、ローカルのクロックを維持し、復旧時に迅速に同期を再開できる。
設定の容易さ 設定ファイルが複雑で、理解に時間がかかる場合がある。 設定ファイルが比較的シンプルで、直感的に設定しやすい。

Chronyは、これらの特徴から、特にクラウド環境や仮想化環境、頻繁にネットワークが切断・再接続されるような環境において、より柔軟で効率的な時刻同期を実現します。そのため、近年多くのLinuxディストリビューションでデフォルトのNTPクライアントとして採用されるようになっています。

Chronyのインストールと基本設定

ここでは、CentOS/RHEL系のディストリビューションを例に、Chronyのインストールと基本的な設定方法を解説します。

1. Chronyのインストール

まず、パッケージマネージャーを使用してChronyをインストールします。

Bash
sudo yum update sudo yum install chrony

Debian/Ubuntu系の場合は、以下のコマンドになります。

Bash
sudo apt update sudo apt install chrony

2. Chronyの設定ファイル

Chronyの設定ファイルは、通常 /etc/chrony.conf にあります。このファイルを編集して、時刻同期の設定を行います。

Bash
sudo vi /etc/chrony.conf

2.1. サーバーの指定

Chronyは、指定されたNTPサーバーと通信して時刻を同期します。デフォルトでは、いくつかのパブリックなNTPサーバーが指定されていますが、組織内のNTPサーバーを利用したり、より信頼性の高いNTPプールを指定したりすることが推奨されます。

デフォルトの設定例:

# Use public NTP servers.
# By default, the pool directive is commented out.
# Uncomment and adjust to the servers you want to use.
# pool 2.centos.pool.ntp.org iburst
# pool 0.centos.pool.ntp.org iburst
# pool 1.centos.pool.ntp.org iburst
# pool 3.centos.pool.ntp.org iburst

推奨される設定例 (NTP Pool Project を利用):

pool ディレクティブを使用して、NTP Pool Project のサーバーを利用できます。iburst オプションは、Chrony起動時に迅速な同期を試みるために使用されます。

pool 0.pool.ntp.org iburst
pool 1.pool.ntp.org iburst
pool 2.pool.ntp.org iburst
pool 3.pool.ntp.org iburst

組織内のNTPサーバーを利用する場合:

server ntp.example.com iburst
server ntp2.example.com iburst

2.2. ローカルクロックの補正

Chronyは、リモートサーバーとの時刻差を計算し、ローカルクロックを微調整します。makestep ディレクティブは、初期同期時に大きな時刻差がある場合に、即座に時刻をジャンプさせる(設定された時間差を超えた場合にのみ)かどうかを制御します。

makestep 10 3

この設定は、「10秒以上の時刻差がある場合、3秒かけて時刻をジャンプさせる」という意味になります。初期同期時に正確な時刻に近づけるために有効です。

2.3. ネットワークインターフェースの監視

Chronyは、ネットワークインターフェースの状態を監視し、ネットワークが利用可能になった際に同期を試みます。hwclock ディレクティブは、ハードウェアクロック (BIOS/UEFI) との同期を設定します。

# Use NTP servers to set the system clock and step it.
# The default is to step the clock if the time is off by more than 3 seconds.
# makestep 10 3
#
# Get TAI-UTC offset and leap seconds information from the remote server.
#
# Use NTP servers to synchronize the system clock.
# The `logchange` option can be used to log significant clock changes.
# logchange 30

logchange 30 は、30秒以上の時刻変動があった場合にログに記録することを意味します。

2.4. ローカルNTPサーバーとしての利用 (オプション)

ChronyをローカルNTPサーバーとして機能させることも可能です。これにより、他のクライアントからこのサーバーへ時刻同期を要求できるようになります。

allow 192.168.1.0/24  # 許可するクライアントのIPアドレス範囲
local stratum 10       # ローカルNTPサーバーとしての優先度 (低いほど優先)

allow ディレクティブで、どのIPアドレス範囲からの同期要求を許可するかを指定します。local stratum は、Chronyサーバー自体の階層(ストータム)を指定します。

3. Chronyサービスの開始と有効化

設定ファイルの編集が完了したら、Chronyサービスを開始し、システム起動時に自動的に起動するように設定します。

Bash
sudo systemctl start chronyd sudo systemctl enable chronyd

4. Chronyの状態確認

Chronyが正常に動作しているか確認するには、chronyc コマンドを使用します。

  • chronyc sources: 同期に使用しているNTPサーバーの状態を表示します。^* で示されるサーバーが現在同期しているサーバーです。

    bash chronyc sources

    出力例: MS Name/IP address Stratum Poll Reach LastRx LastAdj Last Сервер ============================================================================== ^* time.nist.gov 2 6 377 13 -20ns +15ms ^+ ntp.example.com 3 6 377 25 -15ns +20ms Reach の値が 377 であれば、NTPサーバーとの通信が良好であることを示します。LastAdj で同期による調整量を確認できます。

  • chronyc tracking: Chronyデーモンの追跡情報を表示します。システムクロックとの差や、同期の精度などを確認できます。

    bash chronyc tracking

    出力例: Reference ID : 133.16.25.187 (ntp.example.com) Stratum : 3 Ref time (UTC) : 2024-07-26 10:30:00.123 System time : 2024-07-26 10:30:00.143 Wall clock : 2024-07-26 10:30:00.143 Last offset : -0.000000020 seconds RMS offset : 0.000000015 seconds Frequency : 1.000000005 ppm fast Residual freq : -0.000000002 ppm Skew : 0.000000001 ppm Root delay : 0.025 seconds Root dispersion : 0.004 seconds Update interval : 64 seconds Leap status : Normal System timeWall clock の差が少なく、Last offset が小さい値であれば、同期が正常に行われていることを示します。

Chronyの高度な設定と活用法

基本設定に加え、Chronyは様々なオプション設定により、より柔軟な時刻同期を実現できます。

1. サーバーの選択と優先度

server ディレクティブでは、接続するNTPサーバーを指定します。複数のサーバーを指定することで、単一障害点を排除し、より高い信頼性を確保できます。

server ntp1.example.com iburst
server ntp2.example.com iburst
server ntp3.example.com iburst

1.1. prefer オプション

特定のNTPサーバーを優先して使用させたい場合は、prefer オプションを追加します。

server ntp.internal.local iburst prefer
server pool.ntp.org iburst

この場合、Chronyは ntp.internal.local を優先的に使用しようとします。

1.2. source ディレクティブ (ローカル時刻源)

source ディレクティブは、Chronyがローカルのハードウェアクロックなどを参照元として利用する際に指定します。

source /dev/rtc0

2. 同期モードとドリフトファイルの活用

Chronyは、CPUリソースの消費を抑えるために、定期的に同期頻度を調整します。この調整は、システムクロックのドリフト(ずれ)を学習することによって行われます。

driftfile ディレクティブで、このドリフト情報を保存するファイルを指定します。Chronyは、このファイルに記録されたドリフト情報を参照し、システムクロックのずれを補正します。

driftfile /var/lib/chrony/drift

このドリフトファイルは、Chronyが再起動しても、以前の学習結果を保持するのに役立ちます。

3. rtcsync ディレクティブ (ハードウェアクロックとの同期)

Chronyは、システムクロックの同期だけでなく、ハードウェアクロック (BIOS/UEFI) との同期も行うことができます。rtcsync ディレクティブを使用すると、システムクロックが同期された後、ハードウェアクロックもそれに合わせて更新されます。

rtcsync 10

この設定は、10秒ごとにハードウェアクロックをシステムクロックに合わせます。これにより、サーバーの再起動後も、比較的正確な時刻が維持されるようになります。

4. タイムゾーンの設定

Chrony自体はタイムゾーンを直接管理しませんが、システム全体の時刻は、OSのタイムゾーン設定に依存します。timedatectl コマンドで確認・設定できます。

Bash
timedatectl list-timezones # 利用可能なタイムゾーン一覧を表示 sudo timedatectl set-timezone Asia/Tokyo # タイムゾーンを東京に設定

5. Chronyのチューニングとトラブルシューティング

5.1. 同期がうまくいかない場合

  • ファイアウォールの確認: ChronyはUDPのポート123を使用します。ファイアウォールでこのポートがブロックされていないか確認してください。
  • NTPサーバーへの到達確認: pingtraceroute コマンドで、指定したNTPサーバーに到達できるか確認します。
  • chronyc sources の確認: 同期に使用しているサーバーが ^* で表示されているか、Reach の値が低下していないか確認します。
  • ログの確認: /var/log/messages/var/log/chrony/chronyd.log (設定による) などを確認し、エラーメッセージがないか調べます。

5.2. 精度をさらに高めたい場合

  • より信頼性の高いNTPサーバーの選択: 公開NTPプールだけでなく、大学や研究機関が提供する、より低遅延で信頼性の高いNTPサーバーを利用することを検討します。
  • hard オプション: server ディレクティブに hard オプションを追加すると、Chronyは、指定されたNTPサーバーとの同期をより強く試みるようになります。ただし、これによりCPUリソースの消費が増加する可能性があります。 server ntp.example.com hard iburst

まとめ

本記事では、サーバーの時刻同期に不可欠なChronyの設定方法について、基本的なインストールから、chronyc sourceschronyc tracking コマンドを用いた状態確認、そしてpreferrtcsync といった高度な設定までを解説しました。

  • Chronyの重要性: サーバーの正確な時刻同期は、ログ管理、分散システム、セキュリティなど、システム運用における多くの側面で極めて重要です。
  • 基本設定: chrony.conf ファイルを編集し、信頼できるNTPサーバーを指定することで、迅速かつ正確な時刻同期が実現できます。
  • 状態確認とチューニング: chronyc コマンドで同期状態を把握し、必要に応じて設定を調整することで、より堅牢な時刻管理が可能になります。

この記事を通して、Chronyを効果的に設定・活用し、サーバーの信頼性と安定性を向上させるための知識とスキルを習得していただけたなら幸いです。今後は、ChronyをローカルNTPサーバーとして設定し、社内ネットワーク全体の時刻同期基盤を構築するなどの応用的な活用についても、記事にする予定です。

参考資料