Amazon LinuxでChrony(ntpd代替)を利用する

アイキャッチ AWS EC2

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
EC2インスタンスの運用において、NTPサーバーとの時刻同期は非常に重要です。時刻がずれてしまうとシステムログやアプリケーションログの時系列に不整合が発生しますし、AWS APIへのコールでは時刻がずれているとシグネチャが不適切とエラーレスポンスが返ってくることもあります。EC2インスタンスは仮想マシンとして動作するため、物理マシンに比べて時刻がずれやすいという特性もあります。

従来Linuxでは、NTPサーバーとの時刻同期に永らくntpdが利用されてきましたが、最近RHEL/CentOSのデフォルトのNTPデーモンがChronyに変わったと聞いたので、Amazon Linuxでも利用できるか試してみました。

Chronyとは

Chronyは、NTPクライアントとNTPサーバーの実装のひとつです。NTPのリファレンス実装であるntpdとは異なる時刻同期アルゴリズムを採用しているため、より効率良く正確な時刻同期を提供します。ntpdとの比較は、以下が詳しいです。

セットアップ手順

動作確認環境

  • Amazon Linux AMI 2014.09.1 (HVM) - ami-4985b048(東京リージョン)

Amazon Linuxのyumリポジトリには、Fedoraからポーティングしたと見られるchronyパッケージが用意されています。でデフォルトではインストールされておらず、またntpパッケージ(ntpd)と競合するため、先にntpパッケージをアンインストールしてから、chronyパッケージをインストールします。

$ sudo yum install chrony
読み込んだプラグイン:priorities, update-motd, upgrade-helper
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ chrony.x86_64 0:1.29.1-1.8.amzn1 を インストール
--> 衝突を処理しています: chrony-1.29.1-1.8.amzn1.x86_64 は ntp と衝突しています
--> 依存性解決を終了しました。
エラー: chrony conflicts with ntp-4.2.6p5-2.22.amzn1.x86_64
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
$ sudo yum remove -y ntp
  :
削除しました:
  ntp.x86_64 0:4.2.6p5-2.22.amzn1

完了しました!
$ sudo yum install -y chrony
  :
インストール:
  chrony.x86_64 0:1.29.1-1.8.amzn1

完了しました!
$

デフォルトではchronyサービスが無効になっているので、有効化し起動します。

$ chkconfig --list chrony
chrony         	0:off	1:off	2:off	3:off	4:off	5:off	6:off
$ sudo chkconfig chrony on
$ chkconfig --list chrony
chrony         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
$ sudo service chrony start
Generating chrony command key:                             [  OK  ]
Starting chronyd:                                          [  OK  ]
$

これでOKです。

動作確認

Chronyに含まれるNTPサーバーはchronyd、設定ファイルは/etc/chrony.confです。ntpdと同様、デフォルトの設定でNTPプールのNTPサーバーを参照するように設定されているので、特別な要件がなければ、そのまま利用して問題ありません。

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.amazon.pool.ntp.org iburst
server 1.amazon.pool.ntp.org iburst
server 2.amazon.pool.ntp.org iburst
server 3.amazon.pool.ntp.org iburst
  :

Chrony同梱のNTPクライアントはchronycコマンドです。ntpdのntpqコマンドに対応します。同期しているNTPサーバーの一覧は、chronyc sourcesでリストします。

$ chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 60-56-214-78f2.kns1.eonet     1   6   377    32   +283us[ +440us] +/- 8193us
^- 7c2956c8.i-revonet.jp         2   6   377    33   +839us[ +995us] +/-   31ms
^- gw1.kohaaloha.com             2   6   377    34  -6447us[-6291us] +/-   37ms
^- 122x215x240x75.ap122.ftth     2   6   377    33   -622us[ -465us] +/-   33ms
$

先頭のM列が^はNTPサーバーを指します。2番目のS列では、*が現在の同期元、+が同期候補、-が候補外を示します。時刻同期が動作していることが確認できますね。

まとめ

Chronyは、ntpdと比べて目に見えて違いが出るわけではありませんが、ntpdでの運用に問題が出てきたときの代替案として検討する価値はあると思います。また、RHEL/CentOSと同様、今後ntpdからChronyにデフォルトが切り替わる可能性もありますので、一通りの使い方をマスターしておくのも良いでしょう。