ここでは、ネットワーク上のサーバー及びクライアントマシンの時刻同期をとるためのプロトコルであるNTP(Network
Time Protocol )について解説していきます。PCの時刻はマザーボード上のリアルタイムクロック(RTC)によって時間が表示されていますが、この時間はあまり正確ではなく、毎日少しづつ時間が狂っていきます(電池の消耗度にもよりますが、年間約10分程度)。NTPサーバーは、タイムサーバーに接続されたラジオ・クロックや原子時計から時刻を取得し、UTC
(協定世界時)に同期させることができます。PCの時刻が狂っていると、メールの送受信時刻が狂ったり、こまめにとっているログの取得時間なども狂ってくることになります。Linuxでは標準でNTPサーバーが付属しているので是非、活用して時刻同期を行いましょう。
|
|
■NTPサーバーのインストール
$ su -
# rpm -ivh ntp-4.1.2.0.rc1.2.i386.rpm |
|
■自動起動の設定
ランレベル3と5でntpd が自動起動するように設定します。
# chkconfig --level
35 ntpd on
# chkconfig --list ntpd
ntpd 0:オフ 1:オフ 2:オフ 3:オン4:オフ 5:オン6:オフ |
|
■/etc/ntp.confの編集
それでは、/etc/ntp.conf を開いて環境に合わせて編集していきます。「server 127.127.1.0」はNTPサーバーと同期化できなかった場合には、リアルタイムクロック(RTC)を使用するという意味です。「fudge
127.127.1.0 stratum 10」では、Stratum(以下後述)を10と設定することでRTCの優先順位をさげていることを示しています。以降で、上位NTPサーバーを追加していくので「#」をつけてコメントアウトしてしまっても構わないです。
#server 127.127.1.0
# local clock
#fudge 127.127.1.0 stratum 10 |
|
次に上位NTPサーバーを追加していきます。NTPは階層構造になっており、最上位の階層に位置するNTPサーバーをStratum-1(ストレータム1)といい、日本では福岡大学に公開NTPサーバーが2台設置してあります。また、Stratum-2(ストレータム2)以下は最終的には最上位(Stratum-1)のNTPサーバーと同期するようになっており、公開NTPサーバーとしては、独立行政法人通信総合研究所、NTT、IIJ等が共同研究の一環で運営しているものが3台あります。以下にNTPサーバーを記しましたのでいずれかのNTPを利用してください。また、自分が加入しているプロバイダが公開NTPを提供していることもあるので、プロバイダのHPなども参照してみてください。
◎日本の代表的な公開NTPサーバー
|
Stratum |
ホスト名 |
IPアドレス |
|
Stratum-1 |
clock.nc.fukuoka-u.ac.jp |
133.100.9.2 |
|
Stratum-1 |
clock.tl.fukuoka-u.ac.jp |
133.100.11.8 |
|
Stratum-2 |
ntp1.jst.mfeed.ad.jp |
210.173.160.27 |
|
Stratum-2 |
ntp2.jst.mfeed.ad.jp |
210.173.160.57 |
|
Stratum-2 |
ntp3.jst.mfeed.ad.jp |
210.173.160.87 |
|
ここでは、福岡大学のNTPサーバーを利用していくことにします。「# --- OUR TIMESERVERS
-~」の箇所に以下の4行を追記します。server ステートメントは利用する公開NTPサーバーのアドレスを記述します。また、restrictでは、自分のPCへのアクセスを許可するIPアドレスを指定します。notrust
は時刻の問い合わせ拒否、nomodify は変更要求の拒否、notrap はメッセージ・トラップ・サービスの拒否を表しています。
# --- OUR TIMESERVERS
-----
# or remove the default restrict line
# Permit time synchronization with our time
source, but do not
# permit the source to query or modify the
service on this system.
# restrict mytrustedtimeserverip mask
255.255.255.255 nomodify notrap noquery
# server mytrustedtimeserverip
restrict 133.100.9.2 mask 255.255.255.255
notrust nomodify notrap
restrict 133.100.11.8 mask 255.255.255.255
notrust nomodify notrap
server 133.100.9.2
server 133.100.11.8
|
|
同様に、自宅内のネットワーク(クライアントマシン)からも時刻同期の要求を許可する記述をしてあげる必要があります。
# -- CLIENT NETWORK -------
中略
restrict 172.16.50.0 mask 255.255.255.224
notrust nomodify notrap
restrict 172.16.51.0 mask 255.255.255.240
notrust nomodify notrap
|
|
「driftfile /etc/ntp/drift」は、内部時計と実際の時間とのズレを記録するファイルのパスを指定しています。
■NTPサーバーの再起動
以上の設定を終えたら、サーバーを再起動して設定を有効にします。
# /etc/init.d/ntpd restart
ntpdを停止中: [ OK ]
ntpdを起動中: [ OK ]
|
|
■NTPの動作確認
それでは、上記で設定したNTPサーバーにきちんと接続できているかどうかを「ntpq -p」コマンドを使用して確認します。アスタリスク
"*" が左端に表示されれば、それが現在参照中のNTPサーバーであることを表しています。以下の出力結果の意味については下記表を参照してください。
# ntpq -p
remote refid st t when poll reach delay offset jitter
============================================================================
*clock.nc.fukuok .GPS. 1 u 62 128 367 39.471 -11.038 1.311
+clock.tl.fukuok .GPS. 1 u 63 128 377 39.356 -11.571 0.388
|
|
なお、ntp -p 実行時に、
No association
ID's returned と表示された場合は、NTPサーバーとの同期がとれていません。/etc/ntp.conf
の内容をもう一度よく確認してください。また、上位NTPサーバーにping を打って正常に通信できているかどうかチェックしてみてください。
◎ntpq -pの出力の意味
|
"*" |
参照同期中のサーバーを表している |
|
"+" |
クロック誤り検査に合格したサーバー |
|
"#" |
参照同期中ではあるが、距離が遠いサーバー |
|
" " |
左に何も表示されない場合(空欄)、サーバーを参照していない |
|
"x" |
クロック誤り検査に不合格となったサーバー |
|
". " |
参照リストから除外されたサーバー |
|
refid |
上位NTPサーバーが参照しているホスト名 or IPアドレス |
|
st |
上位NTPサーバーの階層 |
|
t |
階層のタイプ l:local、u:unicast、m:multicast、b:broadcast |
|
when |
最後のパケットを受け取ってからの時間(秒) |
|
poll |
問い合わせを行う間隔(秒) |
|
reach |
到達可能性に関するレジスタ・データ(8進数) |
|
delay |
推定遅延(ミリ秒) |
|
offset |
偏差補償(ミリ秒) |
|
jitter |
RMS Jitterの平均値(ミリ秒) |
|
■時刻の即時調整
上記で設定したNTPは時間が即座に調整されるというわけではなく、システムに問題が発生しないように徐々に時間を調節していきます。けれども、UTCの時刻と内蔵時計の差があまりに狂っている場合は時間が調整されるまで時間がかかってしまいます。そこで、ntpdateコマンドを使用することで現在の時刻を即座に調整しておきます。書式は、「ntpdate
"NTPサーバー名"」です。
# ntpdate clock.nc.fukuoka-u.ac.jp
13 Dec 03:06:36 ntpdate[4026]: adjust
time server 133.100.9.2 offset -0.002717
sec
|
|
なお、コマンド実行時はNTPサーバーを停止させておかないと「
the NTP socket is
in use, exiting」というエラーメッセージが表示されますのでNTPサーバーを一旦、停止させてから再度起動するようにしてください。
# ntpdate clock.nc.fukuoka-u.ac.jp
5 Jan 14:37:17 ntpdate[8613]: the
NTP socket is in use, exiting
# /etc/init.d/ntpd stop
ntpdを停止中: [ OK ]
# ntpdate clock.nc.fukuoka-u.ac.jp
5 Jan 14:38:14 ntpdate[8633]: adjust time
server 133.100.9.2 offset 0.012635 sec
|
|
■/etc/ntp/step-tickers
また、/etc/ntp/step-tickersに公開NTPサーバーのホスト名を記述しておくことでシステム起動時に時刻調整を行った後で、NTPを起動するようになります。
# vi /etc/ntp/step-tickers
clock.nc.fukuoka-u.ac.jp
|
|
以下のように編集したらNTPの再起動を行ってみてください。通常の再起動に加えて、「ntpd:時間サーバと同期中:」という操作が追加されました。
# /etc/init.d/ntpd restart
ntpdを停止中: [ OK ]
ntpd:時間サーバと同期中:
[ OK ]
ntpdを起動中: [ OK ]
|
|
■LinuxクライアントをNTPサーバーと同期させる
自宅内のLinuxクライアントを、自宅内のNTPサーバーと時刻同期させてみます。外部NTPサーバーを指定しても構いませんが、外部への余計なトラフィックを抑えるため、LAN内で解決させます。単に即時的にNTPサーバーと時刻同期を行うためには以下、コマンドを実行します。
# /usr/sbin/ntpdate 172.16.50.2
26 Apr 01:34:15 ntpdate[3979]: adjust
time server 172.16.50.2 offset -0.000030
sec
|
|
もし、定期的に時刻同期を行うのであれば、cron を用います。1日に1回、時刻同期を行うのであれば、/etc/cron.daily/ntp.cron
として以下のように記述し、保存しておきます。
# vi /etc/cron.daily/ntp.cron
#!/bin/sh
/usr/sbin/ntpdate 172.16.50.2
|
|
実行権も付与させておきます。
# chmod 755 /etc/cron.daily/ntp.cron
|
|
■リアルタイムクロック(RTC)との同期化
マザーボード上のリアルタイムクロックとも時刻の同期を行っておきます。先頭の"hw"はハードウェアの略です。
■システムクロックの設定
dateコマンドで時間を表示し、dateの後ろに数字を付け加えると時刻の設定を行うことができます。
数字は左から、「月 日 時 分 年」となっており、以下では2003年12月14日22時10分に設定しています。
# date
2003年 12月 13日 土曜日 04:13:25 JST
# date 1214221003
|
|
■タイムゾーンの設定
いくら時刻を調整したとしてもタイムゾーンが正しく設定されていなければ、正しい時刻を表示してくれません。date
コマンドを実行し、以下のように「JST」と表示されていればOK です。協定世界時の場合は、UTCと表示され、日本の時刻より9時間前の時間が表示されます(時差が9時間)。
# date
Thu Sep 2 23:20:42 JST 2004
|
|
もし、上記コマンド実行時に、JST と表示されていない場合は時刻が日本に設定されていないので正しく設定しなおします。タイムゾーンを設定するには環境変数TZを以下のように指定します。
環境変数TZをアンセットするにはunset コマンドを使用します。
タイムゾーンを設定する方法として、/etc/localtime ファイルを使用することもできます。実際に/etc/localtime
を編集するのではなく、/usr/share/zoneinfo/ 以下にある各タイムゾーンファイルにシンボリックリンクを張っておきます。たとえば、東京に時刻を合わせる場合には、以下のようにします。なお、タイムゾーンが日本以外の場合で、指定すべきタイムゾーンがわからない場合は、
tzselect
コマンドを使って調べることができます。
# ln -sf /usr/share/zoneinfo/Asia/Tokyo
/etc/localtime
|
|
■Windows クライアントをNTPサーバ(Linux)と同期させる
Windows クライアントをNTPサーバ(Linux)と同期させるには、Windows2000 標準で付属しているSNTP機能を使用します。Linux
上のNTPサーバが外部のNTPサーバに接続し、正しい時刻を取得後、LAN内のクライアントがLAN内に設置したNTPサーバ(Linux)に接続しにいくといった階層的な構造をとることとします。まず、コマンドプロンプトを開き、以下のようにコマンドを入力します。
C:\>net
time /setsntp:172.16.50.2
コマンドは正常に終了しました。
#NTPサーバのIPアドレスを入力します
C:\>net
time /querysntp
現在の SNTP 値: 172.16.50.2
コマンドは正常に終了しました。
#現在設定されているタイムサーバのIPアドレスが表示されます。 |
上記コマンドを実行しても即座に正常な時刻に反映されるわけではありません。3分以上時刻が進んでいる場合は即座に修正されますが、3分以内の場合は動作しているプログラムへの支障が出る可能性を避けるためにシステムが徐々に修正していきます。なお、即座に結果を反映させたいという短気な方は、「管理ツール」→「サービス」からWindows
Timeサービスを再起動させます。再起動後、タスクバー上のデジタル時計がすぐに反映されるようになります。一度、net
time コマンドを実行後は、デフォルトで8時間に1回、時刻同期が行われます。
なお、イベントログには、「W32Time」というサービス名でログが出力されます。「イベントビューア」→「システム」内にW32Time
というイベントログをクリックして「プロパティ」を見てみると、以下図のように時刻のズレを何秒修正したかが表示されています。