2010/01/06

Linux ゲストの時計が+9時間になってしまって悩んでいる方へ

Windows Virtual PC や Hyper-V の仮想マシンに Linux ゲストをインストールしたら、仮想マシンを起動するたびに、時刻が9時間進んでしまうという現象で悩んでいる方はいませんか。NTP でシステム クロックを調整し、ハードウェア クロックに書き込んだとしても、仮想マシンを再起動すると、次に NTP で訂正されるまでの間は、再び9時間先の時刻になってしまいます。

原因は、ハードウェア クロック (BIOS の時計)を UTC (協定世界時) として扱うように設定してしまったことにあります。

Linux ディストリビューションのほとんどは、ハードウェア クロックを UTC として扱うのが既定です。Windows マシンは、ハードウェア クロックにローカル時刻を格納します。タイムゾーンの設定が日本であれば、GMT+9:00 (=UTC+9:00) の時刻がハードウェア クロックに格納されています。

Windows Virtual PC や Hyper-V の仮想マシンは、仮想マシン開始時に物理マシンのハードウェア クロックから時刻を取得して、仮想マシンのハードウェア クロックとします (たぶん)。Linux ゲストでハードウェア クロックを UTC として扱うように構成されている場合、仮想マシンのハードウェア クロック (=物理マシンのハードウェア クロックに格納されたローカル時刻) を UTC として扱います。タイムゾーンが日本に設定された Linux ゲストは、UTC +9:00 で JST とするため、 GMT+9:00+9:00 となってしまい、時計が9時間先になってしまうのです。

仮想マシンの保持するハードウェア クロックは、書き換え可能ですが、仮想マシンを再起動すると、再び物理マシンのハードウェア クロックに戻ってしまいます。そのため、NTP で同期した時刻をハードウェア クロックに書き込んでも、再起動すると元に戻ってしまうのです。この問題を回避するには、日付と時刻の設定で、UTC のオプションをオフにしてください。ノベルの openSUSE や SUSE Enterprise Linux の場合は、「ハードウェアの時刻は UTC に設定」をオフにします。Fedora や Red Hat Enterprise Linux の場合は、「システム クロックで UTC を使用」をオフにします。