第3回 w32tmコマンドとレジストリによるWindows Timeサービスの制御Windowsネットワーク時刻同期の基礎とノウハウ(改訂版)(4/4 ページ)

» 2012年07月12日 05時00分 公開
[小鮒通成マイクロソフトMVP]
前のページへ 1|2|3|4       

 Windows Timeサービスの動作は、関連するレジストリ値を調整することで制御できる。権限を持った時刻サーバ設定や、同期先NTPサーバや同期間隔といった、基本的な設定に関するレジストリ値は前回の記事で紹介したので、そちらを参考にしてほしい。今回は、基本的な設定以外で役に立つレジストリ値について、いくつか紹介しよう。

slewモードで同期する範囲を変更したい

項目 内容
キー HKEY_LOCAL_MACHINEの
SYSTEM\CurrentControlSet\services\W32Time\Config
値の名前 MaxAllowedPhaseOffset
REG_DWORD
1(ワークグループ)、300(ドメイン)
数値は10進数
slewモードで同期する範囲の設定

 連載第1回で紹介した「slewモード」を使うことで、時刻が後戻りすることなく、ゆっくり時刻を同期することができる。MaxAllowedPhaseOffsetレジストリ値は、slewモードで同期を行う最大の時刻差を指定する。たとえば“300”と設定すれば、NTPサーバと300秒(=5分間)以下の時刻差であればslewモードで同期を行い、それを超える場合stepモードで、すぐに時刻を同期する。デフォルト値はワークグループ環境で“1”、ドメイン環境で“300”なので、特にワークグループ環境でのWindows Timeサービスをslewモードで動作させたい場合、調整が必要だろう。

 ただし、slewモードで時刻同期を行う場合、以下2つのレジストリ値も関連するので、注意が必要である。

項目 内容
キー HKEY_LOCAL_MACHINEの
SYSTEM\CurrentControlSet\services\W32Time\Config
値の名前 PhaseCorrectRate
REG_DWORD
1(ドメイン・コントローラを除く)、7(ドメイン・コントローラのみ)
値の名前 UpdateInterval
REG_DWORD
360,000(ワークグループ)、30,000(ドメイン・メンバ)、100(ドメイン・コントローラ)
数値は10進数
時刻の修正レートの設定

 PhaseCorrectRateレジストリ値は、NTPサーバから受け取った時刻サンプルに対してシステム時刻を修正する速度を制御するもので、値が小さいとゆっくり修正し、値が大きいと素早く修正する。またUpdateIntervalレジストリ値は、修正を行うサイクル時間(どのくらいの時間間隔でクロックの修正を行うか)を指定し、値が小さいほど短い間隔で修正動作が繰り返される。

 Windows Timeサービスにおいて、slewモードで同期を行うためには次の2つの条件が必要である。

  1. NTPサーバとの時刻差がMaxAllowedPhaseOffsetレジストリ値より小さいこと
  2. 以下の条件式で「真(True)」であること
    |[NTPサーバとの時刻差(秒数)×10,000,000]| ÷([PhaseCorrectRateの値]×[UpdateIntervalの値]) < [クロックレートの値×10,000,000] ÷ 2

 NTPサーバとの時刻差およびクロックレートの値はClock Tick(1msecが10,000Clock Tick)として求めるため、1,000(msec)×10,000(Clock Tick)=10,000,000を乗算する必要がある。クロックレートはシステムクロックの速度を制御するものであり、ハードウェア(主にCPU構成)に依存する。クロックレートの実際の値は、w32tm /query /status /verboseコマンドの「クロック レート」の表示で確認できる。

 仮にMaxAllowedPhaseOffsetレジストリ値が要件を満たしていても、PhaseCorrectRateおよびUpdateInterval値によっては、slewモードで時刻同期ができないことがあるので注意してほしい。例えばドメイン環境で、参照先NTPサーバと同じ時刻差になっていても、ドメイン・コントローラとメンバ・サーバでは同期の結果が異なるケースがあるのだ。

 例として、参照先NTPサーバと30秒の時刻差があり、クロックレートが0.0156秒のドメイン・コントローラとメンバ・サーバがある場合を考える。デフォルト値が300である「MaxAllowedPhaseOffsetレジストリ値より小さい」という条件1の要件を満たしていても、結果としてドメイン・コントローラではslewモードではなく、stepモードで同期される。条件2の計算式を満たさないためである。

  • ドメイン・コントローラの場合
    300,000,000÷7×100(=428571.4285) > 156,000÷2(=78,000)
    ⇒ 要件を満たさないのでstepモードで同期
  • メンバ・サーバの場合
    300,000,000÷1×30,000(=10,000) < 156,000÷2(=78,000)
    ⇒ 要件を満たすのでslewモードで同期

 なおWindows Server 2008 R2およびWindows 7のWindows Timeサービスでは、時刻が遅れていても進んでいても、上記の2つの条件を満たせばslewモードとして動作する。Windows Server 2003 R2以前の動作からは変更されているので注意してほしい。

