<NTPによる時刻合わせ>
1ヶ月以上連続稼動を果たしましたが、気が付いてみるとLinuxサーバーの時間が10分弱も進んでいました。
これはやばいと思いNTP(Network Time Protocol)で時間合わせの設定を行いましたので、この時の手順について説明します。
ちなみに、何故やばいかについては以下の3点が考えられます。
・Mailサーバーとして利用しているが、時間が狂うと過去や将来から届いたメールとなってしまう。
今回は、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 ServersとPublic 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.
尚、自宅に複数台PCがある環境では、全てのマシンが公開NTPサーバーを参照するのではなく、Linuxサーバーで
NTPサーバーを立ち上げて、そちらを参照するようにしましょう!
2.xntpのインストール手順
できれば整理の意味を含めて、ローカルに組み込むソフトウェアのソース環境は、/usr/local/srcディレクトリ下、
実行コマンドは/usr/local/binディレクトリ下に保存しましょう。
3.NTP実行テスト
まず、NTPサーバーにアクセスできるかをntpq(NTP query)コマンドを利用して確認してみましょう。
これは成功した例です。(表示内容を知りたい人はこちらを参照)
ちなみに、以下の2つ出力結果は全て失敗例です。原因としては、IPアドレスのタイプミスや、
NTP(123)のパケットがフィルタリングされていることが考えられます。
これは失敗です。ntpqコマンドでの接続確認は正常処理されたのに、ntpdateで時間をセットしようとすると失敗しました。
予測通りの結果でした。そう、YAMAHA RTA52iのLinuxサーバーへの内向きのNTP(123)ポートは破棄するようにしています。
この場合は、仕方ないのでNTP(123)ポートも開けましょう。(当方の設定を反映されている方は
こちらを参照)
今度は上手くいきました。
4.NTP環境セットアップ
ntpdateコマンドをシステムブート時に起動したり、cronで毎時間起動してNTPクライアントとして時刻合わせする方法もありますが、
折角Linuxサーバーを立ち上げて、PCクライアントを接続/管理する環境を構築しているので、Linuxサーバーでxntpdデーモンを起動してNTPサーバーとして運用しましょう。
これによってntpdateの起動は不要になり、PC側でNTPサーバーの参照は、Linuxサーバーにアクセスすることによって時刻合わせが可能になります。
xntpデーモンを動かす上で最低必要なコンフィグレーションファイルは以下の2つです。
・/etc/ntp.conf NTPコンフィグファイル
当方での/etc/ntp.confファイルの設定は以下の通りです。serverで全ての日本国内向けの公開サーバーを指定しています。
また、ドリフトファイルはデフォルトの場所を定義しています。
ドリフトファイルは最初存在しないので、touchコマンドで空のファイルを用意しておきます。
次に、xntpdデーモンを起動する仕組みです。システム立上げ時に自動的に起動し、シャットダウン時には停止するようにします。
これを実現するためのスクリプトの雛型が、/usr/local/src/xntp3-5.93/scriptsディレクトリ下のxntpというファイルです。
ただ、内部で指定しているコマンドパスがLinux用でないのでパス名の修正が必要です。修正後のファイルを
/etc/rc.d/init.dにコピーします。
あとは、このスクリプトがシステム立上げ時とシャットダウン時に起動するように、次のようにシンボリックリンクします。
※本当はchkconfigコマンドを利用したスマートな方法があるのですが、rpm以外でインストールしたソフトウェアが--addオプションで追加管理できません。
これについては、別途調べる予定です。
これでセットアップ完了です。以下のコマンドでxntpdを起動してみましょう。
5.補足
Linuxは立ち上がり時、BIOSが保持する時間をシステム時間としてセットします。
これにより、立ち上がってからxntpdの補正が入るまで正確な時刻ではありません。
これを解決するには、clockコマンドを使い正確なシステム時間をBIOS時間に書き込みます。
システム運用中は'clock -w'をcron登録し、定期的にNTPで補正された正確なシステム時間をBIOSに書き込みましょう。
毎日深夜3時に合わせるには、以下の行をcron登録します。
尚、WindowsPCの方には、NTPクライアントの定番ソフトである"桜時計"をインストールして
LinuxサーバーをNTPサーバーとして問題なく利用できることを確認しています。
【おまけ】
C:\WINDOWS>
ここで192.168.0.1は、LinuxサーバーのIPアドレスを入力して下さい。おちさん、情報ありがとうございました。m(_ _)m
・makeは時間を基に起動するので、正常動作しない可能性が出てくる。
・各種ログのタイムスタンプが正確でない為、他サイトログとの検証が難しい。(もし、他のサイトから『お宅からDoS攻撃を受けてる可能性があるけど、
○月×日△時□分のメールログを確認してくれない。』と連絡があったとすると非常に困ります。)
〔ntpdateの精度と信頼性は指定したサーバーの数、起動する時間間隔に依存します。〕
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 ← 生成した実行モジュールをシステムへ反映
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
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
ROOT# ntpdate 133.100.11.8 ← 再度、ntpdateを起動
7 Dec 22:35:31 ntpdate[21972]: step time server 133.100.11.8 offset -178.284741
尚、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
・/etc/ntp.drift ドリフト・ファイル
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
ROOT# touch /etc/ntp.drift ← 空の/etc/ntp.driftファイルを作成
修正が面倒な方は、ここからダウンロードして次の手順を踏んで下さい。
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
ROOT# /etc/rc.d/init.d/xntp start
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
(ほぼ一致しました。)
0 3 * * * /sbin/clock -w
広島のおちさん情報より、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 です。
コマンドは正常に完了しました。