Windows Serverの時刻同期、どうしていますか?
Windowsですので、GUIで気軽に設定できるのは魅力ですが、細かいところが設定できなかったり罠っぽいところがあります。通常の使用では問題にならないかもしれませんが、時刻同期に比較的シビアさを要求されて、さてどうしようとなることがあります。
この課題を解決してみました。
いつもの時刻同期
まず、AWSのWindows Serverのタイムゾーンは世界標準時(UTC)になっています。気に入らないとなれば、日本時間(JST)に変更します。
これを
こんな感じに。
続いて、下図のようにNTPサーバの指定を変えたりして時刻同期を取れるようにするわけですが、
こちらの時刻同期は1週間に一度の頻度で、しかもこれに失敗してもリトライしないようで、下手をするとどんどん時刻がずれていきます。
これを何とかするのが、今回のお題となります。
用意するもの
- お近くのWindows Server 2008 R2
- Windows ServerのAdministratorアカウント
- Windows Serverが時刻同期したいNTPサーバに繋がること(セキュリティグループ等を適宜設定してください)
- お時間30分ほど
解決した方法
Windows Timeサービスの設定や時刻同期の状態を確認したり、設定変更や手動同期を行ったりする、大変便利なコマンドであるw32tmコマンドを使います。「GUIでできなければCUIでやればいいじゃない」 次のように実行します。
C:UsersAdministrator>w32tm /config /manualpeerlist:"ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp",0x8 /syncfromflags:MANUAL /update コマンドは正しく完了しました。「w32tm /config」が設定するという意味です。 「/manualpeerlist:"〜",0x8」は、同期するNTPサーバの指定です。
空白で区切り「"〜"」で囲んで複数のNTPサーバを指定できます。
今回はインターネットマルチフィード 時刻情報提供サービス for Publicのサーバを指定しています。
「0x8」は下記の意味です。
値 | 方式 | 説明 |
---|---|---|
0x0 | Symmetric Active/Passive Mode | NTPによる標準的な時刻同期 (ただし、相手のNTPサーバが対応している必要あり) |
0x1 | Special Interval | Windows上のみ実装された定間隔での同期 |
0x2 | Use As Fallback Only | ドメインおよび外部の両方から時刻を同期 |
0x4 | Symmetric Active | 明示的なSymmetric Active/Passive Modeによる同期 |
0x8 | ClientモードでのNTP要求 | 明示的なClient/Server Modeによる同期 |
C:UsersAdministrator>net stop w32time Windows Time サービスを停止中です. Windows Time サービスは正常に停止されました。 C:UsersAdministrator>net start w32time Windows Time サービスを開始します. Windows Time サービスは正常に開始されました。どんな設定になったか、これでもかと確認してみます。
C:UsersAdministrator>w32tm /resync 再同期コマンドをローカル コンピューターに送信しています コマンドは正しく完了しました。 C:UsersAdministrator>w32tm /query /status 閏インジケーター: 0 (警告なし) 階層: 3 (二次参照 - (S)NTP で同期) 精度: -6 (ティックごとに 15.625ms) ルート遅延: 0.0571289s ルート分散: 7.7839467s 参照 ID: 0xD2ADA039 (ソース IP: 210.173.160.57) 最終正常同期時刻: 2013/05/27 18:48:18 ソース: ntp2.jst.mfeed.ad.jp ポーリング間隔: 10 (1024s) C:UsersAdministrator>w32tm /query /status /verbose 閏インジケーター: 0 (警告なし) 階層: 3 (二次参照 - (S)NTP で同期) 精度: -6 (ティックごとに 15.625ms) ルート遅延: 0.0571289s ルート分散: 7.7839467s 参照 ID: 0xD2ADA039 (ソース IP: 210.173.160.57) 最終正常同期時刻: 2013/05/27 18:48:18 ソース: ntp2.jst.mfeed.ad.jp ポーリング間隔: 10 (1024s) フェーズ オフセット: 1.6056238s クロック レート: 0.0156001s State Machine: 1 (保留) タイム ソース フラグ: 0 (なし) サーバーのロール: 0 (なし) 最終同期エラー: 0 (コマンドは正しく完了しました。) 最終正常同期時刻からの時間: 61.7314020s C:UsersAdministrator>w32tm /query /configuration /verbose [構成] EventLogFlags: 2 (ローカル) AnnounceFlags: 10 (ローカル) TimeJumpAuditOffset: 28800 (ローカル) MinPollInterval: 10 (ローカル) MaxPollInterval: 15 (ローカル) MaxNegPhaseCorrection: 54000 (ローカル) MaxPosPhaseCorrection: 54000 (ローカル) MaxAllowedPhaseOffset: 1 (ローカル) FrequencyCorrectRate: 4 (ローカル) PollAdjustFactor: 5 (ローカル) LargePhaseOffset: 50000000 (ローカル) SpikeWatchPeriod: 900 (ローカル) LocalClockDispersion: 10 (ローカル) HoldPeriod: 5 (ローカル) PhaseCorrectRate: 1 (ローカル) UpdateInterval: 360000 (ローカル) FileLogName: (未定義または未使用) FileLogEntries: (未定義または未使用) FileLogSize: 0 (未定義または未使用) FileLogFlags: 0 (未定義または未使用) [タイム プロバイダー] NtpClient (ローカル) DllName: C:Windowssystem32w32time.DLL (ローカル) Enabled: 1 (ローカル) InputProvider: 1 (ローカル) CrossSiteSyncFlags: 0 (未定義または未使用) AllowNonstandardModeCombinations: 1 (ローカル) ResolvePeerBackoffMinutes: 15 (ローカル) ResolvePeerBackoffMaxTimes: 7 (ローカル) CompatibilityFlags: 2147483648 (ローカル) EventLogFlags: 1 (ローカル) LargeSampleSkew: 3 (ローカル) SpecialPollInterval: 604800 (ローカル) Type: NTP (ローカル) NtpServer: ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp,0x8 (ローカル) VMICTimeProvider (ローカル) DllName: C:WindowsSystem32vmictimeprovider.dll (ローカル) Enabled: 1 (ローカル) InputProvider: 1 (ローカル) NtpServer (ローカル) DllName: C:Windowssystem32w32time.DLL (ローカル) Enabled: 0 (ローカル) InputProvider: 0 (ローカル) C:UsersAdministrator>w32tm /query /peers ピア数: 3 ピア: ntp1.jst.mfeed.ad.jp 状態: アクティブ 残り時間: 867.2527975s モード: 3 (クライアント) 階層: 2 (二次参照 - (S)NTP で同期) ピアポーリング間隔: 10 (1024s) ホストポーリング間隔: 10 (1024s) ピア: ntp2.jst.mfeed.ad.jp 状態: アクティブ 残り時間: 867.2527975s モード: 3 (クライアント) 階層: 2 (二次参照 - (S)NTP で同期) ピアポーリング間隔: 10 (1024s) ホストポーリング間隔: 10 (1024s) ピア: ntp3.jst.mfeed.ad.jp,0x8 状態: アクティブ 残り時間: 867.2527975s モード: 3 (クライアント) 階層: 2 (二次参照 - (S)NTP で同期) ピアポーリング間隔: 10 (1024s) ホストポーリング間隔: 10 (1024s)「w32tm」とだけ実行すればヘルプが出ますので、そちらをご覧ください。 最後の「w32tm /query /peers」の実行結果からNTPサーバが3つ指定されていることが分かります。
同結果からポーリング間隔が1,024秒と分かりました。
ポーリング間隔は、下図レジストリの「MaxPollInterval」「MinPollInterval」の値で決まります。
キーの場所「¥HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥services¥W32Time¥Config」
「MinPollInterval」が、2^10 = 1,024秒 ≒ 17分で、
「MaxPollInterval」が、2^15 = 32,768秒 ≒ 546分 ≒ 9時間となり、この間で時刻の差異により同期が行われることを意味します。
少なくとも9時間以内に時刻同期が行われるので、時刻ずれは起きてもほとんどすぐ直ると考えて良いのではないでしょうか。 また、上記の設定を行った後は、GUIのプロパティ画面では設定を変更しないほうが良さそうです。
終わりに
検証で経過観察している部分がありますが、ひとまずこれで解決したようです。ただの時刻同期と思っていましたが、思ったより深くて調べることが多かったです。
この記事が、何かのヒントになれば幸いです。