参照先NTPサーバや時刻同期の修正状況をイベント・ログに出力したい

項目 内容
キー HKEY_LOCAL_MACHINEの
SYSTEM\CurrentControlSet\services\W32Time\Config
値の名前 EventLogFlags
REG_DWORD
0=記録しない、1=不連続で修正された秒数を記録、2=NTPサーバからの時刻データ受信を記録、3=両方のログを記録
イベント・ログに記録する内容の設定(1)

 Windows Timeサービスの時刻同期の状態は、デフォルトでは、参照先NTPサーバからの時刻データ受信(イベントID 37)および時刻サンプルとシステム時刻の同期(イベントID 35)のタイミングでイベント・ログに記録される。

 このレジストリ値では、参照先NTPサーバからの時刻データ受信(イベントID 37)および不連続で修正された時刻の秒数(イベントID 33)を記録するかどうかを設定できる。イベントID 33は、システム時刻がStepモードで同期した際、どのくらい時刻が変更(ジャンプ)したのか記録される。slewモードで連続的な変更が起こった場合は記録されない。

時刻データ受信(イベントID 37)の例 時刻データ受信(イベントID 37)の例

不連続で修正された時刻の秒数(イベントID 33)の例 不連続で修正された時刻の秒数(イベントID 33)の例

項目 内容
キー HKEY_LOCAL_MACHINEの
SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient
値の名前 EventLogFlags
REG_DWORD
0=記録しない、1=NTPサーバとの時刻差を記録、2=システム時刻の同期を記録、3=両方のログを記録
イベント・ログに記録する内容の設定(2)

 このレジストリ値では、参照先NTPサーバからの時刻データを使って同期(イベントID 35)およびNTPサーバとシステム時刻の時刻差の秒数(イベントID 51)を記録するかどうかを設定できる。イベントID 51は、NTPサーバとシステム時刻にどのくらいの時刻差があるのか記録される。slewモードで連続的な変更が起こった場合は記録されない。

参照先NTPサーバからの時刻データを使って同期した例(イベントID 35) 参照先NTPサーバからの時刻データを使って同期した例(イベントID 35)

NTPサーバとシステム時刻の時刻差の秒数(イベントID 51)の例 NTPサーバとシステム時刻の時刻差の秒数(イベントID 51)の例

Windows Timeサービスの時刻同期の範囲を制限したい

