アナログ
RSS  

W32Timeで時刻合わせ2008/12/16 23:45

昨日はXP Home Editionのあまりのモッサリぶりに投げ出してしまったのですが、よく考えればサーバとして使いたい訳で、XPと2kどちらがサーバとして勝手がいいか確認のため、XPで復旧を続けることにしました。

LOOX S80Cがやっていた一番大事な仕事はNTPサーバです。Windows 2000のwindows time サービスはSNTPだったので、代わりにAdjustPCを使ってました。

でも、XPのwindows time サービスはNTPでサーバとして動作しますので、これを使ってみたいと前々から思ってました。(本当はルータのRT58iがNTPをやってくれたらいいのですが、1時間で約1秒も狂うので仕方なくS80Cにやらせてます。ちなみにうちのS80Cは80分で100ms程度遅れます)

と言うわけで、今日はW32Timeメモです。

先ずはWindows FWの穴あけ。例外のポートの追加で、UDP、Port123をNTPとして許可する。(これを忘れてて、繋がらないと小一時間途方にくれたorz)

次にregeditで
HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time¥Config
AnnounceFlags:10→5
LocalClockDispersion:10→0
UpdateInterval:<SpecialPollIntervalと同じ更新間隔(秒)>
MinPollInterval:<最小同期間隔(2n秒)>
MaxPollInterval:<最大同期間隔(2n秒)>

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time¥Parameters
NtpServer:<NTPサーバーのアドレス>,0x8

HKEY_LOCAL_MACHINE\SYSTEM¥CurrentControlSet¥Services¥W32Time¥TimeProviders¥NtpClient
SpecialPollInterval:<更新間隔(秒)>

HKEY_LOCAL_MACHINE\SYSTEM¥CurrentControlSet¥Services¥W32Time¥TimeProviders¥NtpServer
Enabled:0→1(NTPサーバを有効にする)
<NTPサーバーのアドレス>はプロバイダが提供しているアドレスかntp.jst.mfeed.ad.jpを使えばいい。
<更新間隔(秒)>は1380秒(23分)としました。(NtpServerを0x8に設定してるので再々追記の通り参照先が違いました)

このあとコマンドプロンプトで
net stop w32time
net start w32time
w32tm /resync

で使えるようになります。
実際に同期できているかは
w32tm /monitor /computers:NTPサーバのアドレス
例えば、セットしたのがアサヒネットのNTPなら
w32tm /monitor /computers:ntp.asahi-net.or.jp
でNTPとの時刻の誤差が分かります。

他のPCやルータの時刻合わせは、S80CのIPアドレス(または、コンピュータ名)をNTP(SNTP)クライアントに指定するとS80Cの時刻と同期します。

注意:「日付と時刻のプロパティ」の「インターネット時刻」をさわると、せっかくの設定がおかしくなるらしい。


<追記>
レジストリの部分は、次をメモ帳にコピペして「w32time.reg」など~.regという名前で保存したら、右クリックの「結合」でセットできます。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time¥Config]
"LocalClockDispersion"=dword:00000000
"AnnounceFlags"=dword:00000005
"UpdateInterval"=dword:000006cc
"MinPollInterval"=dword:0000000a
"MaxPollInterval"=dword:0000000c

[HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time¥Parameters]
"NtpServer"="ntp.jst.mfeed.ad.jp,0x8"

[HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time¥TimeProviders¥NtpClient]
"SpecialPollInterval"=dword:000006cc

[HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥W32Time¥TimeProviders¥NtpServer]
"Enabled"=dword:00000001

"NtpServer"="ntp.jst.mfeed.ad.jp,0x8"

の部分はあらかじめ自分のプロバイダのNTPに変更しておくのがいいです。アサヒネットなら

"NtpServer"="ntp.asahi-net.or.jp,0x8"

となります。
また更新間隔は29分(6cc)にしています。(NtpServerを0x8に設定してるので再々追記の通り参照先が違いました)23分とか31分とか素数がいいかなと何となく思います。(このパソコンと同期するクライアントの更新間隔も素数にしておけば、サーバの更新とかち合わなくていいかなという意味で)
</追記>
(再追記:UpdateIntervalにSpecialPollIntervalと同じ値をセットした方が無難らしい)
再々追記:W32Time\Parameters\NtpServerに0x1以外が設定されているときは2のW32Time\Config\MinPollInterval乗からMaxPollInterval乗の間で同期されるとのこと)
Windows OSにおける時刻同期サービスとNTP - @IT
通常は最小同期間隔から同期の状態を確認しながら徐々に間隔が空く形で最終的には最大同期間隔で同期される。
というわけで「MinPollInterval=a(210≒17分)」~「MaxPollInterval=c(212≒68分)」としてみた。


参考
Windows XP で権限のあるタイム サーバーを構成する方法
Windows Time Service and Resulting Internet Communication in Windows Server 2008
Windows タイム サービスのデバッグ ログを有効にする方法
NTP - wiki@nothing
Windows OSにおける時刻同期サービスとNTP - @IT
w32timeデバッグ・ログとw32tmコマンド - @IT
UNIXベースのNTPサーバとWindows Timeサービス - @IT

時刻が大きく変更されないように Windows タイム サービスを構成する方法
 NICTが誤った時刻を配信してパソコンの時間が狂ってしまったというトラブルの件