インターネットに接続されたマシンでは、正しい時計が大変重要だ。 たとえばメールのやり取りでは、秒単位でタイムスタンプを押すのだが、 そんなとき時計が狂っていたりすると、メールが過去や未来を行ったり来たりすることになってしまう。 ところがコンピュータに内蔵されたクロックは、近年の電子工学の進歩とは裏腹にいい加減な時間しか刻めず、1日に2秒ぐらいずれるのが当たり前のようだ。 そこで考えられたのが NTP (Network Time Protocol) だ。 NTP は、GPS や原子時計などとリンクした正しい時を刻めるマシンをサーバとし、時報情報を放送するためのプロトコルである。 クライアントは、時報を問い合わせて自分の時計をぴったり合わせることができるし、連続してサーバと交信し、常に時計を合わせ続けることもできる。 時報サーバの設置は正確な時計を用意しなければならず大変だが、クライアント設定は簡単なので、インストールしていないと「そんなことも管理できないの?」と白い目で見られてしまうことになる。
NTP をサポートするプログラムは2つある。 ntpdate と xntpd だ。 ntpdate は、その場で時報サーバを見に行って時刻を合わせてくれるプログラムで、起動時に電源の切れていたマシンの時計を補正するときや、cron を使って定期的に補正するときに使う。 xntpd はサーバとクライアント両方の働きをするデーモンで、自動的にローカルクロックをサーバに合わせて調整する機能と、他のホストへ時報を流す機能を持つ。
いずれにしても NTP で時報のサービスを受けるには、公開サーバを利用することになる。 多くの NTP サーバが日本を含め世界各地に立てられているが、それらは好意で無料公開してくれているサイトがほとんどだ。 だから、たとえば10台のマシンで時報を得ようとするなら、1台をローカル用のサーバとして外部のサイトから時報を得て、他の9台はそのローカル用サーバから時報を得るように設定すべきだ。 無用にトラフィックを増やすと相手に迷惑だし、負荷が増えれば時刻補正も困難になってしまう。
具体的なサーバ名はあえて書かないので、自分で探して見つけてほしい。 ネットワーク的な距離とトラフィックはもちろん、サーバの公開ポリシーなどもきちんと調べて、参照してよいかどうかを確認する。
手順はいたって簡単で、 /etc/rc.conf.local に次の行を追加するだけでよい。
ntpdate_enable="YES" ntpdate_program="ntpdate" ntpdate_flags="-s -b XXXXX" # サーバ名を指定する
オプションの意味は次の通り。
-s utpdate の出力を、syslog に吐く。 -b クロック修正を強制する。
時刻合わせの必要がシビアでなければ、xntpd ではなく ntpdate を使って、2時間に1度の補正を行うようにするとよい。 ntpdate はずれが 0.5 秒以下だと、時刻を変更するのではなく、クロックの誤差を修正しようとする。 設定は、cron を用いて ntpdate を定期的に起動するよう設定すればよい。 ntpdate は root でないと実行できない(クロックを変更できるのは root だけだ)。 root で crontab コマンドを使ってもいいが、/etc/crontab にエントリを追加するのもよい。 追加すべき内容は次の通り。
17 0-23/2 * * * root ntpdate -s XXXXX # サーバ名
オプションは -s だけにすること。 -b を指定すると強制的に時刻合わせをしてしまうので効率が悪くなる。
xntpd は時刻合わせにも、サーバとしても使える。 繰り返すが、10台のホストがあったら、10台とも外部の時報サーバを参照するのではなく、1台だけで参照するようにして、残りの9台はそれを見るように設定すること。
draftfile は、時計のずれ具合いの統計情報をとり、補正に必要な時差を保存するためのものである。 補正によってできるだけサーバへの負荷を減らすのが目的だ。server XXX.XXX.XXX.XXX # 適切なサーバを選んで指定する draftfile /etc/ntp.draft # マシンのクロックを補正するための情報ファイル
これで xntpd デーモンを起動して時間を合わせ続けるようになる。xntpd_enable="YES" xntpd_program="xntpd" xntpd_flags="-p /var/run/xntpd.pid"
最初にアスタリスク '*' がついていなかったり、st が 16になっていたり、disp が 16000.0 になっていたら、サーバとの交信がうまくいっていない。 ただし起動直後はしばらく切れているので、慌てて再起動せず、10分〜1時間ぐらい待つようにする。% ntpq -p remote refid st t when poll reach delay offset disp ============================================================================== *ntp.XXX.XX.XX .GPS. 1 u 19 64 377 61.97 -0.144 2.30
remote 参照しているサーバ名。 refid remote が参照している時刻。他のサーバだったり、GPS 時刻源だったりする。 st remote の階層 (stratum)。1 が時報源、2、3、4…と増えるに従い遠くなっていく。 t ピアの種類 (local、unicast、multicast、broadcast) when 最後にパケットを受信した時間。 poll ポーリング間隔。 reach 到達可能性レジスタ(8進数) delay 遅延の推定値 offset ずれ disp ばらつき