時刻同期サーバ

コンピューターの時間は、ちょっとほっておくとすぐ狂ってしまいます。

時間が狂っていると、メール送信時刻や転送時のタイムスタンプがおかしなことになって恥ずかしいです。
それに、テレホーダイ時間には 2 回線接続するように MN128 SOHO SL11 の設定を cron で切り替えるようにしていたので、時間が狂っていると無駄に電話代が掛かってしまいます。※1 それにビデオデッキの時計を合わせるのにいちいち 117 の時報を聞く必要はなくなりますよ。:)

インターネットには、ntp (network time protocol) サーバという現在時刻を提供するサーバがあります。 インターネットの ntp サーバに同期するように、ローカルにも ntp サーバを設置してしまいましょう。
そうすると、その他の PC はローカルの ntp サーバの時間を参照して自動的に時間を合わせるようにしてしまいます。

ここでの運用方針は、

私の場合、フレッツ ADSL を使ってエセ常時接続しているので常に時刻を同期させています。

常時接続できない場合には、ルータのフィルタで ntp ポート (port 123) へのパケットではダイアルアップしないようにしておけば、インターネットに接続されていれば同期する、接続されていなければ自分の時間を信じてサーバーとして稼動するようになります。

ここでは、上位の ntp サーバに clock.nc.fukuoka-u.ac.jp と clock.tl.fukuoka-u.ac.jp を使わせてもらって、設定していきます。上位の ntp サーバはなるべくネットワーク的に近いところを探してみてください。

ntpdate

FreeBSD には、二つの ntp プログラムが標準で含まれています。その一つが ntpdate です。

時間を合わせてみる

ntpdate は、他の ntp サーバから時間を取得して、自分の時間を合わせる働きをします。とりあえずコマンドラインで起動してみましょう。

# ntpdate clock.nc.fukuoka-u.ac.jp
10 Dec 15:12:23 ntpdate: step time server 133.100.9.2 offset -19.112674

19秒も時間が狂っていたようです。

自動起動の設定

では、これを利用して、マシン起動時に正確な時間に合わせるようにします。rc.conf で ntpdate を有効にし、ntpdate_flags に上位の ntp サーバ clock.nc.fukuoka-u.ac.jp を指定します。

denta:masaya./etc$ grep ntpdate /etc/defaults/rc.conf >>/etc/rc.conf
# vi /etc/rc.conf
ntpdate_enable="YES"       # Run ntpdate to sync time on boot (or NO).
ntpdate_program="ntpdate"  # path to ntpdate, if you want a different one.
ntpdate_flags="clock.nc.fukuoka-u.ac.jp"    # Flags to ntpdate (if enabled).

ここでは、clock.nc.fukuoka-u.ac.jp と FQDN※2 で指定しています。これは ntp のポートがダイアルアップトリガにならないように設定されていた頃のなごりで、DNS 問い合わせで回線を接続させるために IP アドレスでは指定していませんでした。

これで設定は終了。起動時に正確な時間に時計を合わせてくれるようになりました。

以前は、ダイアルアップルータ(MN-128SOHO)を使っていたのでよかったのですが、現状では、フレッツ ADSL のダイアルアップルータとして利用されるようになり、ppp で回線を接続する前に ntpdate が実行されてしまうため ntpdate を使うのはやめました(再起動しないし・・・)。
ppp を使ってダイアルアップするなら、/usr/local/etc/ntpdate.sh などを用意して ppp 起動後に実行する必要があります。その場合、ntpd もntpdate 終了後に起動するようにしなければいけません。

ntpd

ntp サーバプログラム ntpd は、常に上位サーバを参照して時間を同期しながら、他の PC への時間の提供をおこなってくれます。

ntp.confの作成

/etc/ に ntpd の設定ファイルを作成します。

参照先サーバとして、clock.nc.fukuoka-u.ac.jp と clock.tl.fukuoka.u.ac.jp を指定しています。ここには複数のサーバを指定してかまいません。一番信頼できると思われるサーバを自動的に選択して同期してくれます。

ここでの参照先サーバは、DNS パケットが飛ばないように IP アドレスで指定しておきます。

server 行 server 127.127.1.0 では、自分自身を参照先として指定しています。これは次の fudge にて階層番号を 5 としているので、参照される優先度は低くなっています。※3

次に、restrict 行で IPアドレス毎のルールを設定しておきます。

最後に、周波数補正用のドリフトファイルの保存先を指定します。これについてはよくわからないのですが、ドキュメントによるとドリフトファイルがないと時間誤差が収まるのに数時間かかるらしいので指定しておきます。

