NTPによる時刻合わせ



 rpmfind.netからダウンロードしてきた最新版のrpmファイルをインストールします。
# rpm -ivh xntp3-5.93-13vl2.i386.rpm
 接続するNTPサーバを決めなければなりません。
 http://www.eecis.udel.edu/~ntp/から、全世界の公開NTPサーバを知ることが出来ます。このホームページの"Public NTP Time Servers"を選択すると、一番下の箇所に、Public NTP Primary Time ServersPublic NTP Secondary Time Serversが選べるようになっていますが、Primaryが第1階層(stratum 1)、Secondaryが第2階層(stratum 2)のNTPサーバを意味します。

 ここでは、日本国内向けの公開NTPサーバ(133.100.9.2、133.100.11.8)を指定したいと思います。

 自宅に複数台PCがある環境では、全てのマシンが公開NTPサーバを参照するのではなく、LinuxサーバでNTPサーバを立ち上げて、そちらを参照するようにしてください。

 xntpのインストールが済んだら、NTPサーバにアクセスできるかをntpq(NTP query)コマンドを利用して確認します。

# ntpq -p 133.100.9.2
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*GPS_NMEA(1)     .GPS.            0 l    4   16  377    0.000    0.000   0.002
-drake.nc.fukuok .GPS.            1 u  304 1024  377    0.296    0.004   0.003
-clock.tl.fukuok .GPS.            1 u  282 1024  377    5.099   -0.874   1.422
-clock2.tl.fukuo .GPS.            1 u  278 1024  377    3.502   -0.140   0.136
+133.100.74.21   .CDMA.           1 u  524 1024  377    0.995    0.093   0.053
-133.100.53.51   .GPS.            1 u  295 1024  377    1.177    0.108   0.039
+ntp-b3.nict.go. .NICT.           1 u  289 1024  377   23.963    0.087   0.130
-geo.gen.u-ryuky .GPS.            1 u  273 1024  377   18.532    0.381   0.561
-zao.net.tohoku. .GPS.            1 u  415 1024  377   33.264    0.306   0.053
-ntp.nc.u-tokyo. .GPS.            1 u  370 1024  377   21.826    0.276   0.028
 rackety.udel.ed .PPS.            1 u  142 1024  377  203.256    1.995   0.120
 ntp1-2.Berkeley .WWVB.           1 u  132 1024  377  132.154   -0.929   0.253
 ntp01.sinet.ad. .GPS.            1 u  351 1024  377   22.658    0.091   3.543
 ntp02.sinet.ad. .GPS.            1 u   72 1024  377   22.224    0.263   0.340
 ntp11.sinet.ad. .GPS.            1 u  291 1024  377   26.080    0.182   0.089
 LOCAL(0)        .LOCL.           5 l   36   64  377    0.000    0.000   0.002
 上記の場合は接続に成功した例です(表示内容を知りたい人はこちらを参照)。

 時刻同期中状態、時刻同期完了状態は下記のとおりです。
時刻同期中の状態
サーバー名の前が空白は時刻同期中です。
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp1.jst.mfeed. 210.173.160.56   2 u  785 1024  377   12.102    0.073   0.508
 ntp2.jst.mfeed. 210.173.160.56   2 u  774 1024  377   12.271   -0.060   0.004
 ntp3.jst.mfeed. 210.173.160.56   2 u  861 1024  377   13.036    0.567   0.029
		
時刻同期完了の状態
サーバー名の前が *、+、- であれば時刻同期完了状態です。
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp1.jst.mfeed. 210.173.160.56   2 u 1002 1024  377   12.102    0.073   0.508
+ntp2.jst.mfeed. 210.173.160.56   2 u  991 1024  377   12.271   -0.060   0.004
*ntp3.jst.mfeed. 210.173.176.4    2 u   53 1024  377   12.942    0.455   0.142
 また、以下の2つ出力結果は全て失敗例です。原因としては、IPアドレスのタイプミスや、NTP(123)のパケットがフィルタリングされていることが考えられます。
# ntpq -p 192.168.76.1
ntpq: read: Connection refused
# ntpq -p  203.139.30.195
ntpq: read: Network is unreachable
 次にntpdateコマンドによって、NTPサーバの時間に合わせてみましょう。
注意※
 ntpd 起動時に大幅に時刻がずれていると ntpd が起動できないので、いったん、手動で時刻を合わせます。
# ntpdate 133.100.9.2
7 Dec 22:30:00 ntpdate[21895]: no server suitable for synchronization found
 上記は失敗です。ntpqコマンドでの接続確認は正常処理されているのに、ntpdateで時間をセットしようとすると失敗しました。これはルータの設定がLinuxサーバへの内向きのNTP(123)ポートは破棄するようにしているからです。この場合は、仕方ないのでNTP(123)ポートも開けましょう。
# ntpdate 133.100.11.8  ← 再度、ntpdateを起動
7 Dec 22:35:31 ntpdate[21972]: step time server 133.100.11.8 offset -178.284741
 今度は上手くいきましたので、NTPの環境を作成します。
 ntpdateコマンドをシステムブート時に起動したり、cronで一定時間ごとに起動してNTPクライアントとして時刻合わせする方法もありますが、Linuxサーバを立ち上げて、PCクライアントを接続/管理する環境を構築していますので、Linuxサーバでxntpdデーモンを起動してNTPサーバとして運用しましょう。これによってntpdateの起動は不要になり、PC側でNTPサーバの参照は、Linuxサーバにアクセスすることによって時刻合わせが可能になります。
 xntpdデーモンを起動すると常にxntpdがNTPソケットをオープンしているので、ntpdateが以下のメッセージで実行できなくなりますが、ntpdateで行なう処理は、xntpdが自動処理していますので問題ありません。
