Vmware上のLinuxサーバで、dovecotが頻繁にお亡くなりになる件について

自宅のWindowsPCでVmware Server 2.0を稼働しているのだが、その上で走らせているCentOS5.2上のPOPサーバdovecotがやたらと良く止まる。仕事用ドメインのメールアカウントも同サーバで動かしているので、ちょっと油断すると数日仕事メールに気づかないなんてコトもあって、かなりデンジャラス。

グーグル先生にお伺いを立てたところ、おおよそ次のような流れが原因らしい。

1.Linux 2.6系カーネルVmware上で時間が大幅にずれる。
2.4系カーネルまでは、時刻同期のための割り込み要求を100Mhz間隔で行っていたのだが、2.6系からはそれが1000Mhz間隔に変わった。ところが、仮想マシン上はそんな頻繁なリクエストは処理しきれない。結果として仮想マシン内での時間は実時間に比べて大きく遅れてしまう。また、割り込み要求の取りこぼしを補正しようとするカーネルの仕組みが、仮想マシンでは逆に時間を早めてしまうことがある。そのため、Linux 2.6系カーネルは、Vmware上で大きく時間が進むことも、遅れることも、ともにありうる。


http://webos-goodies.jp/archives/50179807.html
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1420


2.ntpdがそれを修正しようとがんばる。
Linux2.6 on Vmwareのntpdが、インターネット上の時刻サーバと同期して、時間の遅れを修正しようとする。その際には基本的に「1秒の長さ」を最大5ms単位で増減して調節するという手法を取る。システムの時刻が突然大きく変化して、他のプロセスに影響を与えないようにするためだ(slew動作)。ただし時間のずれが128ms以上ある場合は、slew動作を取らず直接指定の時間に変更する(step動作)。うちの環境では上記の時間のずれをslew動作で補正しきれず、一定期間経つとstep動作に切り替わるようだ。


http://www.asahi-net.or.jp/~AA4T-NNGK/ntpd.html


3.そしてdovecotはそれを許せない
ところがPOPサーバのdovecotは時間の巻き戻りに敏感で、ntpdがstep動作で時間を調節した瞬間、Time moved backwards errorを吐いて停止してしまう。


http://wiki.dovecot.org/TimeMovedBackwards


解決策としては、シンプルにVmwareの提供するVmware-ToolsをゲストのLinuxインストールして、さらにカーネルの起動オプションに「clock=pit noapic nolapic nosmp」を追加してやればよい。Vmware-ToolsにはゲストOSとホストOS間の時刻同期をする機能があり、上記の起動オプションはカーネルの割り込み要求の取りこぼし補正やマルチプロセッサでの割り込み制御など、仮想マシンの時間のずれを引き起こすいくつかのカーネル機能を停止する。これで時間同期の問題は解決し、dovecotは快調に動作してくれるはずだ。


http://sarwiki.informatik.hu-berlin.de/Vmware-Tools_and_time_synchronization


……ところが、忘れた頃にやっぱりdovecotはいつの間にかお亡くなりになってたりする。
なぜ!? <(T口T)> と思い調べてみると。


4.カーネルのアップデートでVmware-Toolsが停止する
うちの環境ではyum-cronでシステムの自動アップデートをかけているのだが、カーネルをアップデートしたタイミングでVmware-Toolsが機能しなくなってしまう。結果1.に戻って、当然のようにdovecotは停止してしまう。


Vmware-Toolsを新しいカーネルに対応させるためには、コマンドラインからvmware-config-tools.plを起動して、再設定をかけてやればよい。それだけなのだが、yumのアップデート記録をいちいちチェックするのは自動アップデートの定義と精神に反する。要はメンドくさい。


ということで、うちの環境ではカーネルのアップデートを停止することにした。
/etc/yum.conf に exclude=kernels kernel* を追加。


しばらくはこれで様子見するとしよう。
今のところ、dovecot君は順調に動いてるようだけど……はてさて。