【AD DS】Windows OS の NTP クライアントの設定や基本動作について

  • 2023年5月28日
  • 2023年6月8日
  • AD DS

時刻同期とは、ネットワーク上にあるコンピューター端末のシステム時刻を正確にあわせる仕組みのことを指します。ネットワーク上にある各コンピューター同士で、正確な時刻を共有することはシステムの運用/管理において重要です。

時刻同期の代表的なプロトコルとして、NTP(Network Time Protocol)があります。Windows OS でもシステム時刻の時間をあわせるために、NTP を利用して時刻同期を行っています。特に Active Directory ドメインを導入している環境では、主な認証方式に Kerberos 認証が利用されているため、ドメイン内の端末間で時刻ずれがおきないように NTP で時刻同期を行い、同じシステム時刻を共有しています。NTP の基礎知識やドメイン環境での時刻同期の仕組みについては、以下の記事にて紹介しております。

あわせて読みたい!

時刻同期とは、ネットワーク上にあるコンピューター端末のシステム時刻を正確にあわせる仕組みのことを指します。ネットワーク上にある各コンピューター端末にて、正確な時刻を共有することはシステムの運用/管理において重要です。 時刻同期の代表的なプ[…]

今回は、NTP クライアントの各種設定や時刻同期の内部動作について紹介します。

クライアントの時刻同期の各種設定

Windows OS にて、NTP クライアントの時刻同期に関する設定方法は、以下の方法があります。

  • レジストリ設定
  • コマンド(w32tm.exe)を実行
  • グループ ポリシーによる設定配布
  • GUI の設定 (※ワークグループの設定)

各設定方法について詳細を紹介します。

レジストリ設定

Windows Time サービス(W32Time サービス)とは、Windows コンピューターにて NTP 時刻同期を行うための機能です。W32Time サービスの動作に関する設定は、全てレジストリの設定によって決まります。後述するコマンドやグループ ポリシーの設定は、内部的にはレジストリの値を変更する動作になります。

W32Time サービスの設定に関するレジストリ キーは以下の通りです。

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time
W32Time のキーには、以下のサブキーが用意されており、時刻同期に関する各設定が行えます。
サブキー 設定内容
Config W32Time サービスに関する基本設定
Parameters  W32Time サービスの各設定のパラメーター設定
TimeProviders\NtpClient NTP クライアントに関する設定
TimeProviders\NtpServer NTP サーバーに関する設定
TimeProviders\VMICTimeProvider Hyper-V 環境でホストと同期する際に利用されるプロバイダー VM IC Time Synchronization Provider に関する設定

管理者権限でレジストリ エディタを開き、各種設定を変更します。

コマンド(w32tm.exe)を実行

w32tm.exe コマンドにて、W32Time サービスに関する各設定や状態を確認することができます。w32tm コマンドには複数のオプションが用意されており、時刻同期の状態を管理するために有効です。

W32Time サービスの設定を変更するには、w32tm /config コマンドにてレジストリを設定することができます。

w32tm /config [/update] [/manualpeerlist:<NTPサーバ名>] [/syncfromflags:<同期のタイプ>] [/localclokdispersion:<秒>] [/releable:<YES|NO>] [/largephaseoffset:<ミリ秒>]

w32tm /config コマンドを実行すると、内部的には W32Time サービスの設定に関するレジストリ キーの値が変更されます。w32tm /config コマンドによりレジストリ値を変更した後は、設定を反映するために W32Time サービスを再起動します。/update オプションを指定すると W32Time サービスを再起動しなくてもサービスに設定は反映されますが、一部の設定が反映されません。そのため、設定変更を W32Time サービスに確実に反映させるためには、W32Time サービスを再起動してください。

W32Time サービスの設定以外に、時刻同期に関する状態や管理に有用な w32tm  コマンドを紹介します。

ピア(同期先の NTP サーバー)の情報を表示

時刻同期を行ったピアの NTP サーバーの情報や時刻同期の状態を確認することができるコマンドです。

w32tm /query /peers
実行例

C:\>w32tm /query /peers
ピア数: 1

