頻繁にNTPで時間を合わせる

さて、どうしたものかと思案して思いついたのがNTPで頻繁に時間を合わせるという方法だ。対処療法的で美しい解とはいえないが仕方ない。Windows 2000ではOSとしてNTPをサポートしていないので、*1 懐かしのSakura Watchを倉庫から出してきてインストールした。取りあえず、5分に1回、NTPサーバと同期を取るように設定してみたところ、上に書いたように300秒(5分)で正確に100秒ずれていることが分かった。(ミリ秒単位では若干のバラツキがあるが、秒単位では必ず「100」になっている。)Sakura Watchのログを見ていると5分毎に100秒遅らせている。

5分で100秒も進むので、これもよろしくない。「では1分毎に同期をさせよう」と思った。(それでも1分で20秒の修正が必要になってしまうが。)ところがこれを実行すると、かなり頻繁にNTPサーバに負荷をかけることになる。Windows XPでのNTPの同期はデフォルトで1週間間隔だし、それほど気の長くないOSでも24時間で1回とか数時間で1回程度だろう。NTPサーバとしてNICTとMFEEDを使わせてもらっているが、私のような人間が、仮想マシン1台ごとに、1分ごとに同期を取り始めたら直ぐに機能しなくなることが予想できる。(ちなみに、Windows XPではレジストリ HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient\SpecialPollInterval でNTPサーバとの同期間隔を1秒単位で調整できるらしい。)

しかし、よく考えると仮想マシンのホストマシンは(イマドキのPCなので)ほぼ正確な時計を持っている。これをNTPサーバにすれば1分毎だろうが、1秒ごとだろうが、気兼ねなく時間の同期ができる。仮想マシンの稼働中は必ずホストマシンは動いているのでNTPサーバとしてはうってつけだ。ということで、ホストマシン(Fedora 8で稼動)のNTPサーバの機能を設定する。

調べると、もともとNTPのクライアントにはなっていたので、何の設定もせずにNTPのローカルサーバになることが分かった。ただ、仮想マシン上のSakura Watchから同期ができない。原因は単純で、ホスト側のファイヤーウォールでNTPポート(123番ポート)を開放していなかった。ファイヤーウォールの設定をしたところ無事に同期できた。

W2K上でアナログ時計を眺めていると、1分毎に秒針が20秒戻る。なんか滑稽でもある、が、仕方ない。例えば8:00ちょうどにサービスを実行するように設定して、8:00で一回起動して、時間が20秒戻って再度サービスが実行される確率が33%あることになる。つまり、仮想マシンを3回起動すると1回はこのような状況になるわけだ。それ程、深刻なアプリケーションを実行する気は今のところ無いので暫く、これで運用してみる。

ちなみに、正確に50%だけ時間が進むことがわかっているので、レジストリの値の設定で時計の進み具合を調節できれば、根本的な解法になるのだが、残念ながら私は知らない...。。

*1:Windows 2000から標準でNTPをサポートしていた。「NTPでネットワーク全体のマシンの時刻を合わせる」参照。@ITの記事にもあるが、Windows 2000をクライアントして同期を取る場合は"SNTP"を利用する。"net time setsntp:サーバ"コマンドでNTPサーバを指定して、"Windows Timeサービス"を自動起動するように設定する。