追記(2008/02/04)時間のズレが解消

最近、Googleってみると /etc/vmware/config に以下の項目を追加すると時間のズレの問題が解消するというページがあちこちで見つけられた。半年前に同じ問題で随分しらべたが、当時は見当たらなかったので、最近見つけられた方法なのかも知れない。

host.cpukHz = "3000000"
host.noTSC = "TRUE"
ptsc.noTSC = "TRUE"

「3000000」というのはCPUの動作周波数をKHz単位にしたもの。私の場合は3GHzのCore2 Duoなので3000000になる。
これで、驚くほど(下の)現象が軽減した。現在、Sakura Watchで60分毎に同期をとるようにしているが、ほぼ6.6秒進んでいるだけだ。従来150%の進み具合だったのが、0.18%程度の進み具合に収まった。(と言っても家庭の時計と比べると悲惨な数値だが、150%よりはマシである。)

この記述の詳しい説明はVMwareのホームページとはでは見つけられなかった。パラメータの名前から察するにホストのTSC Clockを使わないようにしているのだろう。ACPIでも使うのだろうか。(今時、殆どのマザーボードにはACPIはあると思うのでデフォルトでそうしてくれた方が嬉しいのに。TSCの方がソフトウェア・コストが安いのかな?)

これで暫く様子をみてみる。

ゲストOSの時間がずれる問題

VMware ServerのGuest OSの時間が大幅にずれる問題はあちこちの掲示板で書かれているが、どうも効果的な方法がないようだ。私も以前、ゲストOSのカーネルを再構成(もちろんLinuxの場合だが)を試みたが、若干の改善はするものの根本的な解決になっていなかった。ましてや、ゲストOSがWindows系だと手も足も出ない。ゲストOSの時計が狂うと何かと不便だし、気にもなる。

余談になるが、同じVMware仮想マシン製品でもVMware Serverでは時間がずれるが、VMware Playerでは時間がずれないような気がする。VMware Serverは無償製品なので、あえて差別化のためにわざと時間がずれるようにしてるのだろうか? ESXは使ったことがないので分からないが、データセンタのサービスなどでも利用されているESXでもゲストOSの時間が大幅にずれるようでは使い物にならないし、そのような書込みは見たこと無いのでESXでは起きていないのではないかと思う。また、VMware Playerは無償ではあるが仮想アプライアンスのエンジンとなるので、これも時間がずれてしまってはVMware社のビジネスモデルが成り立たない。もし、そうであればVMware社はゲストOSにおいて時間をずれないようにする方法を知っていることになるが....。

仮想マシン専用のホストを購入して、VMware Serverを入れて使い始めているが、Windows 2000 ProfessionalをゲストOSとして「デーモン・マシン」として24時間連続稼動させている。この仮想マシンでどれ位時間がずれるかというと、300秒できっちり100秒食い違いで出てくる。(実際には200秒しか立っていないので、仮想マシン上の時間は300秒が経過している。)正確に150%進む! これではW2K上で特定時間に起動するサービスやタイムスタンプを利用するソフトウェアは利用できない。

頻繁に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サービス"を自動起動するように設定する。