項目 内容
キー HKEY_LOCAL_MACHINEの
SYSTEM\CurrentControlSet\services\W32Time\Config
値の名前 MaxPosPhaseCorrection
REG_DWORD
54,000(ワークグループ)、4,294,967,295(=0xffffffff。ドメイン)
値の名前 MaxNegPhaseCorrection
REG_DWORD
54,000(ワークグループ)、4,294,967,295(=0xffffffff。ドメイン)
時刻同期の範囲の設定

 このレジストリ値では、slewモードやstepモードに関係なく、時刻を進めたり遅らせたりする範囲そのものを指定する。MaxPosPhaseCorrectionレジストリ値が、時刻を進めることが可能な範囲を、MaxNegPhaseCorrectionレジストリ値が、時刻を遅らせることが可能な範囲を、それぞれ秒数で指定できる。デフォルト値はWindows Server 2003R2以前と同じ値であり、4,294,967,295秒(0xffffffff)を指定することで、機能を無効化できる。

 ただしWindows Server 2008以降のデフォルト設定として、マイクロソフトでは172,800秒(=48時間)を推奨している。これは、中途半端な時間を設定すると、予期しない同期の拒否や、問題が発生した際のデバッグがやりにくくなるため、ということのようである。そのため、12時間や24時間、48時間といった区切りで設定するとよい。詳細については、次のサポート技術情報を参照していただきたい。

W32timeデバッグ・ログを取得したい

項目 内容
キー HKEY_LOCAL_MACHINEの
SYSTEM\CurrentControlSet\services\W32Time\Config
値の名前 FileLogName
REG_SZ
ログ・ファイルのパス名。「C:\Windows\Temp\w32time.log」などを指定する
値の名前 FileLogSize
REG_DWORD
ログ・ファイルのサイズ(bytes)。1,000,000などを指定する
値の名前 FileLogEntries
REG_SZ
ログ・ファイルのエントリ値。「0-300」などを指定する
値の名前 FileLogFlags
REG_DWORD
0(可読できる時刻表記)、1(NTタイム・エポック形式の時刻表記)、2(ローカル・システム時刻表記)
W32timeデバッグ・ログの取得の設定

 Windows Timeサービスの時刻同期でトラブルシュートを行う場合、サービスの詳細な動作を解析するために、w32timeデバッグ・ログを有効にするとよい。このログはw32tm /debug /enableコマンドで設定できるが、直接レジストリ値で設定することもできる。

 w32timeデバッグ・ログの概要については、サポート技術情報の「Windowsタイムサービスのデバッグログを有効にする方法」を参照していただきたいが、レジストリ値で設定する場合、FileLogNameレジストリ値(ログ・ファイルのフルパス)、FileLogSizeレジストリ値(ログ・ファイルのサイズ)、FileLogEntriesレジストリ値(ログ・ファイルのエントリ値)を利用する。また、w32tmコマンドでは設定できないが、FileLogFlagsレジストリ値を2に指定することで、デバッグ・ログの時刻表記が「ローカル・システム時刻」となって、大変読みやすくなる。

通常のデバック・ログの日時表示例 通常のデバック・ログの日時表示例
各行の先頭にある日付表示が分かりづらい。

デバッグ・ログをシステム時刻の日時表示にした場合の例 デバッグ・ログをシステム時刻の日時表示にした場合の例
FileLogFlagsレジストリ値を2に指定してみた。日付表示がローカル・システム時刻となっていて、ログ・ファイルを読みやすい。

 なおFileLogEntriesレジストリ値に指定する値だが、すべての動作についてのログを取得するのであれば“0-300”となり、通常はこの設定で問題ないだろう。ただしデバッグ・ログの記載項目を減らして見やすくしたいといった場合、これを制御することも可能である。詳細な意味については、TechNetの「Parameters\W32Time > Config Subkey > FileLogEntries」に記載があるので、参考にしていただきたい。


 次回の最終回では、w32timeデバッグ・ログの判読方法や、Windows Timeサービスでのトラブルシュートに関する情報をお知らせする予定である。


「Windowsネットワーク時刻同期の基礎とノウハウ(改訂版)」のインデックス

Windowsネットワーク時刻同期の基礎とノウハウ(改訂版)

前のページへ 1|2|3|4       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。