Windows上のVMware ServerでゲストOSとしてLinux (Debian etch)を動かしていますが、このLinuxの時刻があり得ないぐらいずれてしまいます。以前はカーネルのbootオプションに
clock=pit
をつけることでなんとか時刻を保持できていたが、ハードを更改するとこのオプションをつけてもずれが激しい。どうもIntelのCeleronからAMDのAthlon X2に変更したのが原因のよう。
Athlon X2のコア同士のTSCのずれがあるらしく、AMDのDual Core Optimizerを入れるとかなり正常に近づき、NTPで同期できるようになった。
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *ntp.xx.xxxxxxx. .GPS. 1 u - 1024 377 15.990 -59.864 30.723
== 追記 2008/8/17 ==
上記方法で一応ntpで補正できる範囲にはなったが、それでも誤差が大きいらしく、ずっと以下のログが出力されてしまします。
Aug 10 09:45:09 gin ntpd[3554]: time reset -2.491515 s Aug 10 09:45:09 gin ntpd[3554]: frequency error -512 PPM exceeds tolerance 500 PPM
上記のようなログが20分おきぐらいに出力されるので、私の環境では、20分に2~3秒ぐらいずれていて(マイナスはローカルがntpより早い)、ntpサーバへのポーリングタイムが64秒より長くなりません。なので、adjtimeを使用して調整することにしました。adjtimeはハードウェアクロックの精度が悪い時にその誤差を調整するもので、今回ぐらいの誤差ならば調整できそうです。
まずはapt-get コマンドでコマンドをインストールします。
# apt-get install adjtimex
adjtimeで補正する誤差を計算します。以下のように計測しました。
# /etc/init.d/ntp stop # ntpdate -b ntp.nc.u-tokyo.ac.jp; sleep 180; ntpdate -b ntp.nc.u-tokyo.ac.jp 17 Aug 01:04:33 ntpdate[19824]: step time server 130.69.251.23 offset -0.176401 sec 17 Aug 01:07:33 ntpdate[19830]: step time server 130.69.251.23 offset -0.419513 sec
ここでは東大のntpサーバを使用しています。最初に時計を合わせて、180秒(3分)待って、さらに合わせます。この時のずれが-0.419513秒(offsetの値)つまり、0.41953秒早く進んでいます。3分で0.42秒、つまり20分で2.8秒のため、上記でかいた20分で2~3秒というログと辻褄があいます。もっと正確に検出したいならば、sleepの値をのばしたり、何回も測定して平均を計算するとよいと思います。
上記結果より、1日当たりの誤差を計算します。私の環境では数回の計測と計算の結果、1日で、-196.19856秒としました。
この値を /etc/default/adjtimex に設定してあげます。このファイルの設定値は秒ではなく、TICKとFREQで設定します。
1TICK=6553600FREQ で、+1TICK=8.64 秒/日 早く進むらしいので、196.19856秒遅く時計を進ませるためには、-196.19856/8.64=-22.70 となる。TICKは10000で誤差なしということらしいので、小数点を無視して、TICK=10000-23=99977, FREQ=0を設定することにしました。
TICK=99977 FREQ=0
これでadjtimeで、上記設定を有効にします。
# /etc/init.d/adjtimex start
以上で、誤差がかなり少なくなりましたがまだ誤差があったので(そもそもsleep 180が正確でないので)、最終的には”99971″にしました。vmwareは誤差が大きいので、ntpは起動しておきましょう。
# /etc/init.d/ntp start
== 追記 2009/4/26 ==
vmwareの時刻補正機能とNTPを同時に動かしていると時刻修正機能がバッティングしてしまいます。maznはNTPを止めて、 vmwareで補正するように変更しました。ただしホストOSは時刻が正確であることが前提です。
あと、以下のコマンドで最適なtickを計算してくれるようです。
# adjtimex --compare --- current --- -- suggested -- cmos time system-cmos error_ppm tick freq tick freq 1240719539 -0.625205 1240719549 -0.634765 -956.0 9990 4000000 1240719559 -0.643681 -891.6 9990 4000000 9999 3446719 1240719569 -0.651886 -820.5 9990 4000000 9998 5345630 1240719579 -0.659008 -712.3 9990 4000000 9997 4803917 1240719589 -0.668480 -947.2 9990 4000000 10000 536868 1240719599 -0.677599 -911.9 9990 4000000 9999 4782655 1240719609 -0.687442 -984.3 9990 4000000 10000 2968118
suggestedのtickとfreqを設定するのがよいとは思いますが、vmware上では安定しないようなので、これらの平均を設定するのがよさそうです。