ピア: TEST01DC01.test01.local
状態: アクティブ
残り時間: 1020.5257755s
モード: 3 (クライアント)
階層: 3 (二次参照 – (S) NTP で同期)
ピアポーリング間隔: 10 (1024s)
ホストポーリング間隔: 10 (1024s)

C:\>

w32tm /query /peers コマンドの実行結果の各項目の意味は以下の通りです。

ピア:NTP 時刻同期先の NTP サーバーの FQDN
残り時間:次回のポーリングまでの残り時間
階層:時刻同期先の NTP サーバーのストラタムの値
ピアポーリング間隔:ポーリング間隔
ホストポーリング間隔:ポーリング間隔
※「ピアポーリング間隔」と「ホストポーリング間隔」はいずれも、W32Time サービスの PeerPollingThread がシステム時刻の時刻同期を行う際に使用するポーリング間隔の設定が表示されます。W32Time サービスの設定や動作を理解する上で違いを意識する必要はありません。
 

現在の時刻同期の状態を表示

NTP クライアントの端末の現在の時刻同期の状態を表示するためのコマンドです。
w32tm /query /status
実行例:

C:\>w32tm /query /status
閏インジケーター: 0 (警告なし)
階層: 2 (二次参照 – (S)NTP で同期)
精度: -23 (ティックごとに 119.209ns)
ルート遅延: 0.0013564s
ルート分散: 3.7760938s
参照 ID: 0xC0A80101 (ソース IP: 192.168.1.1)
最終正常同期時刻: 2023/05/25 18:51:34
ソース: TEST01DC01.test01.local
ポーリング間隔: 10 (1024s)

C:\>

w32tm /query /status コマンドの実行結果の各項目の意味は以下の通りです。

階層:NTP クライアント自身のストラタムの数値
参照 ID:NTP 時刻同期先の NTP サーバーの IP アドレスの 16 進数の表記
ソース IP:NTP 時刻同期先の NTP サーバーの IP アドレス
ソース:NTP 時刻同期先の NTP サーバーの FQDN
ポーリング間隔:ポーリング間隔
「ポーリング間隔」は、W32Time サービスの W32TmServiceMain がシステム時刻の時刻同期を行う際に使用するポーリング間隔の設定が表示されます。
 

その他のコマンド

NTP クライアント端末にて、時刻同期の管理を行うにあたって便利なコマンドを紹介します。
コマンド 説明
w32tm /resync 手動で時刻同期を行います
w32tm /query /configuration W32Time サービスに関するレジストリ設定を表示します
w32tm /stripchart /computer:<NTP サーバー> /dataonly NTP サーバーとの時刻差を表示します。/computer には NTP サーバーの IP アドレスを指定します
 
w32tm コマンドの各オプションの詳細については、マイクロソフトの公式情報をご確認ください。
 

グループ ポリシーによる設定配布

Active Directory ドメインを利用している環境では、グループ ポリシーを用いて管理している端末に W32Time サービスの設定を配布することができます。W32Time の設定に関するポリシーは、以下のポリシー パスにて設定できます。

[コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [Windows タイム サービス]

グループ ポリシーを設定した場合には、設定は次のレジストリに保存されます。

HKEY_LOCAL_MACHINE¥SOFTWARE¥Policies¥Microsoft¥W32Time
W32Time のレジストリ設定は既定で存在しますが、ポリシーの設定は既定では未構成となります。
ポリシーにより W32Time の設定を行われている場合、ローカルのレジストリ設定よりもポリシーの設定の方が優先されます。
 

GUI の設定

ワークグループの Windows OS 端末の場合、時刻同期の設定を行う GUI にて設定することができます。GUI での設定手順は以下の通りです。

1) 管理者権限をもつユーザーでログオンします。

2) スタートボタンから設定を開きます。

3) [時刻と言語] をクリックします。

4) [日付と時刻] にて、[別のタイム ゾーンの時計を追加する] をクリックします。

5) [インターネット時刻] タブを選択し、[設定の変更] をクリックします。

