今回の記事では、「Windows Server 2016」及び「Windows Server 2019」でNTP(Network Time Protocol)を利用して、時刻同期を設定する方法を紹介します。
また、設定時に使用する「w32tm.exe」の簡単な解説と、そもそもサーバーにおいて時刻同期がなぜ重要なのかも併せて解説していきます。
Windows ServerでNTPクライアントを設定する手順
当項では、Windows Server 2016及びWindows Server 2019でNTPを利用して時刻同期を設定するやり方を紹介します。
尚、Windows Server 2012などそれ以前のサーバーでも、今回紹介する「w32tm.exe」が使用できることもあり、同じような手順で設定できるとは思いますが、追加で幾つか作業が必要かも知れません。
そこは未検証でありご了承ください。
また、手順の途中では、今回使用する「w32tm.exe」コマンドも簡単に解説します。
「Windows Time」サービスの起動状態の確認
WindowsでNTPを利用して時刻同期をする場合は、「Windows Time」サービスが起動している必要があります。
今回設定を行うWindows Serverのサービス一覧を表示して、「Windows Time」の「スタートアップの種類」が「自動起動」になっていること、「状態」が「実行中」になっていることを確認してください。
このWindows TimeはWindows Server 2016、及びWindows Server 2019の既定値として有効になっているはずですが、もし自動起動になっていない場合は、自動起動に変更してください。
※WindowsServer2012などの以前のWindowsServerの場合、既定では有効になっていない可能性もあるので、確実にご確認ください。
コマンドプロンプトを「管理者として実行」で起動
スタートメニュー内の「Windowsシステムツール」にある「コマンドプロンプト」を右クリックして、「管理者として実行」から起動してください。
通常権限のコマンドプロンプトでは、後述する「w32tm.exe」を操作できません。
この管理者として実行したコマンドプロンプトで以降は操作をしていきます。
現在の時刻同期設定をコマンドで確認
まずは、対象のサーバーの現在の時刻同期に関する設定状況を確認します。
確認するコマンドは以下です。
w32tm /query /status
又は、以下でも結構です。
w32tm /query /source
尚、時刻同期設定がされていない場合は以下のような応答が返ります。
C:\Users\Administrator>w32tm /query /status 閏インジケーター: 3 (最後の 1 分間は 61 秒) 階層: 0 (未指定) 精度: -6 (ティックごとに 15.625ms) ルート遅延: 0.0000000s ルート分散: 0.0000000s 参照 ID: 0x00000000 (未指定) 最終正常同期時刻: 未指定 ソース: Free-running System Clock ポーリング間隔: 6 (64s) C:\Users\Administrator>w32tm /query /source Free-running System Clock
/status の場合は詳細な情報を返し、/source は、指定されているNTPサーバーのホストを返します。
上記のコマンド実行結果のどちらにも、「Free-running System Clock」と記載されています。
これは時刻同期先のNTPサーバーが指定されていない状態を表します。
同期先NTPサーバーをコマンドで設定
同期先NTPサーバーをコマンドで指定します。
実際のコマンド例としては以下です。
w32tm /config /manualpeerlist:ntp.nict.jp,0x8 /syncfromflags:manual /update
ここで、コマンドの処理内容を解説していきます。
尚、詳細なコマンドの仕様については、以下のMicrosoftのリファレンスページに記載されています。
ただ、このページも内容を読み解くには大変なので、最低限必要な範囲に絞って説明していきます。
w32tm
コマンドの冒頭部分です。
このコマンドは、Windowsに元々入っている「w32tm.exe」という実行ファイルを呼び出しています。
/config
時刻同期関連の設定値を変更する場合に指定します。
/manualpeerlist:ntp.nict.jp,0x8
時刻の取得元NTPサーバーを指定します。
:(コロン)で区切り、その後ろにNTPサーバーのIPアドレスなどのホスト名を指定します。
今回のコマンド例であれば、「ntp.nict.jp」がホスト名です。
もし複数のNTPサーバーを指定したい場合は、以下のように ” (ダブルクォーテーション)でNTPホストを囲みます。
/manualpeerlist:"ntp1.nict.jp,0x8 ntp2.nict.jp,0x8"
また、ホスト名の後ろに ,(カンマ)を付けて区切り、そこに「0x8」を指定しています。
これは同期時のモードの指定箇所になり、通常は「0x8」で問題ありません。
/syncfromflags:manual
時刻の取得先NTPサーバーを個別に指定するか、AD環境でドメインコントローラーから取得するかを指定します。
:(コロン)で区切り、その後ろを「manual」をした場合は、個別に指定したNTPサーバーから時刻を取得します。
AD環境でドメインコントローラーから取得する場合は「domhier」を指定します。
/update
このコマンドで指定した時刻同期設定を即時反映させます。
コマンド実行例としては以下です。
C:\Users\Administrator>w32tm /config /manualpeerlist:ntp.nict.jp,0x8 /syncfromflags:manual /update コマンドは正しく完了しました。
国立研究開発法人情報通信研究機構の「日本標準時グループ」が運営しており、インターネットさえ繋がれば、誰でもそのNTPサーバーから時刻を取得することができます。
日本標準時グループでは、原子時計を運用し日本の標準時間を管理しています。
情報通信研究機構 日本標準時グループ
時刻同期処理の手動実行
上記コマンドで設定した時刻同期処理を手動で実行します。
コマンドは以下です。
w32tm /resync
コマンドの実行例は以下です。
C:\Users\Administrator>w32tm /resync 再同期コマンドをローカル コンピューターに送信しています コマンドは正しく完了しました。
後、念のため、冒頭で実施した時刻同期設定状態の確認コマンドを実行し、
w32tm /query /status
又は
w32tm /query /source
「Free-running System Clock」となっていた箇所が、「/manualpeerlist:」で指定したホスト名になっていれば設定は完了です。
【参考知識】「時刻同期」の重要性
今回の記事で扱った「時刻同期」処理ですが、経験の浅いITエンジニアの場合、とても重要と伝えてもなかなかピンとこない人も多いかと思います。
逆に経験豊富なITエンジニアであれば、その人の技術分野がインフラ系やアプリケーション開発系に関わらず「時刻同期」の重要性について理解しています。
また、理解が出来た過程として多いのは、過去に「時刻同期」が出来ていないことに起因した大小のトラブルやシステム障害を起こしているといったケースです。
現にこの記事を書いている私もそのような経験があります。
あらゆるシステムでは、「時刻」は非常に重要です。
Windowsであればタスクスケジューラー、Linuxであればcronを使い、定時実行されるバッチ処理やJP1などで行うジョブ管理。
様々なログデータやデータベース内のタイムスタンプ。
受発注システムにおける締め時間や勤怠管理システムにおける打刻時間など。
これらの処理では、関連する機器やデバイスの時刻が相互に同期をとり、同じ時刻を共有している前提で設計されています。
もし時刻が同期されておらず、特定の機器やデバイスの時刻がずれていた場合は致命的な障害に発展する可能性があります。
- 時刻のズレにより他サーバーと実行順が入れ替わり、前処理で作成したデータを上書きして更新してしまうバッチ処理。
- サーバー側の時刻が進んでいたことで本来締め時間に間に合うはずだった発注データが翌日受注扱うになる。
- サーバーの時刻が大きく進んでおり、それを安易に修正したことでその前後のデータのタイムスタンプが遡る
- 現在時刻より以前の更新日時を取得するような処理では、本来対象に含まれるべきデータが取得対象から漏れる
これらはほんの一例ですが、このように時刻が適切に同期されていないことに起因した障害は、非常にリカバリーが面倒だったり、その処理や業務において致命的になるケースが多いです。
この様な経験をすることで、ITエンジニアは「システム時刻」について、非常に敏感になります。
最後に
今回の記事では、Windows Server 2016 及び、Windows Server 2019における時刻同期設定のやり方の紹介や解説と、時刻同期の重要性について簡単に説明させていただきました。
様々なシステムにおいて「時刻」は処理における根幹の要素であり、非常に重要です。
これが適切に管理されていなければ、そのシステムを安定して稼働させることは困難です。
もし貴方が時刻同期に関する重要性をご存知なかったのであれば、今後はまずそのシステムやその処理の時刻はどこから取り(サーバーならAP側かDB側か?又はクライアント側かなど)、どれぐらい正確性が担保されているのかを必ず気にするようにしてください。
時刻を正確に管理出来れば技術者として一人前です。
今回も読んで頂きましてありがとうございました。
それでは皆さまごきげんよう!