備忘録的な

業務用

時刻同期

----------------------
うるう秒について
----------------------
2015 年 7月 1日 にうるう秒の挿入が行われます。
当然、ネットワークにおける標準的な時刻同期サービスである、NTP サービスによる時刻同期でもうるう秒の挿入が生じます。

日本時間は世界標準時と 9 時間の時刻差があるため、2015 年 7月 1日 9:00 のタイミングで 1 秒追加されます。
即ち、2015/07/01 08:59:60 といった形が生じます。
また、機器によっては 08:59:59 が二回発生する物もあるようです。

---------------------------------------------
Windows OS におけるうるう秒の影響
---------------------------------------------
結論から言うと、Windows Time サービスはうるう秒を意識した動作を行いません。

上位 NTP サービスにうるう秒が挿入されると Windows OS はうるう秒を採用しないため、実時刻より 1 秒進むことになります。
この時間の差は、次回時刻同期により解消されるため、特に対処の必要はありません。

うるう秒実施予告情報として NTP パケットの中の LI ビット(Leap Indicator) が 24 時間前より 01 となり、上位 NTP サーバーより送信されて来ますが、Windows Time サービスはこの値を採用しません。
ただし、Windows Time サービスが 中間の NTP サーバーとして機能している場合、Windows NTP サーバーは NTP クライアントに同じ値を送信するため、注意が必要です。
例えば、Windows NTP サーバーと時刻同期をする NTP クライアントが Windows であれば、影響は受けませんが、Linux 等の Windows 以外では影響を受け、Windows より 1 秒遅れる形になると考えられます。

上記のように、Windows は OS としては影響は受けませんが、次回の時刻同期時に時刻戻りが発生するため、時刻戻りにより問題が生じるアプリケーションを運用している場合は注意が必要です。

なお、急激な時刻戻りへの対処として、Slew モードによる緩やかな時刻同期方法が挙げられます。
時刻の補正は以下の 2 つの補正方法があります。

・徐々に時刻を合わせる Slew モード
・即座に時刻を合わせる Step モード

Windows では Slew/Step のモードの切り替えを明示的に行うことはできません。
レジストリ値から計算されるしきい値によって決定されます。
このしきい値の計算方法や設定についてはまたの機会に。

<参考情報>
うるう秒の対応
http://jjy.nict.go.jp/news/leaps.html

うるう秒実施日一覧
http://jjy.nict.go.jp/QandA/data/leapsec.html

うるう秒に関するサポートについて
http://support.microsoft.com/ja-jp/kb/2722715/ja

うるう秒に関する Windows タイム サービスの処理
http://support.microsoft.com/ja-jp/kb/909614/ja

 

 

Windows 時刻同期は、Windows XP(Windows Server 2003) 以降のバージョンから、Windows Time(W32Time)サービスとして NTP が実装されて提供されています。
Windows Time サービスによる NTP プロトコルの時刻同期には、送信元ポート番号、宛先ポート番号の双方とも、UDP 123 番ポートを使用します。

時刻同期設定は、レジストリの設定値により、その動作が決定します。
設定変更後、Windows Time サービスの再起動を行うことで設定が取り込まれます。

==================================================
Windows Time(W32Time)サービス クライアント設定
==================================================
1. 画面右下タスクバーに表示されている時刻を右クリック - [日付と時刻の調整] をクリック

2. [インターネット時刻] タブ - [設定の変更]

3. "インターネット時刻サーバーと同期する" にチェックが入っていること
"サーバー"に "time.windows.com" が表示されていますが、これがデフォルトの時刻同期先です。
同期先設定は、レジストリに格納されていますが、レジストリの設定を直接変更し、同期先が変わっても、画面上の設定値はデフォルトのままですので注意が必要です。
また、複数の同期先を設定できますが、GUI からは 1つしか設定できません。
同期を行ったメッセージも GUI に出力しますが、本当に正常に動作しているかはあまりあてにならないため、実際、業務として設定を行う場合には GUI からの設定はお勧めしません。

なお、[インターネット時刻] タブはドメインに参加すると表示されなくなりますので、会社等でドメイン参加している PC では表示されていないため見たことがないという人も多いかと思われます。

同期先はレジストリに格納されますが、コマンドで同期先設定が可能です。
ただし、コマンドでは同期間隔等こまかなメンテナンスはできませんので、直接レジストリを変更する必要があります。
では、実際基盤構築 SE はどこの設定をいじって設定しているのか?
下記に大まかな項目をご紹介しますのでご参考あれ。

-------------------------------
レジストリエディタの起動
-------------------------------
[スタート] - [検索の開始(Vista)]や [プログラムとファイルの検索(Win7)] に regedit と入力し、レジストリエディタを起動します。

-------------
● 同期設定
-------------
以下のレジストリキーを展開し、Enabled = 1 の場合、NTP クライアントとして時刻同期を行います。
0 の場合は同期を行いません。デフォルト値は 1 ですので、通常ここはいじりません。
-------------------------------------------------------------------------------------
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient
名前 : Enabled
種類 : REG_DWORD
データ : 1 (10進数)
-------------------------------------------------------------------------------------