6) [インターネット時刻サーバーと同期する] のチェックボックスを有効にして、[サーバー] の項目に NTP サーバーの FQDN もしくは IP アドレスを指定して [OK] をクリックします。既定の NTP サーバーは time.windows.com です。

NTP 時刻同期のシーケンス

NTP クライアントにて W32Time サービスの各レジストリ設定の説明にあたり、NTP クライアントが時刻同期を行うシーケンス(流れ)を理解しておくことが重要です。NTP クライアントでの時刻同期のシーケンスは以下の通りです。

  1. Peer Search
  2. Send NTP Request
  3. Receive NTP Response
  4. Add Sample / Packet Test
  5. Select Best Sample / Clock Discipline

時刻同期の大まかな流れとしては、① Peer Search にて時刻同期先とする NTP サーバーを探索、② Send NTP Request にて時刻同期の要求を送信、③ Receive NTP Response にて時刻同期の応答を受信、④ Add Sample/Packet Test にて時刻同期の応答の中から時刻サンプルの検証、⑤ Select Best Sample/Clock Discipline にてシステム時刻を調整、というフローになります。

上記のフローを把握した上で、各ステップに関連する各種設定について紹介します。

参照 NTP サーバーの設定

時刻同期先となる参照 NTP サーバーの指定に関するレジストリ設定です。この設定は、① Peer Search の時刻同期先とする NTP サーバーを探索する動作に関連する設定となります。

NTP サーバーの探索における動作は Parameter\Type のレジストリ設定によって異なります。レジストリ設定はワークグループの端末の既定値は NTP で、ドメイン参加している端末の Type の既定値は NT5DS です。

パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Parameter
値:Type
型:REG_DWORD
設定値:下表を参照
設定値 設定値における NTP サーバー探索の動作
NTP Parameter\NtpServer レジストリに設定された NTP サーバーからの時刻同期
NT5DS ドメイン環境から同期
ドメイン コントローラー:時刻同期先のドメイン コントローラーの選定アルゴリズムに従って探索
ドメイン メンバー:コンピューター起動時のログオン先のドメイン コントローラー
AllSync NTP と NT5DS の両方から同期
NoSync

時刻同期をしない

レジストリ Type の設定値が NTP もしくは AllSync となっている場合、Parameter\NtpServer のレジストリの設定を参照します。レジストリ NtpServer は、NTP クライアントの参照先の NTP サーバーを指定するレジストリです。

パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Parameter
値:NtpServer
型:REG_DWORD
設定値:<NTP サーバー 1>,<フラグ 1>  <NTP サーバー 2>,<フラグ 2> …
記述例:ntp1.nekomaru.com,0xa  ntp2.nekomaru.com,0xa

NTP クライアントが参照する NTP サーバーの指定は、NTP サーバーの FQDN もしくは IP アドレスにて指定します。また、<フラグ> には NTP サーバーから時刻同期をする時の動作を決めるオプションを指定します。

フラグの設定値
0x1:レジストリ TimeProviders¥NtpClient¥SpecialPollInterval にて設定されているポーリング間隔で時刻同期する
0x2:UseAsFallbackOnly モードを使用する。優先 NTP サーバーが使用不可の場合にのみ時刻同期する NTP サーバーとなる
0x4:SymmetricActive モードとして要求を送信する。お互いが同期を取る時刻同期方法となる
0x8:Client モードとして要求を送信する

レジストリの設定値のフラグには、有効にしたいフラグの合計値を指定します。例えば、「UseAsFallbackOnly モードを使用」「Client モードとして要求を送信」の2つのフラグを有効にしたい場合には、0x2 + 0x8 = 0xa を指定します。

時刻同期先となる NTP サーバーが、Linux の OS の端末やネットワーク機器の場合、Client モードの時刻同期の要求を受け付けない製品が存在します。そのため、Windows OS の NTP クライアントの NTPServer レジストリでは 0x8 のフラグが有効となる設定にすることが一般的です。
 

ドメイン参加時の Type 設定の自動変更

Windows OS のワークグループの端末のレジストリ Type の既定値は NTP となり、レジストリ NtpServer に設定されている NTP サーバーに時刻同期を行う設定となっています。

