NTPの設定方法

目次

複数のサーバー間の時間同期をとるNTPについて説明します。これにより全てのサーバーの時計が寸分の狂い無く一致します。

NTPクライアントの設定
NTPサーバーの設定
NTPのポーリング間隔
時刻修正モードStepとSlew
戻る

NTPクライアントの設定

最も正確な協定世界時をセットする為にNTPクライアントを使ってNTPタイムサーバーに情報を取りに行く様にしましょう。タイムサーバーの一覧はPublic NTP Primary Time Serverを参考にしてください。ただし個人ユーザーがPublic NTP Primary Time Serverに接続することは良い方法ではありません。Public NTP Primary Time Serverは世界中の研究所や大学、大手ISPからのアクセスが集中しています。個人ユーザーのアクセスはPublic NTP Primary Time Serverの負荷を高くする原因になるわけです。ですからPublic NTP Primary Time Serverのリソースは公的機関に譲るのがモラルです。私たちのサーバーを協定世界時(正確な時間)にあわせる為には研究所や大学、大手ISPにアクセスするのが一般の方法です。

<上位NTPサーバー>
一般に使うNTPサーバーをいくつか紹介します。http://www.jst.mfeed.ad.jp/はPublic NTP Primary Time Serverから直に協定世界時を取得しているNTPサーバーを紹介しているサイトです。この他にも国内だけで星の数ほど存在します。
・ntp1.jst.mfeed.ad.jp (210.173.160.27)
・ntp2.jst.mfeed.ad.jp (210.173.160.57)
・ntp3.jst.mfeed.ad.jp (210.173.160.87)

<Solarisの場合>
Solaris8のntpdはxntpdとほぼ同等であるのですが、バグがある事で有名です。Solaris8でのntpdを利用する場合はxntpdを使うよう薦めます。xntpdを使う場合はメインページよりインストールログを参考にしてください。
まず、Solaris8に標準で付いていつバグありntpdをインストールしたxntpdに塗り替えます。

# cp /etc/init.d/xntpd /etc/init.d/xntpd.old
# vi
/etc/init.d/xntpd

xntpdを次の様に編集してください。
24行目:printf("-s -w -m")
から printf("-s") に変更
38行目:printf("-s -w") から printf("-s") に変更
46行目(/usr/sbin/ntpdate $ARGS; sleep 2; /usr/lib/inet/xntpd) & から (/usr/sbin/ntpdate $ARGS; sleep 2; /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf) & に変更
48行目:/usr/lib/inet/xntpd & から /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf & に変更
52行目:/usr/bin/pkill -x -u 0 '(ntpdate|xntpd)' から /usr/bin/pkill -x -u 0 '(ntpdate|ntpd)' に変更

下の様になると思います。

#!/sbin/sh
[ ! -d /usr/sbin -o ! -d /usr/lib/inet ] && exit 1
case "$1" in
'start')
[ -f /etc/inet/ntp.conf ] || exit 0
ARGS=`/usr/bin/cat /etc/inet/ntp.conf | /usr/bin/nawk '
BEGIN {
first = 1
}
/^#/ {
next
}
/^multicastclient/ {
if (first) {
first = 0
printf("-s")
}
if (NF == 1)
printf(" 224.0.1.1")
else
printf(" %s", $2)
next
}
/^server 127.127/ {
next
}
/^server/ {
if (first) {
first = 0
printf("-s")
}
printf(" %s", $2)
next
}
'`
if [ -n "$ARGS" ]; then
# Wait until date is close before starting xntpd
# (/usr/sbin/ntpdate $ARGS; sleep 2; /usr/lib/inet/xntpd) &
(/usr/sbin/ntpdate $ARGS; sleep 2; /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf) &
else
# /usr/lib/inet/xntpd &
/usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf &
fi
;;
'stop')
# /usr/bin/pkill -x -u 0 '(ntpdate|xntpd)'
/usr/bin/pkill -x -u 0 '(ntpdate|ntpd)'
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0

もともとxntpdは各ランレベルのrcにハードリンクされていますので、initのxinitdのファイル名は変更しない方が良いと思います。尚、Solaris9のxntpはセキュリティーアップデートよりバグが改善されている可能性があります。

<NTPクライアントの設定>
/etc/init.d/xntpdスクリプトを見れば分かるように/etc/inetd/ntp.confファイルがあれば起動時にntpdが立ち上がる様になっているはずです。ですからNTPを標準で起動させる為に/etc/init.d/ntp.confを作成しましょう。尚、ntp.confにはテンプレートが用意されています。

# cp /etc/inet/ntp.client /etc/inet/ntp.conf

クライアントとして稼働するのであれば、NTPサーバーを定義しなければなりません。前章にも記述したようにプロバイダ等のNTPサーバーをここで指定します。/etc/inetd/ntp.confを次の様に記述して下さい。

#multicastclient 224.0.1.1
server 210.173.160.87
driftfile /var/ntp/ntp.drift

ntp.driftファイルは誤差調整用のファイルです。

<ntpdの起動>
ntpd.confの設定が終われば、ntpdを起動して協定世界時を取得しましょう。クライアントでもサーバーでも協定世界時を取得する場合はNTPのクライアントの設定を行ってからntpdを起動してください。

# /etc/init.d/xntpd start

起動の確認はntpq -pで行って下さい。また、ntpq -pの後にサーバー名、IPアドレスを入力する事で、指定したNTPサーバーの状態も表示できます。

