見様見真似の < NTP >

 ■ はじめに

Windows 機では、「桜時計」などのソフトウェアにより、 時刻サーバーが提供する正確な時刻情報を自分のマシンに反映することができます。 (Windows XP では、OS 自体にそうした仕組みを持っています。 コントロールパネル -> 日付と時刻 -> インターネット時刻)
同じことを、Linux 機で試みます。使用するプログラムは ntpd です。
ちなみに、時刻サーバーはセシウム原子時計や GPS から高精度の時刻情報を得ます。
また、時刻サーバーにアクセスが集中しないように、時刻サーバーは一次、二次・・・と階層化されています。
 ■ 確認

インストールされているかどうか確認します。

rpm -q ntp -> ntp-4.1.0-4
 ■ 設定

  1. /etc/ntp.conf を修正します。

    以下の2行をコメントアウトしました。
    これらは、自分自身の内部クロックを時刻情報源として使う場合の設定であり、 ほかの時刻サーバーを利用する場合は不要だそうです。

    # server 127.127.1.0
    # fudge 127.127.1.0 stratum 10

    以下の1行を追加しました。
    時刻サーバーを指定します。IP アドレスでも指定できます
    私は、地理的に近くの(ネットワーク的には不明?)大阪府立大学を指定しました。

    server eagle.center.osakafu-u.ac.jp

    driftfile /etc/ntp/drift -> そのまま

    driftfile には、自身の内蔵時計が進む傾向にあるのか、遅れる傾向にあるのか、 またそれはどの程度なのかが記録されます。

    broadcastdelay 0.008 -> そのまま

    authenticate no -> そのまま

  2. /etc/init.d/ntpd start で起動できます。

    システム起動時に起動させるときは、chkconfig や ntsysv などで設定します。
 ■ 動作確認

起動後の確認は ntpq コマンドで行います。

ntpq -p

remote refid st t when poll reach delay offset jitter
*eagle.center.os .GPS. 1 u 55 128 374 52.164 -10.954 53.366

のように、一番左に "*" が表示されていれば、参照同期中であることを意味します。

remote refid st t when poll reach delay offset jitter
 eagle.center.os 71.80.83.0 16 u 62 64 0 0.000 0.000 4000.00

のように、一番左に "*" が表示されてなかったり、st が 16 と表示されるときは、 参照同期が行われていません。

使い始めたばかりですが、どうやら 20〜60分 (?) くらいの周期で一番左に "*" が表示されたり、 されなかったり(stratum 値 1 < - > 16)を繰り返しているように見えます。

(追記)いつのまにか安定したようです。時期が悪かった?
そこで一つでは不安なので、気休めにもう四つ追加しました。(何のこっちゃ?)
  gps.kek.jp  文部科学省高エネルギー加速器研究機構
  ntp1.jst.mfeed.ad.jp
  ntp2.jst.mfeed.ad.jp
  ntp3.jst.mfeed.ad.jp
最後の三つは、独立行政法人・通信総合研究所とNTT、IIJ、 インターネットマルチフィードが2001年4月から実験的に公開しているサーバーです。
これだけ並べておけば、いつ見てもどれかに "*" が表示されています。

各項目の意味は、次のとおり(らしい)です。

一番左 "*" :参照同期中のサーバー
"#" :参照同期中だが,距離が遠いサーバー
"+" :参照リストにある(=好ましい)サーバー
" " :参照していないサーバー
"x" :参照リストから外れたサーバー(falsetick)
"-" :参照リストから外れたサーバー(outlyer)
"." :参照リストから外れたサーバー(excess)
remote 時刻サーバー
refid 参照ID(サーバーが参照しているマシンID。不明の場合は0.0.0.0)
remote が参照している時刻。他のサーバや GPS など。
st サーバーの stratum 値
(1 は一次サーバー, 2 は二次サーバー, 16 はサーバに接続できないことを示します)
t ピアの型(l:local, u:unicast, m:multicast, b:broadcast)
when いつ(何秒前に)最後のバケットを受信したか(秒)
poll ポーリングの時間間隔(秒)
最初は高速に同期ができるよう、この値は小さくなっています。
時計が同期状態になったら、ポーリング値はだんだん長くなり、 トラフィックや、時刻サーバの負荷を減らすようになっています。
reach 到達可能性に関するレジスタ・データ
時刻サーバへの直近8回分の接続結果を8ビットの8進数で示します。
全て成功していれば 377(2進数:11111111)です。
delay 通信による遅延の推定値、パケット往復時間(ミリ秒)
offset 時刻サーバーとのずれ(ミリ秒)
同期中は小さくなっていきます。つまりローカルの時刻がだんだん正確になっていきます。
jitter オフセット値の分散
小さい方が好ましく、正確な時刻同期が可能になります。
 ■ すぐには修正されない

NTP は、取得した時刻情報に基づいて計算した時刻のずれをそのまま修正することはせずに、 少しづつ修正します。
理由の一つは、時刻が急激に変わると異常動作するプログラムがあるからです。
もう一つの理由は、参照先のサーバーの時計が狂った場合にそれを検出できるからです。
自分自身の内蔵時計と「ずれ」の傾向を記録した driftfile から そこそこの精度で時刻が推定できます。 取得した時刻がそれと大きく違う場合には、参照先の時計が狂ったと判断します。

つまり、ntpd を起動してもすぐには正しい時刻にはなりません。
急いで時刻を合わせたいときには、次のようにします。

もし、ntpd が動作している場合には停めてから
    ntpdate サーバーのドメイン名 または IP アドレス

また、これまで述べてきた Linux が持っている時計は、 システムが起動するときに PC のハードウェア時計を参照することで、時刻を合わせます。 このハードウェア時計を合わせるコマンドは、次のとおりです。

    /sbin/hwclock --systohc

ハードウェア時計を、Linux の時計に合わせます。
(従って、このコマンドを実行する前に Linux の時計を正しく設定しておく必要があります。)

なお、shutdown 時に Syncing hardware clock to system time という表示が画面を流れますので、 わざわざ合わせなくても、このときにも同期がとられるようです。
 ■ 桜時計

最初にも書いたとおり、桜時計は、 Windows の時刻あわせをする有名なフリーソフトウェアです。 私も結構長く愛用させていただいてます。
さて、せっかく ntpd を導入したのですから、家の中の他の Win 機は、 この ntpd から時刻情報の提供を受けたいものです。 しかし、桜時計の参照先に 192.168.1.1 (インターネットゲートウェイ兼 NTP サーバー) を指定しても「ホスト確認エラー(11004)」となるばかり。
困って、作者のサポート用ゲストブックの過去ログを読ませていただくと・・・、 NTP サーバーを IP アドレスで指定したときに、 DNS が未指定で、かつ Hosts ファイルがないと発生する障害のようです。
そこで、Win 機の Windows ディレクトリ直下(注)に次のような Lmhosts ファイルを作成し、 桜時計の参照先を Lmhosts ファイルで指定したコンピュータ名(NetBIOS名:ntp.myhome) を設定することで無事動作しました。

(注)Windows95/95/Me の場合
WindowsNT/2000 では \Winnt\system32\drivers\etc
WindowsXP では \Windows\system32\drivers\etc

(Lmhosts)
192.168.1.1 ntp.myhome #PRE

Home