Active Directory ドメイン環境では、主な認証方式として Kerberos 認証が利用されており、ドメインで管理している端末間で5分以上の時刻ずれがあると、認証に失敗してしまいます。そのため、ドメイン環境で Kerberos 認証が正常に利用できるように、ドメイン内で NTP ネットワークを構成して各端末が同じ時間を共有しています。ドメイン環境の NTP ネットワークを利用するには、NTP クライアントの時刻同期先として NTP サーバーとして動作するドメイン コントローラーが選択される構成になる必要があります。

NTP サーバーとして動作するドメイン コントローラーを探索する Type の設定は「NT5DS」もしくは「AllSync」です。ワークグループの端末の既定値は「NTP」であるため、ワークグループ端末をドメイン参加させる際に Type の設定値は自動で変更される動作となります。

ドメイン参加時に端末の Type の設定値が「NTP」である場合、以下の通りに変更されます。

■設定値が NTP の場合
〇 レジストリ NtpServer の設定値が既定(time.windows.com,0x9)のまま ⇒ NT5DS に変更
〇 レジストリ NtpServer の設定値が既定(time.windows.com,0x9)から変更済 ⇒ AllSync に変更

■設定値が NoSync の場合
〇 レジストリは NoSync のまま変更されない

GUI の設定においては、[インターネット時刻設定] の [インターネット時刻サーバーと同期する] のチェックボックスが無効の設定になっている場合、レジストリ Type の設定値は NoSync となります。

Type が NoSync となっている場合、ドメイン参加後も時刻同期が機能しない状態となります。ワークグループの端末の Type の設定が NoSync となっている場合には、既定値である NTP に変更してください。

ポーリング間隔の設定

NTP サーバーから時刻同期を行う間隔を設定するレジストリ設定です。この設定は、② Send NTP Request の時刻同期の要求を送信するタイミングに関連する設定となります。時刻同期を行う間隔を「ポーリング間隔」と呼びます。

ポーリング間隔には、① MinPollInterval/MaxPollInterval の間隔と、② SpecialPollInterval の間隔の2通りの設定があります。①と②のどちらのポーリング間隔の設定を利用して時刻同期を行うかは、NTP クライアントの Type と NtpServer の設定によって決まります。

① MinPollInterval/MaxPollInterval の間隔

MinPollInterval/MaxPollInterval のポーリング間隔の設定で時刻同期を行う場合、時刻同期の間隔は MinPollInterval から開始し、NTP クライアントの NTP サーバーの時刻の誤差が小さいと判断されると徐々に時刻同期の間隔が長くなっていきます。

MinPollInterval/MaxPollInterval のポーリング間隔のレジストリ設定は以下の通りです。

パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Config

値①:MinPollInterval
型①:REG_DWORD
既定値①:ワークグループ 10、ドメイン メンバー 10、ドメイン コントローラー 6

値②:MaxPollInterval 
型②:REG_DWORD
既定値②:ワークグループ 15、ドメイン メンバー 15、ドメイン コントローラー 10

時刻同期のポーリング間隔は、2^MinPollInterval から 2^MaxPollInterval(2の自乗)の間となります。例えば、ワークグループ端末で MinPollInterval/MaxPollInterval のポーリング間隔の既定値の場合、2^10 =1024(秒)=約 17(分) から 2^15 = 32768(秒) = 約 546(分) の間で時刻同期が行われます。
ポーリング間隔の増減を決定するための算出方式は RFC 1305 の規約に従っています。ポーリング間隔の増減の判断条件の閾値はレジストリ PollAdjustFactor にて調整できます。
パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Config
値:PollAdjustFactor
型:REG_DWORD
既定値:1
PollAdjustFactor の設定値の数字が大きいほど、ポーリング間隔の増減が行われやすくなります。
MinPollInterval/MaxPollInterval のポーリング間隔が使われるのは、Type が NT5DS もしくは Type が NTP かつ NtpServer のフラグ 0x1 がオフの場合です。
 

② SpecialPollInterval の間隔

