Windows

Windowsの時刻合わせの話

投稿日:

ネタ切れ気味。

WindowsPC使ってると、いつの間にか割とPCの時刻がズレてることがあるのは実体験として経験あると思います。
時間がズレると録画やらなんやらで影響出ますので、なるべく常に正確な時刻になるように設定しましょう。

ちょっとググると判りますが、Windowsのデフォルト設定には問題ありまくりです。

デフォルトはNTPという仕組みでtime.windows.comというNTPサーバの時刻を基準に一週間毎に時刻合わせするようになっています。
time.windows.comはMicrosoftが運営してるNTPサーバですが、デフォで運用されてる世界中のWindowsPCがアクセスするもんで割とエラーになることがあるようです。
そんでタスクスケジューラで一週間毎にWindows Time(W32Time)というサービスが起動され、時刻同期した後このサービスは自動終了。
このときもし時刻同期に失敗してもまた来週、でリトライもしないらしく。
そりゃあかんわー…

さっさと設定変更しちゃいましょう。

ではまずは代わりのNTPサーバを選定しましょう。
NTPでは一応ネットワーク上の遅延も考慮されていますが常に一定ではなく揺らぎなどもあるので、なるべく日本国内で公開されてるサーバが望ましいです。
こちらのWikiからお好みでチョイスしてください。

私はurlの判りやすさで独立行政法人情報通信研究機構 (NICT)にしましたが、ほとんどのISPからはネットワーク的に近くなるインターネットマルチフィード (MFEED)の方が精度高くなる可能性が高いようです。
また使っているISPがNTPサーバを公開していれば、そこを使うというのも手ですね。
ということで以下の記事はNICTの記述で進めます。

まず、お手軽に「今よりマシ」にする方法。
スタートメニュー」の「Windowsシステムツール」からコントロールパネルを開き、

時計と地域」をクリックして

日付と時刻の設定」ダイアログを開いて

インターネット時刻」タブの「設定の変更」ボタンを押して

インターネット時刻設定」ダイアログでntp.nict.jpを設定します。

ついでに「今すぐ更新」を押して「時計は正常に~同期しました」のメッセージが出れば時刻同期完了です。
OK」を押して閉じましょう。
おそらくこれだけでも結構違います。

なお最初に開いた時(二つ上の画像)の「インターネット時刻」タブで「設定されているスケジュールに従って云々」ってのが一週間毎のデフォルトスケジュールのことです。
手動で更新した後は「次回の同期:~」が表示されていることもありますが、これは全くアテにならず、OSの再起動などでまた元に戻ってしまいます(後述します)
一週間毎の更新ではイマイチ不安なので、以降はレジストリを弄ることになりますが、もっと短い周期で同期するようにします。

レジストリエディタの起動方法はスタートメニューの右クリックメニューで「ファイル名を指定して実行」をクリックし

名前欄に「regedit」+Enterで起動します。

ユーザーアカウント制御」ダイアログの「このアプリに変更を許可しますか?」は「はい」を選びます。
ここからは余計なところを書き換えると最悪Windowsが起動しなくなる可能性もありますので慎重に。

時刻同期の周期を設定する方法には2通りあり「一定周期」と「時間のズレによって調整する可変周期」が利用できます。
NTPサーバに負荷を掛けないためには後者の方が望ましく、プロトコル規格であるRFC1305やRFC5905でも後者が標準です。

まず一定周期で更新する間隔はレジストリエディタの左ツリーで
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient
まで辿っていき、右ペインに表示される「SpecialPollInterval」を変更します。

値が秒での周期なので、右クリックから「修正」、

DWORD(32ビット)値の編集」ダイアログで「値のデータ」に任意の数値を入れます。
表記」は「10進数」にした方が判りやすいでしょう。

参考までに10進数で「一日=86400秒」「6時間=21600秒」です。
幾らなんでもそんなに狂うもんでもありませんし、NTPサーバに負荷がかかるのであまり短くするのはよくありません。
一応NICTのF&Qでは「1時間平均で20回(1日の合計が480回)を超えないようにしてください。」とありますが、3分毎とか個人使用のPCではどう考えてもやり過ぎです。
6時間毎で十分、人によっては「一日一回以下にすべき」って意見もあるくらいです。

よりNTPサーバに優しく、プロトコル規格標準に則った可変周期にする場合は、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
の「NtpServer」を「ntp.nict.jp,0x8」とし、

さらに
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
の「MinPollInterval」で最小値、「MaxPollInterval」で最大値を「2を基底とした対数」「2のべき乗」で設定します。

要するに2を入れると2の2乗で「4秒」となります。
デフォルトは最小10、最大15なのでズレに応じて「約17分~9時間」に一度同期、ですね。

