2020年9月5日土曜日

Windows Timeサービスの時刻同期を正しく設定する手順【Windows 10・Windows Server 2016以降対応】

数年前の記事となるが、Windows Server 2008 R2環境における時刻同期方法について記事にした。

あれからWindows Serverも2012、2012 R2、2016、2019とバージョンアップを重ねてきているので、再度Windows 10及びWindows Server 2016における正しい時刻同期の設定方法を調べてみた。

以前の手順では、トリガーサービスの停止や「SpecialPollInterval」のレジストリ値の変更などが必要となっており煩雑となっていた。今回いろいろ調べてみたところ、Windows Server 2016以降ではw32tmのコマンドで設定するだけでよく、前回に比べてシンプルな手順となった。

Windowsの時刻設定

1. Windows Timeサービスが起動していることを確認

まずは、時刻同期をするための前提条件となるWindows Timeサービスの起動設定と状態を確認する。

私の環境で確認したところ、Windows 10では「スタートアップの種類」が「手動」になっておりサービスが起動していなかった。逆に、Windows Server 2016以降では、「自動起動」となっておりサービスも起動しており対処は不要だった。

サービスが起動していない場合は、以下コマンドにて「スタートアップの種類」を「自動起動」への変更と、サービスの起動を行う。

PS C:\> Set-Service -Name W32Time -StartupType Automatic
PS C:\> Start-Service -Name W32Time

Windows Timeサービスの起動状態を確認するには、PowerShellで以下コマンドを実行する。以下状態となっていれば問題なくWindows Timeサービスが起動している。

  • Status : Running
  • StartType : Automatic
PS C:\> Get-Service -Name W32Time | select Name, DisplayName, Status, StartType

Name    DisplayName   Status StartType
----    -----------   ------ ---------
W32Time Windows Time Running Automatic

2. 時刻同期先を「0x8」のフラグを付けて指定する

PowerShell (またはコマンドプロンプト) を管理者として開き、以下のようにコマンドを実行する。コマンドのオプションの意味は以下の通り。

オプション 説明
/config 設定を変更する際に指定。
/update 設定変更を即時に反映。
/manualpeerlist:"<同期先NTPサーバ>,<フラグ>" 同期先のNTPサーバを指定する (フラグについては後述する)。ダブルクォート ("") で囲まないとうまく設定が反映されないので注意。複数の同期先を指定する場合は、空白区切りにて記載する。
/syncfromflags:<同期方式> 手動で同期先を指定する場合は、「MANUAL」を指定する。なお、ドメイン環境においてドメインコントローラと同期する場合は「DOMHIER」を指定する。

以下コマンド実行例となる。「コマンドは正しく完了しました。」と表示されればOK。

PS C:\> w32tm /config /update /manualpeerlist:"ntp.nict.jp,0x8 ntp.jst.mfeed.ad.jp,0x8" /syncfromflags:MANUAL
コマンドは正しく完了しました。

フラグは以下の設定を選択することができる。

設定値 説明
0x1 「SpecialPollInterval」のレジストリ値で設定した秒数にて、一定間隔で同期する方式。
0x8 NTPクライアントモードで同期。RFC1305に準拠した同期。最初の同期は短いタイミングで同期を行い、以降は徐々に同期間隔を長くするという方式。同期間隔は「MinPollInterval」と「MaxPollInterval」のレジストリ値にて設定される。
0x9 NTPクライアントモードで同期。0x1と同様に一定間隔で同期。

Windows Server 2008時代は0x9のフラグを設定することが多かったが、現在は0x8で設定するのが推奨となる。
※理由は後述する「【補足】Windows Timeサービスのフラグに0x9を指定してはいけない理由」を参照いただきたい。

3. 設定確認

問題なく同期されているかはw32tm /query /statusコマンドで確認する。最終正常同期時刻が更新されていれば、問題なく時刻同期されている。

PS C:\> w32tm /query /status
閏インジケーター: 0 (警告なし)
階層: 3 (二次参照 - (S)NTP で同期)
精度: -6 (ティックごとに 15.625ms)
ルート遅延: 0.0044629s
ルート分散: 8.2163946s
参照 ID: 0xC0A82117 (ソース IP:  192.168.33.23)
最終正常同期時刻: 2020/08/19 10:43:57 ←★
ソース: 192.168.33.23,0x8
ポーリング間隔: 7 (128s)

【補足】Windows Timeサービスのフラグに0x9を指定してはいけない理由

Windows Timeサービスでは「LargePhaseOffset」というレジストリ値の設定があり、この値で設定した時間よりも時刻のずれが生じた場合、「Spike」というステータスに遷移し時刻同期が停止する。「LargePhaseOffset」はデフォルトで 50000000 (単位は100ナノ秒なので5秒) で設定されている。
※本題ではないが「LargePhaseOffset」の単位が「ミリ秒」という情報もあるが、実機で確認した限りでは「100ナノ秒」が単位としては正しいようだ。

通常は「Spike」の後「Unset」と呼ばれるSTEPモードで時刻同期を行うステータスに遷移するが、フラグに0x9が指定されている場合 (SpecialPollIntervalで設定された一定の間隔による時刻同期が実行されている場合) は「Unset」に遷移せず、二度と時刻同期に成功しなくなるという問題が存在する。詳細は以下のMicrosoftのKBに記載がある。

なお、Windows TimeサービスのSpikeへ遷移する動作については、以下のMicrosoftのブログの記事にて非常に詳細に説明されている。

この問題はフラグに0x8を設定した場合は発生しないため、時刻同期のフラグは0x9ではなく0x8で設定することが推奨となる。

参考

2 件のコメント:

  1. updateコマンドは完了するのに確認コマンドではLocal CMOSのまま・・・

    返信削除
    返信
    1. Control Panel の日付と時刻の変更のインターネット時刻、今すぐ同期ボタンをクリックして半日置くと同期されます。

      削除

人気の投稿