SpecialPollInterval のポーリング間隔の設定で時刻同期を行う場合、常に SpecialPollInterval の設定値の間隔で時刻同期を行います。

SpecialPollInterval のポーリング間隔のレジストリ設定は以下の通りです。

パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Config
値:SpecialPollInterval
型:REG_DWORD
既定値:1
時刻同期のポーリング間隔に SpecialPollInterval を使用する場合、W32Time サービスの起動直後には時刻同期は行いません。W32Time サービスの停止時に、最後に時刻同期を行った時刻をレジストリ SpecialPollTimeRemaining に書き込み、W32Time サービスの再開時には前回の時刻同期の時間を踏まえて、ポーリング間隔が経過した後に時刻同期が行われます。SpecialPollTimeRemaining のレジストリは以下の通りです。
パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\TimeProviders\NtpClient
値:SpecialPollTimeRemaining
型:REG_DWORD
設定値:最後に時刻同期に成功した時刻
SpecialPollTimeRemaining には、NtpServer のフラグに 0x1 が ON になっていない場合は空文字が書き込まれた状態となります。
SpecialPollInterval のポーリング間隔が使われるのは、Type が NTP かつ NtpServer のフラグ 0x1 がオンの場合です。
 

システム時刻の調整

NTP サーバーから時刻サンプルの情報を受け、NTP クライアントの端末のシステム時刻を調整する動作に関する複数のレジストリ設定を紹介します。この設定は、④ Add Sample / Packet Test における NTP 応答パケットの検証や、⑤ Select Best Sample / Clock Discipline における、時刻サンプルの選定やシステム時刻を調整する動作に関する設定となります。

Packet Test 8 の検証

④ Add Sample / Packet Test の処理では、時刻同期先の NTP サーバーから受信した NTP Response の Packet Test を行います。Packet Test は 8 つあり、8 番目の Packet Test では、ルート分散値の値を検証します。

Packet Test 8

テスト内容 ルート分散値が許容できる範囲であるか確認
失敗原因 上位に存在する NTP サーバーと最上位の NTP サーバーとの遅延時間や分散値の合計が一定値以上である場合に発生

時刻情報の信頼性が不安定な環境の場合、 上位 NTP サーバーからのルート分散値が大きくなり、Packet Test 8 の検証に失敗します。Packet Test 8 の検証に失敗すると、NTP Response の時刻サンプルは破棄されて時刻同期が行えない状況となります。そのような NTP ネットワーク環境の場合、Packet Test 8 のテストをスキップすることで時刻同期ができない問題を回避できる場合があります。

Packet Test 8 のテストをスキップするレジストリは以下の通りです。

レジストリ パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\TimeProviders\NtpClient
値:CompatibilityFlags
型:REG_DWORD
既定値:0x80000000 
Packet Test 8 のテストをスキップするには、CompatibilityFlags の設定値を 0x80000001 に変更します。
 

許容する時刻サンプルの時間差

⑤ Select Best Sample / Clock Discipline において選択された時刻サンプルが、NTP クライアントの端末の現在のシステム時刻と乖離がある場合、システム時刻の調整は行いません。システム時刻の調整を行う場合、時刻サンプルとシステム時刻の時間差が許容する範囲内である必要があります。許容する時間差を超えた場合には、現在のシステム時刻と乖離があるとみなされてシステム時刻の調整は行いません。

許容する時刻サンプルの時間差は、以下のレジストリにて閾値が定義されています。

■ 遅れの時間差
レジストリ MaxNegPhaseCorrection の設定値よりも時刻の遅れが発生している場合、時刻同期を行わない動作となります。

パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Config
値:MaxNegPhaseCorrection
型:REG_DWORD
 

■ 進みの時間差
レジストリ MaxPosPhaseCorrection の設定値よりも時刻の進みが発生している場合、時刻同期を行わない動作となります。

パス:HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time\Config
値:MaxPosPhaseCorrection
型:REG_DWORD

設定値の単位は秒です。MaxNegPhaseCorrection/MaxPosPhaseCorrection の既定値は、以下の通りです。

