2014年6月29日日曜日

Hyper-V 仮想化環境での時刻同期

時刻同期は今ではサーバーの非常に重要な要件となりました。時刻が同期されていないと、各種のログの照合が難しくなるだけでなく、認証プロトコルが失敗することさえあります。

Hyper-Vを含め、多くの仮想化環境では、仮想マシンの時刻が遅れる傾向にあります。

昔「任天堂ゲームウォッチ」という携帯ゲームがありました。単機能なので、学校でゲーム機本体の交換を行った経験のある人もいるでしょう。ゲームウォッチは、名前の通り本来は時計なのですが、内蔵されたCPUでソフトウェア的に時刻情報を管理していたようです。頻繁にゲームを行うと、CPU割り込みが増え、表示時刻が遅れるという問題がありました。仮想環境でもこれと似たような問題が発生します。

ちなみにゲームウォッチの発売は1980年なので、このたとえ話は40歳代以上にしか分からないと思います。何しろファミリーコンピューター(ファミコン)以前の話です。

●Hyper-V統合サービスでの時刻同期

閑話休題、そこでHyper-Vでは「統合サービス」を仮想マシン上で動作させることで、時刻の遅れを防ぎます。

マイクロソフトのWebサイト「ヒント: Hyper-V 仮想化環境におけるゲスト OS の時刻同期について」によると、時刻同期は以下のように行われます(Windows Server 2008/2008 R2での記載ですが、2012でも同じだと思われます)。

  • ゲストOSの時刻が、ホストOSより遅れている場合(5秒以上)
    強制的に時刻同期を行う
  • ゲストOSの時刻とホストOSの時刻のずれが5 秒未満の場合
    時刻同期を行うかどうかは NTP (w32timeサービス) に委任
    統合サービスの時刻同期 はVM IC Time Synchronization Provider という名前の NTP Time Providerとして提供
  • ゲストOSの時刻が、ホストOSの時刻より進んでいる場合(5秒以上)
    時刻同期しないので、必要に応じてNTPなど、他の時刻同期機構を利用

また、統合サービスの "時刻の同期" は、他の時刻ソース(他の NTP サーバー)の参照環境と共存可能なように実装されているそうです。

その他に、ゲストOSの起動時に同期します。ゲストOSの時刻はシャットダウンまたは保存時に停止するため、次に起動したときは必ず遅れています。つまり、メカニズムとしては「5秒以上遅れている場合」と同じです。

 

●NTPの構成

NTPのパラメータ調整はW32TMコマンドを使います。仮想マシンンに依存しない時刻同期については、私と同じDirectory ServicesのMicrosoft MVPである小鮒道成さんが書いた記事が参考になります。

Windowsネットワーク時刻同期の基礎とノウハウ

万一時刻がずれてしまったらどうするかということも問題になります。時刻変更の影響が予測できる場合で、許容できる程度のリスクであれば、一気に同期させるのもひとつの方法です。

時計を進めることは、遅らせることに比べてリスクが少ないと考えられます。通常、仮想マシンンは時刻が遅れるので、多くの場合は問題が出ません。

しかし、時刻変更の影響が予測できない場合や、リスクが大きい場合はどうすればいいでしょう。NTPのパラメータで調整できるならそうしてください。そうでなければ、人間が少しずつ時刻差を縮めていくしかありません。

 

●【追記】ドメインコントローラーの構成

仮想マシンドメインコントローラーでは特別な注意があります。

Microsoft TechNetのドキュメント「仮想化ドメイン コントローラーの展開に関する考慮事項」から引用します(太字は私の注釈)。

ドメイン コントローラーとして構成された仮想マシンでは、統合サービスを通じてホストとの時間の同期を無効にしてください。代わりに、既定の Windows タイム サービス (W32time) ドメイン階層時間の同期を使用してください。

ホスト時間の同期では、ゲスト オペレーティング システムは各自のシステム クロックをホスト オペレーティング システムのシステム クロックに同期させることができます。ドメイン コントローラーはそれぞれ独自の時間同期メカニズムを持っているので、ドメイン コントローラーとして構成された仮想マシンではホスト時間の同期を無効にする必要があります。ドメイン コントローラーが各自のソースから時間を同期させると同時にホストからも時間を同期させた場合、ドメイン コントローラーの時間が頻繁に変化する可能性があります。ドメイン コントローラーのタスクの多くはシステム時間に関連付けられているので、システム時間が突然変化した場合、それが原因で残留オブジェクトがディレクトリに残り、レプリケーションが停止する可能性があります。

Hyper-V マネージャーの [統合サービス] セクションにある仮想マシンの設定で [コンピューターの時計の同期] チェック ボックスをオフにすることで、ホスト時間の同期を無効にすることができます。