-----------------------
● 同期先設定 その 1
-----------------------
外部 NTP サーバを指定する場合、下記レジストリ値に設定します。
デフォルトでは、"time.windows.com,0x9" (Windows XPでは0x1)が設定されています。
-----------------------------------------------------------------------
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
名前:NtpServer
種類:REG_SZ
データ:同期先IP,0x8
-----------------------------------------------------------------------
複数の同期先を指定する場合、スペースを空けます。
"同期先IP1 同期先IP2"
名前解決ができる環境であれば同期先サーバ名の指定でも構いません。
同期先の後ろに ,0x8 を付加すると Client モードで動作します。
同期先 NTP サーバが Windows 以外の場合はこのフラグを付加します。

フラグには、以下があります。
実際には 0x0 や 0x4 は設定することはないと思います。
--------------------------------
0x0
Symmetric Active/Passive Mode:NTPによる標準的な時刻同期
(ただし、相手のNTPサーバが対応している必要あり)

0x1
Special Interval : 固定のポーリング間隔での同期を行う場合
SpecialPollInterval レジストリ値を同期間隔として使用して時刻同期を行います。
設定されていない場合は、MaxPollInterval と MinPollInterval レジストリ値を同期間隔として使用して時刻同期を行います。

0x2
Use As Fallback Only : フォールバックを行う場合に設定します。
この値が付加された方がセカンダリ的な扱いとなります。
優先的に同期を行うよう設定されている NTP サーバーが使用不可の場合に同期を取るサーバーとして設定されます。

0x4
Symmetric Active : 明示的なSymmetric Active/Passive Modeによる同期
お互いが同期を取る時刻同期方法となります。

0x8
ClientモードでのNTP要求 : 明示的なClient/Server Modeによる同期
一般的に同期先が Windows 以外の場合設定します。
--------------------------------

固定ポーリングかつ Client モードの場合は 0x9 が利用できます。
0x1 + 0x8 = 0x9
0x2 + 0x8 = 0xa も利用可能です。

<参考情報>
Windows Server 2003Windows 以外の NTP サーバーとの同期が成功しない
http://support.microsoft.com/en-us/kb/875424/ja

-----------------------
● 同期先設定 その 2
-----------------------
下記 Type レジストリ値が NT5DS の場合、
ドメイン階層に従って、ドメインコントローラと同期を行いますので、上記 NtpServer で設定されている値は採用されません。
-----------------------------------------------------------------------
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
名前: Type
種類: REG_SZ
データ: NTP
------------------------------------------
Typeには下記が設定可能です。
-----------------------------
NoSync : 同期を行わない(/syncfromflags:no)
NTP : NtpServerレジストリ値で指定したサーバから同期を行う(/syncfromflags:manual)
NT5DS : ドメイン階層により決定されたサーバから同期を行う(/syncfromflags:domhier)
AllSync : ドメイン階層と外部NTPサーバの両方から同期を行う(/syncfromflags:all)
-----------------------------
コマンドでも設定可能です。
例えば下記コマンドを投入すると、上記に紹介しているレジストリのデータに値が入ります。
w32tm /config /manualpeerlist:同期先IPアドレス,0x8 /syncfromflags:MANUAL


------------------
● 固定同期間隔
------------------
上記 NtpServer レジストリ値のフラグ設定に ,0x1 または ,0x9 が設定されている場合、下記レジストリ値で設定された間隔でポーリングを行います。
--------------------------------------------------------------------------------------
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient
名前: SpecialPollInterval
種類: REG_DWORD
データ: 600 (10進数:秒)
--------------------------------------------------------------------------------------
この例では 10 分間隔で同期を行う設定です。
ワークグループ環境のデフォルト値は 604800 即ち 7 日に 1 回の同期間隔です。

------------------
● 可変同期間隔
------------------
上記 NtpServer レジストリ値のフラグ設定が 0x1 または 0x9 以外のフラグの場合、下記で設定された間隔のどこかで可変ポーリングを行います。
なお、NT5DS 等ドメイン階層に従った同期の場合は常に可変同期となります。
--------------------------------------------------------------------
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
名前: MaxPollInterval
種類: REG_DWORD
データ: 15 (10進数)
-----
名前: MinPollInterval
種類: REG_DWORD
データ: 10 (10進数)
--------------------------------------------------------------------
MinPollInterval と MaxPollInterval の設定値は 2 の n 乗秒を指定しています。
MinPollInterval = 10 は 2 の 10 乗 = 1024 秒
MaxPollInterval = 15 は 2 の 15 乗 = 32768 秒
即ち、約 17 分 ~ 9 時間のどこかで同期を行います。
値をそろえることも可能です。(柔軟性には欠けますが、固定のポーリング間隔となる)


<参考情報>
Windows Time サービスにおける時刻同期の仕組み
http://support.microsoft.com/ja-jp/kb/2722681

[インターネット時刻] のタブで時刻同期の設定を行うと、SpecialPollInterval を使用する設定に変更される
https://support.microsoft.com/en-us/kb/2842683/ja

W32tm
https://technet.microsoft.com/ja-jp/library/w32tm(v=ws.10).aspx

Windows 7 および Windows Server 2008 R2スタンドアロン環境で Windows Time サービスが自動的に起動しない
https://support.microsoft.com/en-us/kb/2385818/ja

ワークグループ環境においてWindows Timeサービスが自動で起動する。
https://support.microsoft.com/en-us/kb/3014698/ja