私は最初、最小10(デフォルト値)で「1024秒(約17分)」、最大値18で「262144秒(約3日)」に設定して「最長でもデフォルトよりエラーになりにくいNTPサーバに対してデフォルトの半分周期の同期だからこれでも十分」と、思ったのですが。
実際に設定してみると殆どずっと17分間隔で同期し続け、随分ほっといても変りません。
よっぽどPCの精度が低いのか、インターネット回線の遅延揺らぎが大きいんですかね…
個人PCでNTPサーバに負担掛けるのも申し訳ないので結局最小値を15(約9時間)にしました。
(上の画像は最初の設定のままですが)

さて、ここからが肝心です。
レジストリ弄るとこまではググると結構出てくるんですが、なぜかWindows Timeサービス関連をスルーしてる記述が多いんですよね。
レジストリを弄っただけではWindows Timeサービスの起動タイミングがタスクスケジューラ任せのため、再起動などしてサービスが起動していない状態になると結局一週間毎・一定周期に戻ってしまいます。

常時Windows Timeサービスを起動させておくためにはWindows起動時に開始するよう、スタートメニューの「Windows管理ツール」にある「サービス」を起動して

Windows Time」をダブルクリック、

プロパティ設定画面中ほどの「スタートアップの種類」をクリックしてリストから「自動(遅延開始)」を選んで「OK」又は「適用」ボタンで設定します。

なおWindows Timeサービスが起動していればタスクスケジューラの方は「既にサービス実行中」で無視されるだけなのでほっといても構いません。
意味のないタスクが起動するのは気持ち悪い、という場合は同じくスタートメニュー「Windows管理ツール」にあるタスクスケジューラを起動して、「タスクスケジューラライブラリ」→「Microsoft」→「Windows」→「Time Synchronization」の「SynchronizeTime」を無効か削除に。

さらにスタートメニューの「Windowsシステムツール」「コマンドプロンプト」を右クリックして管理者権限で起動し

下記コマンド実行

sc triggerinfo w32time delete

で削除できます。

以上で設定完了です。
PCを再起動してちゃんと自動起動しているかどうか確認しましょう。
もう一度「インターネット時刻」タブを開いて前回同期した時間(再起動した時間)と「次回の同期」に設定した期間後の時間が表示されていればOKです。

ここが「スケジュールに従って云々」になってる場合はWindows Timeサービスが起動できてない可能性があります。
念のためもう一度最初から確認しましょう。

以下余談。
わしゃぁもっとビターーっと時刻合わせしたいんじゃぁ!という方は…

RaspberryPi+GPS受信ユニットで衛星電波から時刻補正した自前NTPサーバを作っちゃう、というのも手です。
イントラ内PCだけならそれこそ1分毎に同期させても大した負荷じゃありませんし、GPS衛星電波が拾えればいいので窓際にでも置いとくだけです。
衛星内蔵の電子時計基準なので、固定偏差はあるもののそれさえ補正すれば精度もかなりのもんだとか。
家電コントローラ運用のRaspberryPi Zeroに機能追加するのも面白いかもしれません。

TS録画環境ならデジタル放送に含まれるTOT(Time Offset Table)という時刻情報で補正することもできます。
映像や音声のコンテンツと違って圧縮・展開による遅延はなく、誤差は±500ミリ秒以内とされています。
TVやチューナー自身はこれで時間合わせてるわけですね。
TVTestは管理者権限で起動してメニューから手動で時刻合わせを実行することができます。
EDCBはサービス起動していれば10秒のズレ検出で自動的に時刻を合わせます。
ただし、どちらもBonDriver経由なのでSpinelやBonDriverProxy(EX)を使用している場合(微々たるものと思いますが)誤差が大きくなる可能性があります。

なお時間を合わせる補正方法には即時正確な時刻に合わせる方法(Step)と、徐々に近づける方法(Slew)があるのですが、Windowsは大きくズレているときは前者、小さいズレは後者を使います。
どの程度のズレでどっちを使うか、徐々に合わせる場合どの程度ずつ合わせるか等はレジストリを弄ると制御できますが、とりあえずデフォルトで問題ないと思います。
やってみたい方はこの辺参照してください。

さらにオマケ。
判る人だけ内容をご確認の上で使ってください。


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers]
@="0"
"0"="ntp.nict.jp"
"1"="time.windows.com"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient]
"SpecialPollInterval"=dword:00021600

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers]
@="0"
"0"="ntp.nict.jp"
"1"="time.windows.com"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"NtpServer"="ntp.nict.jp,0x8"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"MinPollInterval"=dword:0000000f
"MaxPollInterval"=dword:00000012

-Windows
-, ,

Copyright© 復活の「愛馬の上で直立不動」 , 2021 All Rights Reserved Powered by STINGER.