ネットワークで接続された複数のマシン間で共同作業を行うなら、各マシンが内蔵しているシステムクロックを同期させておくことは重要である。更新日時をベースにしてファイルを操作したりする場合に、各マシン間で不整合が生じたりする可能性があるからだ。Windows OSで時刻同期をする具体的な手順や注意点を解説する。
対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition、Windows 2000 Server/Windows 2000 Advanced Server
ネットワーク上に多数のマシンが存在していて、それらの間で共同作業を行う場合、各マシンが内蔵しているシステムクロック(リアルタイムクロック、RTC)をすべて同じになるように揃えておくのは非常に重要なことである。
ファイルのタイムスタンプがずれていれば、更新日時順にソートしたり、ファイルの新旧を区別して動作するようなユーティリティ、例えばバックアッププログラムや、プログラムの開発過程で使われるmakeコマンド(ファイルの修正時刻を調べて、新しいものだけ再コンパイルするためなどに使われる)が正しく機能しなくなったりする。
また、Windows 2000/Windows XPではKerberosを使ったログオン認証システムを採用している。これはサーバとログオンするクライアントの時間がある範囲内で一致していないと、正しく動作できないという仕組みになっている。
このような問題を避けるため、Windows OSでは、ネットワーク全体で各マシンに内蔵されているシステムクロック(時刻情報)を同期させるためのメカニズムが提供されている。ここでは、その利用法について見てみる。
Windowsネットワークにおいてお互いのシステムクロックを同期させるには、以下のような2つの方法がある(詳しくは「Windows XP/Windows Server 2003環境におけるWindowsネットワーク時刻同期の基礎とノウハウ」を参照)。
Windows OSでは、「net time」というコマンドを使えば、簡単に他のWindows OSとクロックを同期させることができる(これはWindowsネットワーク独自の同期用プロトコルを使っている)。
この方法は、Windows 9x/Me/NTといった、比較的古いOSでも利用可能という特徴がある一方で、同期させる相手がWindows OS(もしくはSambaサービスを実行しているPC UNIXなど)のマシンに限られる。主にLAN内でのみ利用可能な方法だ。
NTP(Network Time Protocol)プロトコルは、インターネットで広く使われているクロックの同期用のプロトコルである。Windows PCに限らず、さまざまなシステムで利用できるという特徴がある。
また、NTPサービスを簡略化して、時刻同期の機能だけに限定した「SNTP(Simple Network Time Protocol)」というプロトコルも普及している。
NTPでは、階層的に構築された時刻サーバによるネットワークを使って、多数のマシンに効率よく、正確な時刻情報を提供できる。しかも、ネットワークの特性によるパケットの遅延時間のばらつきやゆらぎなどの影響を極力排除して、正確な時刻情報をやりとりできる。
通常NTPを使ったシステムでは、最上位には非常に正確な時刻情報源(原子時計やGPSなどを使った基準となる時計)を(複数)用意し、その下に階層的にNTPサーバを構築していく。同じ階層同士でも相互に時刻情報をやりとりして、その揺らぎの影響などを統計的に処理することにより、インターネットを経由した場合でも数msec以下の誤差でクロックを同期させることができる(ただしSNTPでは、パケットの往復時間を平均して遅延時間を算出しているので、統計的なゆらぎまで考慮するNTPに比べるとやや精度は低い)。
一般的には、組織内に1台のマスターとなるNTPサーバを用意する。そして、インターネット上のどこかに置かれているNTPサーバと同期させ、それを組織内の基準クロックとする。組織内の全クライアントは、それを基準にして動作するようにネットワークを設定しておく(階層構成にすれば、マスターとなる1台だけに負荷が集中するのを防ぐことができる)。
このように、NTPサービスを使うためには、(当然であるが)時刻の基準となるNTPサーバがどこかに1台必要となる。インターネットプロバイダによっては、ユーザーのためにNTPサーバを用意しているところもあるし、GPSや標準電波を使ったNTPサーバシステムなども市販されているので、これらを使って正確な基準時刻源を作ればよいだろう。
またインターネットマルチフィード(MFEED)が提供しているNTPサーバ「ntp.jst.mfeed.ad.jp」を利用することも可能だ。詳細は「時刻情報提供サービス for Public」のページを参照していただきたい。
ちなみに同社は以前、通信総合研究所(現 情報通信研究機構)、NTT、インターネットイニシアティブとの共同研究プロジェクトとして、インターネット上での日本標準時提供実験をしていた(プレスリリースはこちら)。
Windows 2000/Windows XPでは、このNTP(SNTP)を使ったWindows Timeサービス(開発当初の呼び名に基づいて、「W32Time」サービスとも呼ばれることがあり、イベントログにはこの名前でログが出力される)という時刻同期のためのメカニズムが実装されている。
そのため、ある1台のマスタとなるNTP(SNTP)サーバマシンを使って、ドメイン内のすべてのWindowsクライアントの時刻をNTP(SNTP)プロトコルを使って同期させることができる。クライアントがWindows 9xやMe、Windows NTの場合は、net timeコマンドを使って同期を行えばよい。
Windows Timeサービスを使って自動的なクロックの同期を行うには、2つの方法がある。
この場合、Active Directoryを導入して、時刻情報を同期させたいクライアントをすべてドメインに参加させておく必要がある。Windows 2000/Windows XPでは、Active Directoryドメインに参加しているマシンはすべて自動的にドメインコントローラの持つクロックに同期するようになっている。Active Directoryで利用されているKerberos認証では、参加しているコンピュータ間でクロックが(ほぼ)一致していることが必要だからだ。
この場合、各クライアントのSNTP設定を手動で行う必要がある。net timeコマンドのオプションでSNTPサーバのアドレスをセットしておくと、以後は自動的にそのSNTPサーバを参照して、マシンのクロックが同期するようになる。クライアントはドメインに参加している必要はないし、ワークグループ形式や、非Windows PCが混在していても利用できる。
Windows 9xやMe、NTでは、NTP(SNTP)プロトコルを直接扱うことができないので、net timeコマンドを使うのが一般的である。
例えばコマンドプロンプト上で次のコマンドラインを実行することにより、ローカルマシンのシステムクロックを、<コンピュータ名>のPC(適切なアクセス権があるWindows 9xやWindows NT/2000/XP搭載PC)が持つ時刻情報と同期させることができる。
net time \\<コンピュータ名> /set /yes
これをタスクスケジューラなどで1日に1回程度実行すれば、常にほぼ正確な時刻を維持できる。この方法は、すべてのWindowsクライアント(Windows 9x/Me/NT/2000/XP)で利用できる。/set(と/yes)を省略すると、指定されたサーバの時刻情報を参照して表示するだけで、ローカルマシンのクロックは更新されない。
Windows 2000(Professional、Server)では、上記のnet timeコマンドによる同期のほかに、新しくSNTPプロトコルを使ったクロックの同期方法も用意されている。インターネットに常時接続されている環境があるならば、これを使って常にサーバのクロックを正確に維持するようにすればよいだろう。
Windows 2000でSNTPプロトコルを利用するためには、まず基準となるSNTPサーバをドメイン内に(最低でも)1台用意する必要がある。一般的には、ドメインのFSMOのPDC(Flexible Single Master OperationのPrimary Domain Controllerエミューレータの役割を果たすサーバ。一般的にはActive Directory内で最初に作成したドメインコントローラが担当する)で以下のようなコマンドを実行し、外部のSNTPサーバに同期させる。
net time /setsntp:<SNTPサーバ>
<SNTPサーバ>には、SNTPサーバの名前かIPアドレスを指定する(プロバイダの提供するNTPサーバや、先にあげたようなNTPサーバを指定する)。
現在のSNTPサーバの設定状態を調べるには、次のコマンドラインを実行すると「/setsntp」オプションで設定したSNTPサーバ名が表示される。
net time /querysntp
以上の設定がすめば、自分自身のクロックは外部のSNTPサーバと同期しているはずである。またドメイン内の各クライアント(他のドメインコントローラやメンバサーバ、およびWindows 2000 Professional、Windows XPなど)の時刻も自動的にドメインコントローラに同期するようになっているはずである。
階層的なドメインを構築している場合は、ルートにあるドメインコントローラが唯一の基準となって、自動的に下位のドメインコントローラにまで時刻情報が伝達される。
もし、何らかの理由で各クライアント側のWindows Timeサービスが起動していないようであれば、以下のようにして[スタート]メニュー−[プログラム]−[管理ツール]−[サービス]で、Windows Timeサービスの[スタートアップの種類]を「自動」にしておく。
各クライアントにおいて、Windows Timeサービスが起動すると、Windows Timeサービス(SNTPサービス)を実行しているドメインコントローラを自動的に検索して、SNTPプロトコルで現在の時刻を問い合わせ、ずれがあればローカルのシステム時刻情報が修正される。
この場合、ローカルの時刻が正確な時刻よりも遅れているか、3分以上進んでいる場合は直ちにローカルのシステム時刻の修正が行われる。3分以内の進みならば、ローカルのシステムクロックの進み方を遅らせて、数分かけて徐々に正確な時刻に近づける(すぐに修正すると、時刻情報に基づいて動作しているプログラムなどに支障が出る可能性があるため)。さらに、その後は数十分〜数時間ごとに基準時刻とのずれを調べ、必要ならば修正が行われる。
以上のようなWindows Timeサービスによる時刻の同期作業は、ドメインのメンバであれば各クライアントごとに何もしなくても自動的に行われるようになっている(Windows Timeサービスが自動的に起動するように設定される)。
一方、ドメインメンバではなく、ワークグループ形態で動作しているWindows 2000 ServerやProfessionalなどの場合は、手動で設定を行う必要がある。具体的には、「net time /setsntp」コマンドでSNTPサーバを指定し、さらに上記のようにWindows Timeサービスを起動時に開始するように設定しておけばよい。
■レジストリの設定
Windows Timeサービスでは、デフォルトでは、8時間に1回しかSNTPサーバと同期を行わない(サービス起動直後はもっと頻度が高いが、安定してくるにつれて同期回数はこの頻度に下がってくる)。
だが、場合によってはこれでは不十分かもしれない(例えばシステムクロックに使われている水晶の精度が低いと、8時間で数秒ずれてしまうかもしれない)。このような場合は、レジストリを調整して、より高い頻度で同期を行うように指定できる。詳細については「Windowsネットワーク時刻同期の基礎とノウハウ 第1回 Windows OSにおける時刻同期サービスとNTP Windows Timeサービスでの時刻同期間隔について」を参照していただきたい。
Copyright© Digital Advantage Corp. All Rights Reserved.