■ドメイン メンバーの既定値
〇 Windows Server 2003 / Windows Vista 以前の OS:4,294,967,295 (秒)
〇 Windows Server 2008 / Windows 7 以降の OS:172,800 (秒) 

■ワークグループ端末の既定値
〇 全ての OS バージョン:54,000 (秒)

Slew/Step モード

⑤ Select Best Sample / Clock Discipline において選択された時刻サンプルに、NTP クライアントのシステム時刻を合わせる際に、時刻の調整のモードとして Slew モードと Step モードの2つのモードがあります。

Slew モード

Slew モードはシステム時間を徐々に調整して、NTP サーバーの時刻サンプルの時間にあわせるモードです。
システム時刻が進んでいる場合は、システム時刻の進み方を遅くして時刻の補正を行います。
システム時刻が遅れている場合は、システム時刻の進み方を早くして時刻の補正を行います。

Step モード

Step モードはシステム時刻を即座に調整して、NTP サーバーの時刻サンプルの時間にあわせるモードです。
システム時刻が即座に調整されるため、時刻の戻りや飛びが発生します。データベースの製品など、時刻に関してセンシティブなアプリケーションやサービスを使用しているサーバーでは注意が必要です。

Clock Discipline の処理において、Slew モード/Step モードのどちらを使うかを指定することはできません

Clock Discipline の処理において、Slew モード/Step モードのどちらを使うかは、以下の条件式の結果によって決まります。以下の2つの条件式をいずれも満たす場合に、Slew モードでシステム時刻の調整が行われます。2つの条件を満たさない場合には、Step モードでシステム時刻の調整が行われます。

Slew モードの条件式は、OS のバージョンによって異なります。ゆるやかな時刻同期を提供している Windows Server 2012 R2/Windows 8.1 以前の Slew モードの条件式は以下の通りです。

 Windows Server 2012 R2/ Windows 8.1 以前のSlew モードの条件式
1. CurrentTimeOffset / (PhaseCorrectRate * UpdateInterval) <= System Clock Rate / 2
2. CurrentTimeOffset <= MaxAllowedPhaseOffset
 
また、精密な時刻同期ができるようになった Windows Server 2016 / Windows 10 以降の Slew モードの条件式は以下の通りです。
 Windows Server 2016/ Windows 10 以降のSlew モードの条件式

■ 事前計算式
PhaseCorrection = CurrentTimeOffset / (16 * PhaseCorrectRate * pollIntervalInSeconds)
MaximumCorrection = CurrentTimeOffset / (UpdateInterval / 100)
PhaseCorrection = min(PhaseCorrection, MaximumCorrection)

※ いずれかの小さい値を PhaseCorrection に代入します。

■ 条件式
1. PhaseCorrection <= System Clock Rate / 2
2. CurrentTimeOffset <= MaxAllowedPhaseOffset

※ 条件式 1 は、事前計算式にて、MaximumCorrection が利用されない場合には、以下と同一になります。
1. CurrentTimeOffset / (16 * PhaseCorrectRate * pollIntervalInSeconds) <= System Clock Rate / 2

