vmware
ntp

VM上のNTPDが正しく同期しない

More than 3 years have passed since last update.

昔別ブログで書いた記事ですが、Qiitaでも転載します。


VMでNTPDが正しく同期してくれない

以前、OVA形式として出力したVMwareのVMを、新たなホスト上に展開した時、

NTPDの時刻同期が正しく実行されないことがありました。

"正しく実行されない"という曖昧な言い方をしたのは、

ntpq -pコマンドで同期状態を確認すると、

正しく同期できているように見えるのですが、時刻がとんでもなくずれている状態だったためです。

※以下イメージです。

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================
* XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX 3 u 408 512 377 2.056 123456.789 101.351

他の何かの時刻同期サービスと競合しているのか?と疑いましたが、

vmware toolsの時刻同期くらいしかそもそも競合ソフトがなく、そちらはOFFになっていました。


frequency error 5xx PPM exceeds tolerance 500 PPM

情報を求めてsyslogを眺めていると、下記のようなntpdプロセスのログが大量に出ていました。

frequency error 512 PPM exceeds tolerance 500 PPM

PPMとは"Parts-per-Million"の略で、時刻の進み方の誤差を表しています。

ntpdは「自身のサーバの腹時計がどれくらいずれやすいか」を正しい時計と見比べて認識しており、

この情報を/var/lib/ntpd/driftというファイルに定期的に出力しています。

この機能は、親ntpdサーバとの同期頻度を抑えるための機構です。

16秒に1回、32秒に1回、64秒に1回・・・と徐々に同期回数を減らすことで、ntpdプロセスが使うリソースを抑えることができます。

同期頻度を下げた場合においても、時刻ズレが発生しないようにしているんですね。

NTPDは、このPPMが一定のしきい値に達すると「なんかおかしいぞ」とエラーをあげます。

PPMが大幅に大きくなってしまうと、同期周期の間に(正しいかは別として)大きく補正をかけてしまうためです。

その場合は、下記のようにdirftファイルを削除して再起動することで、一旦リセットすることができます。

# /etc/init.d/ntpd stop

# rm /var/lib/ntpd/drift
# /etc/init.d/ntpd start

これで正しく同期されるようになりました。

一件落着ですね。


なぜPPMの値が大幅にずれてしまったのか

サーバの腹時計のズレ具合は、サーバのCPUクロック周波数などの主にハードウェア周りに依存します。

ここで肝なのが、VMの場合はハードウェアがホストによって変わってしまうことにあります。

今回のケースでは、一定時間稼働していたVMをOVAとして出力し、それを別ホストに配備して起動しました。

以前のホスト上でもntpdプロセスは稼働しており、そちらの環境で/var/lib/ntpd/driftファイルは作成済でした。

この状態で新たなホスト上でntpdプロセスを稼働させると、別環境上で作成したdriftファイルを参照してしまいます。

違う腹で動いていた時計の傾向など、なんの参考になりません。

これを参考にして稼働させていると、徐々に時刻が狂いだすのではないかと僕は考えています。


VMコピーしたらdriftファイルを削除する

この事象を受けて、個人的におまじないとして「VMコピーしたらdrift削除」をいつもやるようになりました。

特に引っ越しに引っ越しを重ねてきたVMは、多くの場合、offsetが思っていた以上に落ち着きません。

誤差といえば誤差ですが、チリツモですね。

この事象に出会ったのは2,3年前ですので、

最近ではVMのエミュレート能力向上に伴い、大幅なズレは発生しないかもしれません。

それでもなんとなくいつもdriftファイルは消してます。


【余談】Chronydについて

先日、CentOS7を初めて触る機会があったのですが、

長く親しんだntpdが不採用になったと聞いて少し悲しい気持ちになりました。

Chronydでもdriftファイルってあるのかなと思い設定ファイルを見てみましたが、

/var/lib/chrony/driftという場所にありました。

おまじないはソフトが変わっても健在しそうです。


余談中の余談

ntpdについて調査していた時に、下記サイトをよく見ていました。

とてつもなく詳しく、わかりやすくntpdの仕組みが書かれています。

参考:NTP設定

作者さまには陰ながら心より感謝しています。

ブックマークにいれて、ntpdトラブル時等に毎回閲覧させて頂いています。