付属ユーティリティの ntpdate で `ntpdate -b 192.168.0.1 ' (確実に名前解決できるならホスト名でも可) する手もあるが、NTP が推奨しているのは、ちょっと面倒だが、クライアントでも認証を含めたすべての項目を設定しておき `ntpd -q' するという方法だ。タイムサーバ側と同じくデーモンとして常時起動させておく方法もあるが、ここでは cron による方法について述べる。
対称鍵ファイルはとにかく作っておくだけでよい。クライアント側の ntp.conf はこんな感じになる:
restrict default ignore restrict 127.0.0.1 restrict 192.168.0.1 noquery nomodify notrap nopeer driftfile /var/lib/ntp/drift server 192.168.0.1 minpoll 5 # local clock #server 127.127.1.0 fudge 127.127.1.0 stratum 10 keys /etc/ntp/keys
NTPサーバ 192.168.0.1 を、最短ポールインターバル 5 、つまり 32 秒と短くして参照している。このほうが、クライアントの時間補正がやや短時間ですむようだ。32 秒というのは、ntpd の実行間隔ではないので注意していただきたい。アクセス制限項目では、自身についてはループバックだけでちゃんと機能し、サーバのように念のための実アドレスは書かなくても大丈夫だ。もちろん書いても構わない。サーバのアドレスに関しては ntpq や ntpdc によるモード6/7 パケットを受け付けず返答もせず変更も拒絶し、相手からのシンメトリック-アクティブモードの申し出も断るよう "noquery nomodify notrap nopeer" とした。
設定ファイルができたら、cron などで例えば 30分毎とか 1時間毎に:
ntpd -q -x -g -u ntp:ntp
を実行すれば良い。実際いろいろ試してみると、ntpd はオプションの記述順に神経質なようなので、この通りに記述しないと ntpd が起動してくれない。また、クライアントが NTP 以外の意味で大役を担うサーバである場合には -g は外したほうがいいだろうし、 -x の使用は要考慮 (オプションの意味は前述)。なお、 rcスクリプトを通して起動するわけではないので、RedHat 系 OS でも /etc/sysconfig/ntpd の起動オプションは読み込まれないという点に注意。そのため、必要なオプションはすべて起動時に直接渡さなければならない。「こんな使い方なら ntpdate を使った方がいいじゃないか」と思った人もいるかもしれない。それについては ntpdate の項で触れている。
上記コマンドから起動されても、-q オプションが指定してあるからといって、すぐに終了するわけではない。ntpd が指定されたタイムサーバの妥当性チェックと実際のカーネルクロック調整を完了させるには、クロックのずれにもよるが、通常でだいたい 5 分前後かかる。 minpoll が 32 秒というのは、この 5 分の中での問い合わせ間隔だ。メモリ量の逼迫などで、どうしても、なるべく早く ntpd を終了させたい場合には、奥の手を使う。上記 ntp.conf の server 行を以下のように書き換えよう:
server 192.168.0.1 iburst
細かい説明はオフィシャルドキュメントの Configuration Options や Association Management に任せるが、iburst には、 -q オプションと併用した時、サーバとのクロック同期をスピードアップする働きがある。実際に試してみたところ、ntpd は30秒ほどで exit するようになった。
この節では、Linux NTP サーバのクライアントにするだけでなく、標準ツール w32tm をまともに動かすための設定方法全般について解説する。
Windows 2003/XP 以降の Windows Time は、95/98系とは違い、それまでの独自方式 (ほぼSNTP?) だけでなく、NTP にも対応した。実験してみると、意外にも、わりと忠実に NTP規格を実装しており、Tick を調整して徐々に時計を合わせていく slew モードをメインにしていることに少し驚いた。少々調整してやれば、クライアントとしてだけでなく NTPサーバとしても動作させて、Linux の時刻参照源に仕立て上げることも可能だ。デフォルトでポーリングインターバルがとんでもない値 (同期間隔は 9時間とか 7日とか !!) になっていたりするが、レジストリで調整すれば使い物になる。
タイムソースを 0x8 フラグとともに指定して、最小同期間隔と最長同期間隔を然るべき値に調整する。ドメインコントローラや、非ドメインメンバサーバを NTPサーバにしたい時は、「権限のある」タイムサーバサーバとして設定する。念のため固定同期間隔も 30分に設定する。
Windows 2003 で初めてマニュアルピアをセットする場合は、
> net time /setsntp:"192.168.0.1,0x8 192.168.0.2,0x8"
Windows Server 2008 の場合や、一旦登録したタイムソースやその Flag を変更したい場合は下記。ただし、これらをやるとレジストリ値(後述) W32Time\Parameters\Type が NT5DS から NTP に変わるので、ドメインメンバでは注意。
> w32tm /config /syncfromflags:manual /manualpeerlist:"x.x.x.x,0x8 x.x.x.x,0x8" /update
上記のように 2つ以上のタイムソースを指定する場合には、ダブルクォーテーションで囲む必要がある。ひとつの場合は不要。設定した値は、レジストリ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer にセットされる。
各タイムソースの後ろに付けたフラグには、以下の意味がある。
0x0 | 「Windows端末同士を含む標準的なNTP時刻同期方法(Symmetric Active/Passiveモード)」。挙動は謎。ntpd で言うところの peer ディレクティブでの参照先指定を含むと思われる |
0x1 | レジストリ値 SpecialPollInterval に基づいた定間隔での時刻同期 |
0x2 | これを指定したタイムソースは、他のタイムソースが参照できない時のフォールバックとしてのみ使われる |
0x4 | Symmetric Activeモード。ntpd で言えば peer ディレクティブによる参照先指定にあたる |
0x8 | NTPクライアントモード。ntpd での server ディレクティブでの指定と同義 |
Windows Server 2003/2008 ではデフォルトが 0x0 になっているため危険。明示的に 0x8 とするのが妥当だ。もちろん、0x8 に設定してもドメインメンバからの参照に支障はない。
マニュアルピア設定の確認;
> net time /query
タイムソースが参照できるかの確認例;
> w32tm /monitor /computers:192.168.0.1
続いて、ポーリング間隔を調節する。固定間隔と、ntpd のように 最小 -> 最長 で徐々にポーリングが長くなる方式とがあるが、前者が使われるのは Flag 0x1 のマニュアルピアの場合のみ。他のマニュアルピアや ドメインコントローラ同期 (後述) の場合には自ずと変動方式となる。
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [DWORD] MinPollInterval |
設定値 | 0x6 |
説明 | 最小同期間隔。ntpd の minpoll オプションにあたり、それと同様に 「2のN 乗」 のN を指定する。6 を設定すると 26 つまり 64 秒となる。Flag 0x1 のマニュアルピアには使われない |
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [DWORD] MaxPollInterval |
設定値 | 0xb |
説明 | 最長同期間隔。ntpd の maxpoll オプションにあたり、同様に 2 を基底とする指数で指定する。b (10進の11) を設定すると 211 = 2048 秒 (約34分) となる。Flag 0x1 のマニュアルピアには使われない。Windows Server 2003 R2 の初期値はなんと 0xf (15) = 32768秒 = 9時間だった |
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient |
値 | [DWORD] SpecialPollInterval |
設定値 | 0x708 |
説明 | Flag 0x1 のマニュアルピアに使用される固定同期間隔。ただし、0x1 ピアでない場合にも念のため設定しておく。これは指数でなく単純に秒数。16進の 708 はつまり 10進の 1800秒 (30分)。ワークグループ環境のホストの初期値はなんと 0x93a80 = 604,800秒 = 7日だとか |
ドメインコントローラの場合や、非ドメインメンバサーバを NTPサーバに仕立てたい場合は、自分を「権限のある」タイムサーバとしてアナウンスさせなくてはならない。
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [DWORD] AnnounceFlags |
設定値 | 0xA |
説明 | 値毎の意味は下表を参照。Win2003以降のドメイン環境ではデフォルトで 0xA なのでそのまま。ドメインメンバや非ドメインサーバをNTP参照源に仕立てたい時は 0x5 にする |
AnnounceFlags は、下表の値の論理和 (Bit OR)。つまり、0xA (10進の10) は 2進数で 1010 であり、下記の 0x2 と 0x8 が宣言される。
16進 | 2進 | 意味 |
0x0 | 0000 | タイムサーバとして公開=NO。信頼できるタイムサーバ=NO |
0x1 | 0001 | タイムサーバとして公開=YES |
0x2 | 0010 | タイムサーバとして公開=Auto。公開するかどうかはドメインコントローラにお伺いを立てる |
0x4 | 0100 | 信頼できるタイムサーバ=YES |
0x8 | 1000 | 信頼できるタイムサーバ=Auto。公開するかどうかはドメインコントローラにお伺いを立てる |
ドメインコントローラでないマシンは、既定では NTPサーバ機能はオフになっている。ドメインコントローラ以外をサーバとしても動作させたければ下記のレジストリを変更する;
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer |
値 | [DWORD] Enabled |
設定値 | 0x1 |
説明 | 0x0:NTPサーバ機能は無効、0x1:有効 |
イベントログの情報量を多少なりとも増やすための設定をする。
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient |
値 | [DWORD] EventLogFlags |
設定値 | 0x2 |
説明 | 0x1 (デフォルト) は、reachability (ntpdのreachabilityと同じ?) が変化した時にログ。0x2 はタイムソースのとのズレや転送の遅延が大きく変動した時にログ。論理和で 0x3 も指定可能 |
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [DWORD] EventLogFlags |
設定値 | 0x2 |
説明 | 0x1 だと、クロックが step モードで調整された時にログ。0x2 (デフォルト) では、タイムソースが替わった時にログ。論理和で 0x3 も指定可能 |
以上の設定が終わったら、Windows Time サービスを再起動する;
> net stop w32time && net start w32time
Windows Server 2008 では、下記コマンドでステータス確認が可能;
> w32tm /query /status
意図通りに動作しているかどうかを確認したいところだが、WINDOWS のイベントログレコードは大概、甚だ情報不足かMS星の宇宙人しか理解できないものばかりだ。そこで、下記の 3つのレジストリ値を作成し、w32tm のデバグログをファイルに吐かせるといい。設定は w32time サービスを再起動すれば反映される。
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [String] FileLogEntries |
設定値 | 0-116 |
説明 | 冗長度最大にしたければ"0-300"を指定してもいいが、たいてい上記で充分だ |
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [String] FileLogName |
設定値 | C:\WINDOWS\DebugLocal\w32time.log |
説明 | ログファイル名。直上のディレクトリは"Local Service"(2008の場合は"Network Service") に対して書き込み権限が必要。通常、元々存在する C:\WINDOWS\Debug\ にはそれがないので別途 DebugLocal\ を作成した方がいい |
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config |
値 | [DWORD] FileLogSize |
設定値 | 2000000 (10進) |
説明 | ログファイルの最大バイト数で、上記はつまり 2MB。MSのサイトでは 3MB を推奨している。この設定サイズを超えるとログファイルは頭から上書きされる |
Windows ドメインに参加しているホストの場合には、まず、タイムソースの選択方法が大きく 2つに別れる。このレジストリの値は w32tm の設定コマンドに伴って変更されるので、手で触る必要はあまりない。
キー | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters |
値 | [String] Type |
説明 | 設定値が NT5DS の時には、自分を管轄しているドメインコントローラを暗黙に時刻参照源とし、マニュアルピアとして設定したタイムソースは使用されない。NTP の時にはマニュアルピアを使用。ALLSYNC だと両方を使う。ドメインに参加しているホストの規定値は NT5DS |
マニュアルピアを設定すると、Type は自動的に NTP に変わる。逆に、NTP から NT5DS に戻すには;
> w32tm /config /syncfromflags:DOMHIER /update
Type を決定したら、ドメインコントローラや非ドメイン環境のホストと同様に、MinPollInterval, MaxPollInterval, そして念のため SpecialPollInterval も設定する。
設定を反映;
> net stop w32time && net start w32time
Type が NT5DS の場合に、メンバから、ドメインコントローラがタイムソースとして参照できるかどうかを確認するには;
> w32tm /monitor
または、
> w32tm /monitor /domain:<Windowsドメイン名>
Windows Server 2008 R2 (及び Windows 7) 以降の場合、更に加えて、処置しておかないと Windows Time サービスが勝手に終了する原因となる設定がある。まったく、素晴らしいサーバOSサマだ。
まずひとつ目は、サービストリガーイベント というものからの登録解除だ (参照->"Windows 7 および Windows Server 2008 R2 のスタンドアロン環境で Windows Time サービスが自動的に起動しない")。デフォルトで、w32time サービスは「ドメインに属していれば起動し、属していない場合は停止する」というサービストリガーが設定されており、これと、既定のスタートアップの種類となっている「自動」が組み合わさると、w32time は勝手に上がったり停まったりすることになる。解除は sc コマンドで行う。
> sc qtriggerinfo w32time [SC] QueryServiceConfig2 SUCCESS サービス名: w32time サービスの開始 ドメインの参加状態 : 1ce20aba-9851-4421-9430-1ddeb766e809 [ドメインに参加済みです] サービスの停止 ドメインの参加状態 : ddaf516e-58c2-4866-9574-c3b615d42ea1 [ドメインに参加していません] > sc triggerinfo w32time delete [SC] ChangeServiceConfig2 SUCCESS > sc qtriggerinfo w32time [SC] QueryServiceConfig2 SUCCESS サービス w32time は、どの開始トリガーにも停止トリガーにも登録されていません。
念のため、Windows Time サービスのスタートアップの種類を 自動(遅延開始) に変えておくとなお確実だ。
もうひとつは、デフォルトで仕掛けられているタスクスケジューラジョブの無効化だ。なんと、既定で「毎週日曜日に1回だけ時刻を合わせる」というアンポンタンなスケジュールがこっそり仕掛けられているのである。信頼に足らないサーバであることをそこまで見せびらかさなくてもいいのに...。タスクスケジューラを開き、ツリーを タスクスケジューラライブラリ -> Microsoft -> Windows -> Time Synchronization と下っていくと、SynchronizeTime というスケジュールがある。これを 無効化しておくべし。
Linux での ntpdate にあたる別個のプログラムはないが、w32tm を /resync オプションとともに使うと今すぐタイムソースに時刻を合わせることができる。ntpd が起動していると実行できない ntpdate とは逆に、これをやるには Windows Time サービスは起動していなければならない。
> w32tm /resync
ntpdate と違って不便な点は、引数にタイムソースを直接指定することができないことだ。ドメインコントローラ、またはレジストリ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer に投入してあるタイムソースが使用されるので、前述のように準備を整えておく必要がある。