クライアントの設定

LINUX の場合

付属ユーティリティの ntpdate で `ntpdate -b 192.168.0.1 ' (確実に名前解決できるならホスト名でも可) する手もあるが、NTP が推奨しているのは、ちょっと面倒だが、クライアントでも認証を含めたすべての項目を設定しておき `ntpd -q' するという方法だ。タイムサーバ側と同じくデーモンとして常時起動させておく方法もあるが、ここでは cron による方法について述べる。

Linux (NTPクライアント) から Windows 2003 Server (NTPサーバ) に時刻を合わせようとしても、Linux の ntpd が Windows を NTPサーバとして信用しようとせず、時刻合わせができない場合がある。そういった時は、後述の「Linux野郎のための WINDOWS 2003/XP/2008 時刻同期解説」を参照していただくと解決するだろう。

対称鍵ファイルはとにかく作っておくだけでよい。クライアント側の 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 の実行間隔ではないので注意していただきたい。アクセス制限項目では、自身についてはループバックだけでちゃんと機能し、サーバのように念のための実アドレスは書かなくても大丈夫だ。もちろん書いても構わない。サーバのアドレスに関しては ntpqntpdc によるモード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.confserver 行を以下のように書き換えよう:

server 192.168.0.1 iburst

細かい説明はオフィシャルドキュメントの Configuration OptionsAssociation Management に任せるが、iburst には、 -q オプションと併用した時、サーバとのクロック同期をスピードアップする働きがある。実際に試してみたところ、ntpd は30秒ほどで exit するようになった。

Linux野郎のための WINDOWS 2003/XP/2008/2012 時刻同期解説

この節では、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\TypeNT5DS から 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
説明 最小同期間隔。ntpdminpoll オプションにあたり、それと同様に 「2のN 乗」 のN を指定する。6 を設定すると 26 つまり 64 秒となる。Flag 0x1 のマニュアルピアには使われない
キー HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
[DWORD] MaxPollInterval
設定値 0xb
説明 最長同期間隔。ntpdmaxpoll オプションにあたり、同様に 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 であり、下記の 0x20x8 が宣言される。

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

TypeNT5DS の場合に、メンバから、ドメインコントローラがタイムソースとして参照できるかどうかを確認するには;

> w32tm /monitor

または、

> w32tm /monitor /domain:<Windowsドメイン名>

Windows Server 2008 R2 以降での追加作業

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 に投入してあるタイムソースが使用されるので、前述のように準備を整えておく必要がある。