Windowsの時刻同期でエラーになるのをなんとかしてみる

記事タイトルとURLをコピーする

Windows Serverの時刻同期、どうしていますか?

Windowsですので、GUIで気軽に設定できるのは魅力ですが、細かいところが設定できなかったり罠っぽいところがあります。
通常の使用では問題にならないかもしれませんが、時刻同期に比較的シビアさを要求されて、さてどうしようとなることがあります。
この課題を解決してみました。

いつもの時刻同期

まず、AWSのWindows Serverのタイムゾーンは世界標準時(UTC)になっています。
気に入らないとなれば、日本時間(JST)に変更します。
これを
Windows date update 01

こんな感じに。
Windows date update 02

続いて、下図のようにNTPサーバの指定を変えたりして時刻同期を取れるようにするわけですが、
Windows date update 03
こちらの時刻同期は1週間に一度の頻度で、しかもこれに失敗してもリトライしないようで、下手をするとどんどん時刻がずれていきます。
これを何とかするのが、今回のお題となります。

用意するもの

  • お近くのWindows Server 2008 R2
  • Windows ServerのAdministratorアカウント
  • Windows Serverが時刻同期したいNTPサーバに繋がること(セキュリティグループ等を適宜設定してください)
  • お時間30分ほど
※今回はドメインサービス(Active Directory)を考慮していません。

解決した方法

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による同期
/syncfromflags:MANUAL」は、指定した一覧から同期を取るという意味です。 「/update」はサービスに変更されたことを通知し、変更内容を有効にします。 次に、念のため、サービスを再起動します。
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」の値で決まります。
Windows date update 04
キーの場所「¥HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥services¥W32Time¥Config
MinPollInterval」が、2^10 = 1,024秒 ≒ 17分で、
MaxPollInterval」が、2^15 = 32,768秒 ≒ 546分 ≒ 9時間となり、この間で時刻の差異により同期が行われることを意味します。
少なくとも9時間以内に時刻同期が行われるので、時刻ずれは起きてもほとんどすぐ直ると考えて良いのではないでしょうか。 また、上記の設定を行った後は、GUIのプロパティ画面では設定を変更しないほうが良さそうです。

終わりに

検証で経過観察している部分がありますが、ひとまずこれで解決したようです。
ただの時刻同期と思っていましたが、思ったより深くて調べることが多かったです。
この記事が、何かのヒントになれば幸いです。