Hyper-V 上の Linux でシステム時刻を同期する (CentOS 5.4) - Linux の使い方


システム時刻を同期する

Microsoft 社の Hyper-V 上で動作している CentOS 5.4 は、実際の時間よりもずっと早く内部の時計が進んでしまう様子です。

CentOS 5.4 に限らず、平成 22 年 8 月 9 日現在の多くの Linux がそのようになってしまっているような感じで、Linux の時刻同期といえば ntpd を使うのが一般的ですが、あまりにも時刻のずれが激しいため、ntpd も自信を無くして同期してくれなくなってしまうのでした。

Hyper-V 上の CentOS 5.4 で正しく時刻同期を行うためには、カーネルパラメーターの設定内容を調整し、また、起動時に NTP 時刻同期を行い、ホスト OS との同期を行わないように設定する必要があります。

 

まず、カーネルパラメーターの設定を調整します。

"/etc/grub.conf" を編集して、起動パラメーターに 64 ビット環境の場合は "notsc divider=10" を付加します。なお、32 ビット環境の場合には "clocksource=acpi_pm divider=10" というオプションをを付加することになるそうです。

これは、Kernel 2.4 系では 100Hz だった CPU の割り込みタイマーが Kernel 2.6 系では 1,000Hz で動作するようになり、この速度に Hyper-V 上の仮想サーバーがついて行けないことが理由だそうで、カーネルオプションに divider=10 とすることで、割り込み間隔を 1/10 にして、この問題を回避することが出来るのだそうです。

kernel /vmlinuz-2.6.18-164.11.1.el5.centos.plus ro root=/dev/VolGroup00/LogVol00 r hgb quiet hda=noprobe hdb=noprobe notsc divider=10

このように、起動するカーネル指定の部分の最後にオプションを追記してあげます。複数のカーネルが登録されていて選択できるようになっている場合には、適切なカーネルにオプションを設定するように注意します。

次に、起動時の NTP 時刻同期設定です。これには "/etc/ntp/step-tickers" ファイルを編集します。

0.centos.pool.ntp.org

ここに同期で使用する NTP サーバーのドメイン名または IP アドレスを記載しておきます。こうすることで、起動時点で時刻が大きくずれていた場合に ntpd が起動できない問題を回避することができる様子です。

そして、Hyper-V の仮想サーバーの設定を調整します。

Hyper-V マネージャーから目的のサーバーの設定を行って、"統合サービス" の "時刻の同期" のチェックを外しておきます。

 

これで準備は完了です。

後は通常のシステムどおり ntpd による時刻同期が行えるようになりますので、もしここで ntpd が起動時に実行される設定になっていない場合には、次のようにして ntpd が自動起動されるように設定します。

chkconfig ntpd on

ここまでの準備が全て整ったら、Linux を再起動します。

適切に設定できていれば、これで ntpd による時刻同期が開始されます。"ntpq -p" コマンドを実行して、同期して欲しい NTP サーバーの先頭に "*" がついていれば大丈夫です。

なお、自分の環境では "*" が付くまでに 30 分ほどかかりましたので、少し気長に待つのが良さそうです。

 

もしここで "LOCAL" に対して同期されていた場合、Hyper-V の場合はローカルクロックの信頼性が低いので同期されないように設定するのが良いと思います。

そのためには "/etc/ntp.conf" を編集して、次のような行を削除します。

server 127.127.1.0

fudge 127.127.1.0 stratum 10

これで "service ntpd restart" として ntpd の再起動を行い、同期の状況を確認します。

その後もし、Linux を再起動したときに "/etc/ntp.conf" の内容がもとに戻ってしまう場合には、"/etc/ntp.conf.predhclient" というファイルがあるかもしれません。

このファイルをもとに "/sbin/dhclient-script" というスクリプトファイルが "/etc/ntp.conf" ファイルを生成するようになっている場合があるので、"/etc/ntp.conf.predhclient" の方を編集しておく必要があります。

 

以上で ntpd による同期のお話はおしまいです。

なお、時刻の同期の方法として ntpdate による即時同期を cron により数分間隔で同期させるという方法も考えられますが、Hyper-V 上での時刻のずれは相当激しく、数分間隔でも頻繁に未来から過去へ時間が戻ってしまいます。

そのときに cron が誤動作して、同じタスクを複数回実行してしまう場合があるので、ntpdate による同期を定間隔で実施することは、可能な限り避けておいた方が良さそうです。