ntp で時刻同期

NTP はネットワークを利用して各マシンの時刻を同期させるプロトコルである。 このメモ記述時の NTP プロトコルのバージョンは 3 で、RFC1305 で定義されており、 port 123 を使用する。NTPプロトコルは、それぞれのリソースの機能別に、

  • 正確な時刻を保持している「クロックソース」
  • クロックソース、あるいはより信頼できる上位サーバから提供される時刻を 利用して自分の時刻を保持し、他のマシンあるいは下位のサーバに時刻を提供する 「NTP サーバ」
  • NTP サーバから時刻を提供される「クライアントホスト」

の 3 つにより構成される。以下にそれぞれを説明する。

「クロックソース」は時刻源と呼ばれる。 GPS(Global Positioning Satellite)衛星レシーバ、 WWV(米国)/JJY(日本)等の標準電波の受信機、 CDMA の受信機、セシウム原子時計などの装置が時刻源として用いられる。 これらの装置は非常に正確な時刻(誤差±1μ秒未満)を保持していることが期待され、 RS-232C等のインタフェースによって接続されたNTPサーバに時刻を伝える役割を持つ。 個人ユースでは、ラジオの時報や電波時計などを時刻源に用いることもできる。

「NTP サーバ」には後述のソフトウェアをインストールしたワークステーション、 あるいはバージョン 9.21 以降のソフトウェアを搭載した CISCO ルータなどを 用いることができる。 トラフィックを分散し、NTPサーバの過負荷を防ぐため、 通常、NTP サーバは階層的に配置される。 この階層(stratum)は15まで取ることが出来る。

「クライアントホスト」は最寄りの NTP サーバから時刻を入手する。 NTP サーバおよび NTP クライアントを効率的に運用することで、 組織内のすべてのホストの時刻を同期させることができる。

NTP サーバのうち、クロックソースから直接時刻を入手しているサーバは特に 「階層1サーバ」と呼ばれる。 階層1サーバはクロックソースから時刻を直接入手しているため、 正確な時刻を保持していることになる。 また、別々のクロックソースから時刻を入手している階層1サーバ同士で 同期をとりあうことにより、 より信頼度の高い時刻を提供することが可能となる。 通常、階層1サーバは少なくとも2つ以上の別の階層1サーバ同士で 同期を取り合うことが推奨される。

日本にはいくつかの階層1サーバがある。 しかしながら、ネットワークに接続されているすべてのホストが これらの階層1サーバを参照することは、 サーバの負荷、トラフィックの集中等を考慮した場合に問題と考えられる。 実際、福岡大学ではトラフィック増大が深刻な問題になったことがある。

ntp を喋れるならば、ソフトウェアには何を使っても構わない。 FreeBSD は標準でサーバもクライアントも備えている。 ports には OpenNTPD もある。

設定

/etc/ntp.conf に設定を行う。 使用しているプロバイダや LAN の状況に合わせて 適切な上流サーバを選定する必要がある。 FreeBSD では、例えば以下のように設定する。

server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
driftfile /etc/ntp.drift

このシンプルな設定で、クライアントになると共にサーバにもなる。 ドリフトファイルはサーバ開始前に touch などで作成しておく。 /etc/rc.conf にて ntpd を有効にするよう設定を行う。

xntpd_enable="YES"

新しいシステムでは変数名が「ntpd_enable」に変更されている。 /etc/defaults/rc.conf を参照して、適切な変数を設定すること。

マシンを再起動するか、もしくは /usr/sbin/ntpd -p /var/run/ntpd.pid などとして サーバを開始する。 rcNG ベースでは、/etc/rc.d/ntpd が制御スクリプトである。

確認

同期状態は ntpq コマンドで確認することができる。 各シンボルや表示フィールドの内容について以下にメモしておく。

シンボル意味説明
*peer. 選択され、同期した。
+candidate.選択の候補。
#selected. 選択の候補にはなったけれども距離が遠い。
' 'reject. 遠いので候補にならなかった。または、調査中。
xfalsetick.通信相手は偽時計として捨てられた。
-outlyer. 通信相手は遠すぎるので捨てられた。
remoteリモートサーバの名前。
refid リモートサーバが参照しているホスト (もしくはクロックソース)。
st リモートサーバが位置する階層 (ストレイタム)。
t リモートサーバの種類。 u:unicast, b:broadcast, m:multicast, l:local。
when 最後のパケットを受信してからの経過時間。単位は 秒。
poll ポーリング間隔。単位は 秒。
reach 到達可能性レジスタの 8 進数表現。
delay ポーリングの遅延見積り。単位は ミリ秒。
offset階層のオフセット。単位は ミリ秒。
disp 階層の分散。単位は ミリ秒。

refid にはリモートサーバが参照している「何か」が表示されるはずだが、 時おり「73.78.73.84」や「83.84.69.80」といった見慣れない表示が出ることがある。 これは、リモートサーバの状態を 10 進数値で表したものである。

73.78.73.84
 I  N  I  T  ... リモートサーバは初期化中である。

83.84.69.80
 S  T  E  P  ... リモートサーバは同期中である。

このような状態のリモートサーバに対しては時刻を同期できないので、 辛抱して待つか、別のリモートサーバに同期することになる。

[$Revision: 1.4 $ $Date: 2006.11.25 20:18:07 $]
[EOF]