# vi /etc/ntp.conf
server 133.100.9.2 #clock.nc.fukuoka-u.ac.jp
server 133.100.11.8 #clock.tl.fukuoka-u.ac.jp
server 127.127.1.0
fudge  127.127.0.1 stratum 5
restrict default ignore
restrict 127.0.0.0 mask 255.0.0.0
restrict 192.168.1.0 mask 255.255.255.0 noquery nopeer notrust
restrict 133.100.9.2 noquery
restrict 133.100.11.8 noquery
driftfile /etc/ntpd.drift

起動テスト

設定ができたら、さっそく起動してみましょう。

# ntpd -p /var/run/ntpd.pid

/var/log/messages を確認して、正常に起動したか確認しておきます。

# tail /var/log/messages
Dec 10 16:11:24 denta ntpd[2417]: ntpd 4.0.99b Mon Nov 20 11:27:20 GMT 2000 (1)
Dec 10 16:11:24 denta ntpd[2417]: using kernel phase-lock loop 2001
Dec 10 16:11:24 denta ntpd[2417]: using kernel phase-lock loop 2041

動作テスト

ntpd の動作確認は ntpq というコマンドで行います。

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*clock.nc.fukuok .GPS.            1 u  188  512  377   85.419   -2.075   0.438
+clock.tl.fukuok .GPS.            1 u  195  512  377   87.690   -0.688   9.396
 LOCAL(0)        LOCAL(0)         3 l   54   64  377    0.000    0.000   0.000

起動後同期するまでにしばらく時間がかかります。

上記出力のように、* 記号が付いているサーバに同期しています。+ 記号は次候補として選択されているけど同期対象にはなっていないサーバです。

同期が完了したら他のマシンに時刻を提供することが出来るようになります。

自動起動の設定

正常に起動できることが確認できたら、rc.conf を書き換えて自動起動するようにします。

# grep ntpd /etc/defaults/rc.conf >>/etc/rc.conf
# vi /etc/rc.conf
xntpd_enable="YES"    # Run ntpd Network Time Protocol (or NO).
xntpd_program="ntpd"  # path to ntpd, if you want a different one.
xntpd_flags="-p /var/run/ntpd.pid"  # Flags to ntpd (if enabled).

クライアントの設定

UNIX 系 OS

サーバと同じように ntpd を使ってローカルの ntp サーバに同期させればよいでしょう。

# vi /etc/ntp.conf
server [local ntp server IP] prefer
driftfile /etc/ntpd.drift

もしくは、cron で一定時間ごとに ntpdate を実行しても良いと思います。この例では、毎時 0 分に時刻修正を行います。

# vi /etc/crontab
0   *   *   *   *   root    ntpdate [ntp server IP] >/dev/null 2>&1

Windows

桜時計などで ntp サーバに同期させるか、ustdate などを起動時や一定時間ごとに実行するようにすればよいと思います。

Windows2000 には sntp 機能があります。設定方法は Windows2000 memo に書いてあります。(でも、これって本当に時間合わせてるのかなぁ)

参考文献

  1. ntpdate, ntpd, ntp.conf, ntpq, ntptrace man page
  2. Time WWW server
  3. Running-Dog.net 「FreeBSD3.3-RELEASE セットアップ」
    xntp 時刻同期サーバ。
  4. FreeBSD-users-jp 47827
    About NTP Server のスレッド
  5. FreeBSD-beginners-jp 313  
    Re: ダイヤ ルアップで ntp サーバに
  6. FreeBSD Q&A Q&A 392
    Q. Windows95/98 を含む LAN で時刻を同期させたいのですが、どうしたら よいのでしょうか?

注釈

※1 時間の誤差
誤差を予想してある程度余裕はとってありますけど、所詮それ以上時間が狂ったら同じ事なので、やっぱり時計は正確な方がいいと思います。
一度設定してしまえば、自動的に時間合わせてくれるわけですし。:)
※2 FQDN (Fully Qualified Domain Name)
完全修飾ドメイン名。ドメイン名まで含んだホスト名のこと。たとえば、www.freebsd.org とか。
※3 階層番号
ntp サーバでは、大元のサーバから参照されるたびに階層番号を増やしていく。
ちなみに clock.nc.fukuoka-u.ac.jp の階層番号は 1 なので、それを参照している ローカル ntp サーバの階層番号は 2 になる。
ntptrace を実行してみると、大元のサーバまでの階層をたどって表示することが出来る。