※注:Windows Server 2019 と Windows 10 1809 においては、Slew モードの条件の計算式に不具合があり、上記の条件式通りに動作しません。この不具合は、2021 年 10 月以降のセキュリティ更新プログラム(KB5006744) にて修正されており、この更新プログラムを適用した後には上記の条件式通りに動作します。
各条件式の変数に入る値は以下の通りです。
変数 説明
CurrentTimeOffset NTP クライアント端末のシステム時刻と、NTP サーバーから受信した時刻サンプルの時間差。
※条件式の算出の際には、クロックレート(ms)を clock ticks へ換算して計算
MaxAllowedPhaseOffset Slew モードで時刻同期を行うことが許容される時刻差を定義したレジストリ値。単位は clock ticks
キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
値: MaxAllowedPhaseOffset
※レジストリ MaxAllowedPhaseOffset の設定値の単位は秒であるため、条件式を計算する際は clock ticks へ換算 して計算
PhaseCorrectRate  NTP サーバーから受信した時刻サンプルを、どのくらいの速度で時刻を合わせるかの傾きを定義したレジストリ値。
キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
値の名前: PhaseCorrectRate
※条件式の算出の際には、値をそのまま 10 進数で計算
UpdateInterval NTP サーバーから受信した時刻サンプルを、どのくらいの間隔で時刻を合わせるかの傾きを定義したレジストリ値。
キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
値の名前: UpdateInterval
※条件式の算出の際には、値をそのまま 10 進数で計算
pollIntervalInSeconds NTP サーバーへのポーリング間隔。MaxPollInterval 及び MinPollInterval の間で動的に変化。
現在のポーリング間隔は、”w32tm /query /status” コマンドの実行結果の “ポーリング間隔” の値。
※条件式の算出の際には、pollIntervalInSeconds の値は秒で計算。コマンドの実行結果の “ポーリング間隔” が 10 の場合、2^10 = 1024 (秒) で計算
System Clock Rate システムのクロックレート。
システムのクロックレートは、”w32tm /query /status /verbose” コマンドの実行結果の “クロックレート” の値。
※条件式の算出の際には、クロックレート(ms)を clock ticks へ換算して計算

※ 単位の clock ticks は、1 秒 = 1 * 10^7 = 10,000,000 clock ticks で換算できます。

NTP クライアントの内部状態の遷移

NTP クライアントでの Clock Discipline の処理の中では、以下の 4 つの状態が存在します。内部状態により、NTP サーバーから提供された時刻サンプルで時刻同期を行うかどうかが決まります。

状態 内部処理の動作
Unset 常に時刻同期を行う
Hold 常に時刻同期を行う
Sync Spike と判断されない場合のみ時刻同期を行う
Spike 時刻同期を行わない

W32Time サービスの起動後や Step モードにより時刻同期を行った後には、内部状態は「Unset」にセットされます。その後、ポーリングが何回か行われ、正常に NTP サーバーから時刻同期している場合には「Sync」の状態に移行します。しかし、NTP サーバーから送信された時刻サンプルと NTP クライアントのシステム時刻を比較して、時刻差がレジストリ LargePhaseOffset で設定された値以上になると状態を「Sync」から「Spike」へ遷移されます。「Spike」状態になった後でも、LargePhaseOffset にて指定された閾値よりも時間差が小さくなれば「Sync」状態へ移行します。

内部状態の遷移で使用されるレジストリは以下の通りです。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
説明 既定値
LargePhaseOffset Spike 状態へ移行する閾値 50000000 (5秒)
SpikeWatchPeriod Unset 状態へ移行する閾値 (単位:秒) 900
HoldPeriod Sync 状態へ移行するポーリングの回数 (単位:回) 5
 

ワークグループ端末の時刻同期

ワークグループ端末では 1 週間に1度、NTP サーバーと同期するように既定で設定されています。Windows Server 2008 R2/Windows 7 以降の OS では、W32Time サービスの既定設定は以下の通りとなっています。

  • スタートアップの種類:手動
  • 状態:停止

時刻同期を行う際には、タスクスケジューラーに登録されているタスク「Time Synchronization」により、W32Time サービスを開始して時刻同期を行い、同期に成功すれば W32Time サービスは終了するという動作になります。

タスク スケジューラ ライブラリに登録されている Time Synchronization は、毎週日曜日、午前1時に時刻同期を行う設定になっています。

場所:Microsoft\Windows\Time Synchronization
名前:SynchronizeTime
トリガー:毎週日曜日、1:00 に起動
操作:W32Time サービスの起動
タスクにより起動した W32Time サービスは起動時に時刻同期を行います。同期に成功した場合には、W32Time サービスは終了します。同期に失敗した場合には、サービスの状態は開始のままとなり、ポーリングの間隔により時刻同期を行います。ワークグループ環境のポーリングの間隔は既定で1週間に1度と設定されているため、時刻同期に失敗した場合でも1週間に1度の同期頻度となります。

RTC とシステム時刻

