<NTPによる時刻合わせ>

 1ヶ月以上連続稼動を果たしましたが、気が付いてみるとLinuxサーバーの時間が10分弱も進んでいました。 これはやばいと思いNTP(Network Time Protocol)で時間合わせの設定を行いましたので、この時の手順について説明します。 ちなみに、何故やばいかについては以下の3点が考えられます。

・Mailサーバーとして利用しているが、時間が狂うと過去や将来から届いたメールとなってしまう。
・makeは時間を基に起動するので、正常動作しない可能性が出てくる。
・各種ログのタイムスタンプが正確でない為、他サイトログとの検証が難しい。(もし、他のサイトから『お宅からDoS攻撃を受けてる可能性があるけど、 ○月×日△時□分のメールログを確認してくれない。』と連絡があったとすると非常に困ります。)

 今回は、Red Hat6.2のrpmファイルの在り処を探せなかったので、たまにはまじめにソースをダウンロードしてコンパイルする手順を踏んでみました。

1.ソフトウェアのダウンロード

 http://www.eecis.udel.edu/~ntp/から、xntp3-5.93.tar.gzを ダウンロードします。

 また、全世界の公開NTPサーバーを同URLで知ることが出来ます。このホームページの"Public NTP Time Servers"を選択すると、 一番下の箇所に、Public NTP Primary Time ServersPublic NTP Secondary Time Serversが選べるようになっていますが、 Primaryが第1階層(stratum 1)、Secondaryが第2階層(stratum 2)のNTPサーバーを意味します。

 いくら公共とはいえあまり負荷はかけたくないのですが、ntpdateコマンドの記述に以下の説明があったので、 ここは、日本国内向け全ての公開NTPサーバーを指定したいと思います。

Note that the accuracy and reliability of ntpdate depends on the number of servers, the number of polls each time it is run and the interval between runs.
〔ntpdateの精度と信頼性は指定したサーバーの数、起動する時間間隔に依存します。〕

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

2.xntpのインストール手順

 できれば整理の意味を含めて、ローカルに組み込むソフトウェアのソース環境は、/usr/local/srcディレクトリ下、 実行コマンドは/usr/local/binディレクトリ下に保存しましょう。

gto$ mkdir -p  /usr/local/src ← /usr/local/srcディレクトリが無ければ作成します。
gto$ cp xntp3-5.93.tar.gz /usr/local/src ← ダウンロードしたファイルを/usr/local/srcへコピー
gto$ cd /usr/local/src ← /usr/local/srcディレクトリへの移動
gto$ tar zxvf xntp3-5.93.tar.gz ← 展開すると./xntp3-5.93ディレクトリ下にソース環境が保存されます。
gto$ cd xntp3-5.93 ← 展開した/usr/local/src/xntp3-5.93ディレクトリへの移動
gto$ ./configure ← 現在のシステムへ対応した環境構築
gto$ make ← 実行モジュール等の生成
gto$ su ← rootへスイッチ・ユーザ(su:Switch User)
Password: ******** ← rootパスワードの入力
ROOT# make install ← 生成した実行モジュールをシステムへ反映

