前回記事「Windows で時刻あわせ (4) w32tm (通信の確認)」はこちら。
【注意と免責】
以下の内容は個人的な見解であり正しさを保証しません。正しさを必要とする場合は他のサイトの記事を参照してください。
w32tm は設定および時刻同期に失敗しやすいです。また失敗の原因が見えにくいこともリカバリーを難しくします。たとえば時刻 Client の設定をしていて時刻同期に失敗するとき、その原因が Client の設定ではなく Server 側の設定や挙動にある場合があります。
ここでは代表的なトラブルを上げてみます。
- サーバーとクライアントの時刻の差が大きい
境界値は知りませんが、例えば時刻が日単位で異なると時刻は同期しません。
- サーバーとクライアントの時刻の差が小さい
実は正しく同期できているのですが、観測者の視点から時刻サーバーとの時刻差が見えるために時刻同期されていないと誤認されることがあります。
デフォルトでは時刻差が 5 分以内の時に起こります。
この辺りの詳しい動作は「step 調整」と「slew 調整」という語を検索してみて下さい。
(slew 調整の意味が分からない場合は、w32tm を使用せず素直に桜時計を使いましょう。) - w32tm /resync コマンを実行したが同期しない(時刻サーバーとの間に時間差がある)
resync コマンドによって時刻を即同期するとは限りません。resync コマンドの help を見たらわかりますが、「今すぐ時刻の同期をとり直すようにコンピューターに指示します」と書かれています。つまり Windows time サービスに時刻の同期をとり直す "指示" を出すだけです。
windows time サービスは指示された結果、「今は時刻合わせしなくていい」とか「サーバーから取得した時刻は信頼できないからダメだ」などの判断をする可能性があり、その結果時刻同期しない可能性があります。
そもそも resync コマンドは「その場で step 調整するコマンド」ではありません。その点を勘違いしないようにしましょう。 - 通信できる状態であるはずなのに時刻設定しない
時刻サーバーと通信できていない(例えばファイアウォールに阻まれている)のは論外として、時刻サーバーと通信できているはずなのに時刻を同期しない場合があります。
考えられることとして、クライアントモードでアクセスしていない(対称モードでアクセスしている)可能性があります。
クライアントモードでアクセスするためには、ntp サーバーの指定の際に末尾に ",0x8" または ",0x9" を付加して指定します。付加しない場合、対称モードでのアクセスになります。(Win7 まで。Win2008R2,Win8 以降は無指定の場合クライアントモードになるようです。)
なぜ対称モードではだめなのか?についてはそういうものだと思ってください(汗 - 時刻を取得したが、時刻設定しない
参照先の時刻サーバーから時刻を取得しているはずなのに同期しないことがあります。
このような場合は、サーバーから取得した時刻が信頼できないものであった可能性があります。
たとえば以下のような要因があります。- Stratum(階層)の値がおかしい。
Stratum の値が 0 の場合、参照した時刻サーバーがさらに上位の時刻サーバーとの時刻同期に失敗しています。
また、Stratum の値が 15 の場合は、その時刻サーバーとの同期はできません。 - leap indicator(閏インジケーター)が 3(時刻同期していない)になっている。
参照した時刻サーバーがさらに上位の時刻サーバーとの時刻同期に失敗しています。
- Disparsion(ルート分散)の値が大きい。
時刻のゆらぎが大きいと時刻が信頼できないと判断されることがあります。
特に Windows の場合、同期する時刻サーバーがない場合、Disparsion の値は 10 秒で、この値だとクライアント側の w32tm は時刻が信頼できないと判断するようです。(多分。本当にそうであるかの検証は私はしていません。)
上記の状態は、参照先の時刻サーバーが windows である場合、その参照先の時刻サーバー側で w32tm /query /status コマンド (Windows Vista, Windows Server 2008 以降) による確認することができます。
たとえば以下の表示のようになっている時刻サーバーと同期しようとしても同期しません。なぜなら時刻サーバーが同期していないため時刻サーバーの時刻が信用できないからです。時刻サーバーとさらに上位の時刻サーバー間の通信が切断されていないかなどを確認してください。
C>w32tm /query /status 閏インジケーター: 3 (最後の 1 分間は 61 秒) 階層: 0 (未指定) 精度: -6 (ティックごとに 15.625ms) ルート遅延: 0.0000000s ルート分散: 10.0000000s 参照 ID: 0x00000000 (未指定) 最終正常同期時刻: 20xx/xx/xx xx:xx:xx ソース: Free-running System Clock ポーリング間隔: 10 (1024s)
マーカー部分は表現は違えど皆「時刻は同期していません(=時刻に信頼性がありません)」と言っています。
- Stratum(階層)の値がおかしい。
- 時刻を取得しようとしない(通信しない)
通信間隔が短い可能性があります。しばらく時間を置くか、通信先時刻サーバー(ピア)を変更してリトライするなどしてみてください。
- w32tm /resync を行って「コマンドは正しく完了しました。」と表示されるが時刻同期しない。
「コマンドは正しく完了しました。」と表示されても、w32tm /query /status コマンドで階層(Stratum)が 0 になっているようだと時刻同期に失敗しています。前述のトラブル事例に該当するものがあるかどうかを確認してください。
時刻同期に失敗しているのになぜ「コマンドは正しく完了しました。」と表示されるかというと、文字どおり「コマンドは正しく完了し」たからです。どこにも「時刻同期に成功しました」と書かれていない点に注意しましょう。
時刻同期に成功したかどうかは w32tm /resync コマンドの表示ではなく、w32tm /query /status コマンドでソース(現在の時刻参照先サーバー)と階層(stratum)が正しい表示となっているかどうかで確認します。正しい表示とは、ソースが参照先の時刻サーバーになっていること、階層(Stratum)が参照先の時刻サーバーの値 + 1 となっていることです。
ooltcloud
次の記事> Windows で時刻あわせ (6) w32tm (スタンドアロン時刻サーバー)
http://ooltcloud.sakura.ne.jp/blog/202007/article_25110912.html
Link | 2020年7月25日 11:47