物理的なハードウェアをもつコンピューターでは、電池稼働する RTC(Real-Time Clock)と呼ばれる内部時計を持っています。一方、システム時刻は OS が提供している時刻となります。

Windows はコンピューター起動時に RTC 時刻を読み込み、その後、システム時刻は起動時に読み込んだ RTC の時刻に起動からの経過時間を足し合わせることによって算出されます。RTC 時刻とシステム時刻は別々に動作していますが、W32Time サービスによる時刻同期の結果は必ずしもリアルタイムで RTC に書き込まれません。そのため、RTC 時刻とシステム時刻に乖離が生じることがあります。

RTC 時刻に時刻を書き込むタイミング、また読み込むタイミングについて紹介します。

RTC 時刻の読み込みのタイミング

RTC 時刻を読み込み、システム時刻に書き込まれるタイミングは以下の通りです。

  • OS 起動時
  • 1時間に1度に間隔で以下の2つの条件を満たした時
    • 「W32Time サービスが停止」or「W32Time サービスが Local CMOS Clock を参照」or「86400秒以上の時刻同期を行えていない」
    • システム時刻と RTC 時刻の時刻差が1分以上

RTC 時刻の書き込みのタイミング

RTC 時刻が更新されるタイミングは SetSystemTime 関数を呼び出した時です。RTC 時刻が書き込まれるタイミングは以下の通りです。

  • Step モードによる時刻同期の成功時
  • W32Time サービスの停止 (ただし、一度も時刻同期を成功していない場合は除く)
  • [日付と時刻の設定] や “net time /set コマンド” などからの手動設定時

Hyper-V のゲスト OS の時刻同期

Hyper-V の仮想環境では、ハードウェアをエミュレートすることで仮想 OS を実現していますが、ゲスト OS は物理的な RTC をもつことができないため、Hyper-V ホスト OS と時刻同期を行う動作となります。Hyper-V のゲスト OS とホスト OS との時刻同期について紹介します。

ゲスト OS 起動時の時刻同期

ゲスト OS の起動時には、Hyper-V のホストのシステム時刻を読み取り、その時刻でゲスト OS のシステム時刻を初期化します。

物理的なハードウェアをもつコンピューターでは、電池稼働する RTC(Real-Time Clock)と呼ばれる内部時計を持っています。コンピューターをシャットダウンした後も RTC の時刻は刻まれ、コンピューターの起動時には RTC から時刻を読み込みます。しかし、ゲスト OS には物理的な RTC をもつことはできないため、シャットダウン時には時刻を進めることはできません。

ゲスト OS では OS の起動時に大幅な時刻のずれを防ぐために、ゲスト OS の起動時には Hyper-V のホスト OS のシステム時刻が設定されます。

ゲスト OS 稼働中の時刻同期

ゲスト OS はシステム時刻の進みをハイパーバイザーにより実現していますが、ハイパーバイザーの負荷が高い場合にはゲスト OS のシステム時刻が遅れる場合があります。ゲスト OS のシステム時刻は遅れやすい傾向にあるため、ゲスト OS の起動中にはホスト OS のシステム時刻と時刻同期を行う動作が既定で有効になっています。

この設定は、Hyper-V の統合サービスの設定にある [時刻の同期] サービスとなります。[時刻の同期] は既定で有効です。

Hyper-V の統合サービスの「時刻の同期」にて、時刻同期が行われる動作は以下の通りです。

  • ゲスト OS の時刻がホストの時刻より5秒以上遅れている場合
    強制的に時刻同期を行います。

  • ゲスト OS の時刻がホストの時刻との時間差が5秒未満である場合
    ゲスト OS の W32Time サービスに時刻候補として、時刻サンプルを提供します。ゲスト OS にて時刻同期を行うかは、Select Best Sample の処理にて決まります。

  • ゲスト OS の時刻がホストの時刻より5秒以上進んでいる場合
    ホスト OS との時刻同期を行いません。

 
楽天ブックス
¥3,630 (2023/06/08 11:21時点 | 楽天市場調べ)
楽天ブックス
¥4,400 (2023/06/08 11:24時点 | 楽天市場調べ)