# /usr/local/ntpd/bin/ntpd -q

NTPサーバーに対して、ntpが通るかどうかを見るにはntptraceコマンドを使って下さい。

# /usr/local/ntpd/bin/ntptrace

NTPサーバーの設定

NTPサーバーの設定はクライアントと同じ様にテンプレート/etc/inet/ntp.serverを/etc/inet/ntp.confにコピーします。

# cp /etc/inetd/ntp.server ntp.conf

次にntp.confを編集して下さい。クライアントの設定と違う部分はfudgeを定義することです。

# table above.
server 210.173.160.87
#fudge 127.127.XType.0 stratum 0
fudge 127.127.1.1
#broadcast 224.0.1.1 ttl 4
#enable auth monitor
driftfile /var/ntp/ntp.drift
#statsdir /var/ntp/ntpstats/
#filegen peerstats file peerstats type day enable
#filegen loopstats file loopstats type day enable
#filegen clockstats file clockstats type day enable
#keys /etc/inet/ntp.keys
#trustedkey 0
#requestkey 0
#controlkey 0

fudge 127.127.1.1は自身の内臓時計をNTPサーバーとして宣言する事を意味しています。これと同じ様にしてserver値も127.127.1.1にすれば協定世界時を使わずに自身の内臓時計を表す事ができます。設定ファイルの記述が済めばntpdを立ち上げましょう。起動スクリプトはクライアントと全く同じです。

# /etc/inetd/xntpd start

一般にNTPサーバーも協定世界時に合わすのでNTPサーバーもPublic NTP Primary Time Server又は上位NTPサーバーから見れば、クライアントになるわけです。ですからクライアントの設定とほぼ同じと考えても良いでしょう。

NTPのポーリング間隔

ntpdはサーバーとの時刻同期が完了してしばらく経過すると、ポーリング間隔と呼ばれるNTPサーバーへの時間同期の問い合せ間隔が64秒、128秒、512秒、1024秒と、だんだん広がってきます。もしもNTPの伝送パケットを減らすためにポーリング間隔を大幅に広げたい、あるいは、精度をあげたいためにポーリング間隔を短くしたい場合、minpoll値とmaxpoll値を設定することでポーリング間隔を制御する事ができます。次の様に時刻同期を問い合わせ先の後に続けてして下さい。

server 210.173.160.87 minpoll 6 maxpoll 6

6というのはビット数です。秒数ではありませんので注意してください。今回6と指定した場合は64ビットになります。最小値は4(16秒)です。minpollのデフォルト値は6(64秒)、maxpollのデフォルト値は10(1024秒)になっています。

時刻修正モードStepとSlew

時刻修正モードにはStepモードとSlewモードの2つがあります。Stepモードとはすぐに時間を修正するのに対し、Slewモードは1秒間に0.0005秒ずつ修正します。一気に正確な時刻にセットしたい場合はStepモードを使いますが、データベースやログホストの様な時刻の後戻り先送りにより不都合が生じるシステムではSlewモードを使います。ただし、大幅に時刻がずれているシステム上でSlewモードを使っても1秒間に0.0005秒しか修正されませんので、補正に何日もかかる場合もあります。Slewモードで1日の補正可能時間は43秒です。デフォルトではStepモードになっていますので、Slewモードで起動する場合は次の様に-xコマンドを指定して下さい。

# /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf -x &

<Slewモードで起動する>
Solarisデフォルトの起動スクリプトでは起動時に強制的に時刻同期を行うntpdateコマンドを実行してしまう可能性があります。そのためSlewモードで起動するためには/etc/init.d/xntpdを次の様に変更して下さい。正しく設定されSlewモードで起動するとsyslogにはtime slewと出力されます。
46行目 (/usr/sbin/ntpdate $ARGS; sleep 2; /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf) & から /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf -x & に変更
48行目:/usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf & から /usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf -x & に変更

#!/sbin/sh
[ ! -d /usr/sbin -o ! -d /usr/lib/inet ] && exit 1
case "$1" in
'start')
[ -f /etc/inet/ntp.conf ] || exit 0
ARGS=`/usr/bin/cat /etc/inet/ntp.conf | /usr/bin/nawk '
BEGIN {
first = 1
}
/^#/ {
next
}
/^multicastclient/ {
if (first) {
first = 0
printf("-s")
}
if (NF == 1)
printf(" 224.0.1.1")
else
printf(" %s", $2)
next
}
/^server 127.127/ {
next
}
/^server/ {
if (first) {
first = 0
printf("-s")
}
printf(" %s", $2)
next
}
'`
if [ -n "$ARGS" ]; then
# Wait until date is close before starting xntpd
/usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf -x &
else
/usr/local/ntpd/bin/ntpd -c /etc/inet/ntp.conf -x &
fi
;;
'stop')
# /usr/bin/pkill -x -u 0 '(ntpdate|xntpd)'
/usr/bin/pkill -x -u 0 '(ntpdate|ntpd)'
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit 0

<コマンドで即時セットする>
ntpdの起動スクリプトで強制的に時刻をセットするために使われていたntpdateコマンドはntpd同様、NTPで時刻同期を行うプログラムです。しかしntpdと違いデーモンとして動作しません。コマンドを実行した時に時刻を同期して終了します。

# /usr/local/ntpd/bin/ntpdate [NTPサーバーのIPアドレス]

尚、-dオプションで動作状況の表示ができます。

 


<戻る>