# ntpdate 133.100.9.2
10 Dec 01:14:40 ntpdate[15310]: the NTP socket is in use, exiting
 xntpデーモンを動かす上で最低必要なコンフィグレーションファイルは以下の2つです。
/var/lib/ntp/ntp.conf		NTPコンフィグファイル
/etc/ntp.drift		ドリフト・ファイル
 自分のサーバでの/etc/ntp.confファイルの設定は以下の通りです。serverで全ての日本国内向けの公開サーバを指定しています。
# vi /etc/ntp.conf
# ドリフトファイルを指定します。
# このファイルには、時刻のズレの傾向などが記録されます。変更する必要はありません。
driftfile       /var/lib/ntp/ntp.drift
# デフォルトは接続拒否
restrict default ignore 
#ローカルマシンからの接続は許可
restrict 127.0.0.1 
restrict -6 ::1
#組織内ネットワークからの時刻問い合わせにのみ応答する
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
#一方的に時刻を参照する上位NTPサーバからのNTP通信の限定
restrict 210.173.160.27 noquery nomodify
restrict 210.173.160.57 noquery nomodify
restrict 210.173.160.87 noquery nomodify
#時刻同期するNTPサーバの指定(個人でも利用な可能なNTPサーバを選択すること)
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
 その他の参考となる情報。
fudge clock_address stratum number
このオプションと次のserver 127.127.1.0の指定により、外部のNTPサーバに接続できないときに自ホストの時計で同期するようになります。外部NTPサーバにアクセスできないときのバックアップ的な役割として動作します。
multicastclient [ipaddress ...]
マルチキャストクライアントの設定です。マルチキャストグループアドレスに対するマルチキャストサーバメッセージを受け取ります。デフォルトでは、224.0.1.1をListenします。
broadcastdelay seconds
ブロードキャストおよびマルチキャストモードにおいて、ローカルとリモートの間のネットワークの遅延を測定します。通常はクライアントとサーバ間で自動的に初期のプロトコル交換で行われますが、例えばサービスのアクセス制御やネットワークに起因して失敗する場合があります。ここで指定する値は、このような状況におけるデフォルトの遅延時間です。通常イーサネットの場合は、0.003~0.007の間に指定します。指定を省略した場合には、0.004秒になります。
authenticate yes | no
上位のNTPサーバの認証キーがある場合には、yes を指定することで認証を行えます。
キーワード 解説
server 一方的に時刻を同期するNTPサーバを指定
peer 相互に時刻を同期するNTPサーバを指定
restrict 指定したNTPサーバとのNTP通信を許可
nto.confのキーワード

restrict address [mask mask] [flag][...]

オプション 解説 構文
ignore すべてのNTPパケットを無視 restrict <対象NTPサーバ> ignore
nomodify 時刻問い合わせに応答するが、時刻の変更要求などは無視 restrict <対象NTPサーバ> nomodify
nopeer 指定ホストと相互に同期しない restrict <対象NTPサーバ> nopeer
noquery NTPの実装に依存する時刻問い合わせを無視 restrict <対象NTPサーバ> noquery
noserve 時刻同期要求は拒否しますが、ntpq のクエリー(照会)は許可します。 restrict <対象NTPサーバ> noserve
notrust 時刻問い合わせに応答するが、自身の時刻合わせには使用しない restrict <対象NTPサーバ> notrust
restrictのオプション

 後は
# /etc/rc.d/init.d/xntpd start
で起動してください。
 サーバとして動作しているかどうかの確認方法は
# netstat -na
として、
udp		0	0 10.0.0.254:123	0.0.0.0:*
udp		0	0 192.168.0.254:123	0.0.0.0:*
のように表示されていればサーバとして動作しています。

 Linuxは立ち上がり時、BIOSが保持する時間をシステム時間としてセットします。これにより、立ち上がってからxntpdの補正が入るまで正確な時刻ではありません。これを解決するには、clockコマンドを使い正確なシステム時間をBIOS時間に書き込みます。
# clock;date	← clockはBIOS時間、dateはシステム時間を表示します。
Sun Dec 10 09:44:05 2000  -0.608239 秒	← BIOS時間の表示
Sun Dec 10 09:42:02 JST 2000	← システム時間の表示
  (約2秒BIOS時間が進んでいます。)
# clock -w ← システム時間をBIOS時間に書き込みます。
# clock;date	← 再度、BIOSとシステム時間を表示
Sun Dec 10 09:42:12 2000  -0.427271 秒
Sun Dec 10 09:42:11 JST 2000
  (ほぼ一致しました。)
 システム運用中は'clock -w'をcron登録し、定期的にNTPで補正された正確なシステム時間をBIOSに書き込みましょう。毎日0、12時に合わせるには、以下の行をcron登録します。
#vi /etc/cron.d/clock
0 0,12 * * *                       /sbin/clock -w
 viを終了して、chmodでrootのみに実行権を与え、
 crondデーモンを再起動する。
# /etc/rc.d/init.d/crond restart
 Windowsを使用している場合は、『TClock』をお奨めします(動作確認済みです)。『桜時計』を使用することもできますが、NTPサーバにLANカード(ボード)が2枚刺さっていると上手く動作しない場合があります。

/var/log/messagesに表示されるログについて

 xntpd[19679]: kernel pll status change 89

 xntp というNTP デーモンが、内部時計の進む速度をちょっと変えたよ、ということだと思います。