3.NTP実行テスト

 まず、NTPサーバーにアクセスできるかをntpq(NTP query)コマンドを利用して確認してみましょう。

 ROOT# ntpq -p 133.100.9.2
      remote           refid      st t when poll reach   delay   offset    disp
 ==============================================================================
 *GPS_NMEA(1)     .GPS.            0 l  184   16  377     0.00    0.002    0.03
 +clock.tl.fukuok .GPS.            1 u  218   64  376     3.11   -0.070    0.53
 +helio.tl.fukuok .GPS.            1 u  229   64  377     3.60    0.068    0.08
  geo.gen.u-ryuky clock.nc.fukuok  2 u  736 1024  376    52.40    7.090   19.15
 -ns.hiroshima-u. .GPS.            1 u  213   64  376    17.23   -0.724    2.14
 -onikobe.gw.toho .GPS.            1 u  199  512  377    57.82   -1.658    5.16
 -izumi.gw.tohoku .GPS.            1 u  359  128  264    60.33   -2.292    3.01
  LOCAL(0)        LOCAL(0)         3 l  196   64  377     0.00    0.000   10.01
 xtime.nist.gov   .ACTS.           1 u  336  256  377   189.33   -9.976    2.76

 これは成功した例です。(表示内容を知りたい人はこちらを参照)  ちなみに、以下の2つ出力結果は全て失敗例です。原因としては、IPアドレスのタイプミスや、 NTP(123)のパケットがフィルタリングされていることが考えられます。

 ROOT# ntpq -p 192.168.76.1
  ntpq: read: Connection refused

 ROOT# ntpq -p  203.139.30.195
 ntpq: read: Network is unreachable
 次にntpdateコマンドによって、NTPサーバーの時間に合わせてみましょう。

 ROOT# ntpdate 133.100.9.2
  7 Dec 22:30:00 ntpdate[21895]: no server suitable for synchronization found

 これは失敗です。ntpqコマンドでの接続確認は正常処理されたのに、ntpdateで時間をセットしようとすると失敗しました。 予測通りの結果でした。そう、YAMAHA RTA52iのLinuxサーバーへの内向きのNTP(123)ポートは破棄するようにしています。 この場合は、仕方ないのでNTP(123)ポートも開けましょう。(当方の設定を反映されている方は こちらを参照

 ROOT# ntpdate 133.100.11.8 ← 再度、ntpdateを起動
  7 Dec 22:35:31 ntpdate[21972]: step time server 133.100.11.8 offset -178.284741

 今度は上手くいきました。

4.NTP環境セットアップ

 ntpdateコマンドをシステムブート時に起動したり、cronで毎時間起動してNTPクライアントとして時刻合わせする方法もありますが、 折角Linuxサーバーを立ち上げて、PCクライアントを接続/管理する環境を構築しているので、Linuxサーバーでxntpdデーモンを起動してNTPサーバーとして運用しましょう。 これによってntpdateの起動は不要になり、PC側でNTPサーバーの参照は、Linuxサーバーにアクセスすることによって時刻合わせが可能になります。
 尚、xntpdデーモンを起動すると常にxntpdがNTPソケットをオープンしているので、ntpdateが以下のメッセージで実行できなくなりますが、 ntpdateで行なう処理は、xntpdが自動処理していますので問題ありません。

 ROOT# ntpdate 133.100.9.2
 10 Dec 01:14:40 ntpdate[15310]: the NTP socket is in use, exiting

 xntpデーモンを動かす上で最低必要なコンフィグレーションファイルは以下の2つです。

・/etc/ntp.conf NTPコンフィグファイル
・/etc/ntp.drift ドリフト・ファイル

 当方での/etc/ntp.confファイルの設定は以下の通りです。serverで全ての日本国内向けの公開サーバーを指定しています。 また、ドリフトファイルはデフォルトの場所を定義しています。

 ROOT# cat /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  203.139.30.195  # ntp.cyber-fleet.net
 server  203.255.112.4   # time.nuri.net

 driftfile       /etc/ntp.drift

 ドリフトファイルは最初存在しないので、touchコマンドで空のファイルを用意しておきます。

 ROOT# touch /etc/ntp.drift ← 空の/etc/ntp.driftファイルを作成

 次に、xntpdデーモンを起動する仕組みです。システム立上げ時に自動的に起動し、シャットダウン時には停止するようにします。 これを実現するためのスクリプトの雛型が、/usr/local/src/xntp3-5.93/scriptsディレクトリ下のxntpというファイルです。 ただ、内部で指定しているコマンドパスがLinux用でないのでパス名の修正が必要です。修正後のファイルを /etc/rc.d/init.dにコピーします。
 修正が面倒な方は、ここからダウンロードして次の手順を踏んで下さい。

 ROOT# gzip -d xntp.sh.gz
 ROOT# mv xntp.sh xntp
 ROOT# chmod 750 ./xntp
  ROOT# cp ./xntp /etc/rc.d/init.d/xntp

 あとは、このスクリプトがシステム立上げ時とシャットダウン時に起動するように、次のようにシンボリックリンクします。

  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc0.d/K10xntp
  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc1.d/K10xntp
  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc2.d/S55xntp
  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc3.d/S55xntp
  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc4.d/S55xntp
  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc5.d/S55xntp
  ROOT# ln -s /etc/rc.d/init.d/xntp /etc/rc.d/rc6.d/K10xntp

※本当はchkconfigコマンドを利用したスマートな方法があるのですが、rpm以外でインストールしたソフトウェアが--addオプションで追加管理できません。 これについては、別途調べる予定です。

 これでセットアップ完了です。以下のコマンドでxntpdを起動してみましょう。

  ROOT# /etc/rc.d/init.d/xntp start

5.補足

 Linuxは立ち上がり時、BIOSが保持する時間をシステム時間としてセットします。 これにより、立ち上がってからxntpdの補正が入るまで正確な時刻ではありません。 これを解決するには、clockコマンドを使い正確なシステム時間をBIOS時間に書き込みます。

 ROOT# 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時間が進んでいます。)
 ROOT# clock -w  ← システム時間をBIOS時間に書き込みます。
 ROOT# 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に書き込みましょう。 毎日深夜3時に合わせるには、以下の行をcron登録します。

 0 3 * * *                       /sbin/clock -w

 尚、WindowsPCの方には、NTPクライアントの定番ソフトである"桜時計"をインストールして LinuxサーバーをNTPサーバーとして問題なく利用できることを確認しています。

【おまけ】
 広島のおちさん情報より、Linuxサーバーにsambaを導入している環境では、桜時計を導入しなくてもDOSコマンドで簡単に動作確認できることを知りました。Windows2000とWindows98で確認済みです。方法は以下の通りです。
【スタート】⇒【プログラム】⇒【MS-DOSプロンプト】を起動
C:\WINDOWS> net time \\192.168.0.1 /set /yes
\\192.168.0.1の現在の時刻は 2001-11-5 21:51 です。
コマンドは正常に完了しました。

C:\WINDOWS>

ここで192.168.0.1は、LinuxサーバーのIPアドレスを入力して下さい。おちさん、情報ありがとうございました。m(_ _)m