NTPD(8)

名称
ntpd - Network Time Protocol (NTP) デーモン

書式
ntpd [-aAbdgLmnPqx] [-c conffile] [-D level] [-f driftfile] [-k keyfile] [-l logfile] [-N high] [-p pidfile] [-r broadcastdelay] [-s statsdir] [-t key] [-v variable] [-V variable]

解説
ntpd ユーティリティは、インターネットの標準時間サーバと同期をとって、システム時刻 (time of day) を設定し維持するオペレーティングシステムデーモンです。 ntpd は、Network Time Protocol (NTP) バージョン 4 の完全な実装となっていますが、RFC-1305 で定義されているバージョン 3 に対する互換性も保っています。 加えて、各々 RFC-1059 と RFC-1119 で定義 されているバージョン 1 とバージョン 2 に対する互換性も保っています。

ntpd ユーティリティは多くの計算を 64-bit 浮動小数点演算で行ない、 究極の精度である約 232 ピコ秒を保つ必要があるときだけ、比較的扱いにくい 64-bit 固定小数点操作を行ないます。 現在の普通のワークステーションやネットワークではこの究極の精度は 達成できませんが、この精度は将来のギガヘルツ級の CPU クロックや ギガビット LAN において必要となるでしょう。

通常、 ntpd は、起動時に設定ファイル ntp.conf(5) から読み込み、同期ソースや動作モードを決めます。 また、機能が限定されますが、コマンドラインから全ての動作を指定することにより、 設定ファイルを使わずに実行することもできます。 これは、 ローカルホストをブロードキャスト/マルチキャストクライアントとして 設定し、全ての通信相手を、実行時にブロードキャストを 待受け (listen) て決定する時には、特に有益です。

ntpd に NetInfo サポートが組み込まれている場合、 デフォルトの ntp.conf(5) ファイルが読み込めず、また -c オプションによるファイルの指定もされていないときに、 ntpd は設定を NetInfo より読み込もうとします。

ntpd の実行中は、 ntpq(8) および ntpdc(8) ユーティリティプログラムを使用することで、 さまざまな ntpd 内部変数を表示したり、 設定オプションを変更したりできます。

ntpd は起動時に umask(2) の値を調べ、もしそれが 0 ならば、 umask(2) を 022 に設定します。

以下にあげる引数が使用可能です:

-a  認証モードを有効にします (デフォルト)。

-A  認証モード無効にします。

-b  NTP のブロードキャストメッセージを使って同期します。

-c conffile
    設定ファイルの名前とパスを指定します。 (netinfo を無効にする?)

-d  デバッグモードを指定します。 このフラグは何回指定してもかまいませんが、 回数が多いほど表示がより詳細になります。

-D level
    デバッグレベルを直接指定します。

-f driftfile
    ドリフトファイルの名前とパスを指定します。

-g  通常、 ntpd はオフセットが正気限界 (sanity limit) を越えている場合は終了します。 この値のデフォルトは 1000 秒です。 正気限界を 0 に設定した場合、正気限界のチェックを行なわず、 オフセットがどのような値でも受理します。 このオプションはこの制限を無視し、 どの時刻にも制限なく設定できるようにします。 しかしこれは一度のみ起り得ます。 この後は、制限を超過すると、 ntpd は終了します。 このオプションは、 -q オプションとともに使用することができます。

-k keyfile
    NTP の認証鍵を含むファイルの名前とパスを指定します。

-l logfile
    ログファイルの名前とパスを指定します。 デフォルトはシステムログ機能です。

-L  仮想 IP を待ち受けます。

-m  224.0.1.1 の IP マルチキャストグループアドレス上の NTP マルチキャストメッセージを利用して同期します (マルチキャストカーネルが必要になります)。

-n  フォークしません。

-N priority
    オペレーティングシステムの許容範囲で、 ntpd を高優先度で実行させます。

-p pidfile
    ntpd のプロセス ID を記録するためのファイル名とパスを指定します。

-P  オペレーティングシステムによって設定される優先度制限を無視します。 意気地なしには使用を推奨しません。

-q  最初に時刻を設定した直後に ntpd の実行を終了します。 この挙動は、引退させるべきプログラム ntpdate(8) の挙動を真似したものです。 このオプションといっしょに、 -g オプションと -x オプションとを指定することができます。

-r broadcastdelay
    ブロードキャスト/マルチキャストサーバからこのコンピュータ間の デフォルト伝播遅延を指定します。 このオプションはプロトコルによって自動的に遅延を計算できない場合にのみ 必要となります。

-s statsdir
    統計機能によって作成されるファイルのディレクトリパスを指定します。

-t key
    鍵番号を信頼できる鍵 (trusted key) のリストに付け加えます。

-v variable

-V variable
    デフォルトでリストされるシステム変数を追加します。

-x  通常は、オフセットが設定閾値 (デフォルトは 128 ms) より小さい場合、 時刻は徐々に微調整 (slew) されます。 設定閾値より大きい場合に、単に時刻設定 (step) されます。 このオプションは全ての場合において微調整するように強制します。 設定閾値を 0 に設定した場合、 -x オプションの有無に関わらず、また、値に関わらず、全てのオフセットで 時刻設定します。 大きな時刻誤差や周波数誤差を扱うために設計された時計状態機械を通さずに 時刻合わせするため、一般には、これはうまいやり方ではありません。 注意: 微調整の速度は 0.5 ms/s までに 制限されていますので、1 秒調節するのに 2000 秒の 償却期間が必要です。 このため、たくさんの秒数を調節するには、 償却に数時間や数日を要することもあります。 このオプションは -q オプションといっしょに使用することができます。

  NTP はどのように動作するか
ntpd ユーティリティは、設定した 1 個以上のサーバと、指定したポーリング 間隔でメッセージ交換を行ないます。 実行を開始する際に、 最初の起動か何度目かの起動かによって、このプログラムは これらのサーバの多数といくつかのメッセージの交換を必要とします。 その結果、 信号処理と緩和アルゴリズムによりデータを蓄積し、データを整え、 時刻設定を行ないます。 バーストからネットワークを守るため、各サーバに対する 初期ポーリング間隔は 0 から 16 秒の間のランダムな値で遅らされます。 デフォルトの初期ポーリング間隔は 64 秒です。 時計を設定するまでに数分を費やしてしまうことがあります。 ntp.conf(5) に記述されているように、 設定コマンド server で指定するキーワード iburst を使い、時計設定するまでの初期遅延を減少させることができます。

現代のオペレーティングシステムとハードウェアの大部分は、 time-of-year (TOY) チップを持っており、電源断の間も時刻を 保持しています。 マシンが起動すると、このチップを使いオペレーティングシステムの 時刻を初期化します。 マシンが NTP サーバに対して時刻同期を取った 後で、オペレーティングシステムはそのチップの時刻を必要に応じ修正します。 TOY チップが存在しないか、何らかの理由で TOY チップの 時刻とサーバの時刻の違いが 1000 秒より大きい場合、 ntpd は何か決定的にまずいことが生じたと仮定します。 この場合に意味のある動作は、オペレータが介在し手動で時計を設定することです。 この場合、 ntpd はパニックメッセージをシステムログに出力し実行終了します。 -g フラグはこのチェックを上書きし、チップの時刻に関わらずサーバの 時刻が時計に設定されます。 しかしながら、CMOS バッテリの故障や クロックカウンタの不調などのハードウェアの故障から 身を守るために、一度クロックを設定してから誤差が 1000 秒を越えた 場合、いずれにしても ntpd は実行終了します。

通常の状態では、 ntpd は、時刻が実質的に連続に推移し不連続が生じないように、 時計を僅かな刻みで修正します。 ネットワークの輻輳が著しい状態では、 往復遅延時間の変動 (jitter) が 3 秒を越え、同期距離 (これは、 往復遅延時間の半分と誤差量の項の和) が著しく大きくなる可能性が あります。 128ms 以下のサンプルオフセットが存在しない時間間隔が 900 秒を越えない かぎり、 ntpd のアルゴリズムでは、128ms を越えるサンプルオフセットを捨てます。 オフセットがどのような値であっても、その後最初に採取されるサンプルが 示す値で時計を設定します。 現実には、誤って時刻を設定し 間違った警告を発生する率は、この処理により ほとんどなくなったと言ってもいいほどに減少されます。

この動作の結果として、一度時計が設定されると、ネットワーク経路の 輻輳と遅延時間変動が極めて大きな場合であっても、 128ms を越えた変動は極めてまれにしか生じません。 ときどき、特に ntpd が最初に起動したときには、誤差が 128ms を越えることがあります。 ローカル時計の時刻がサーバと比べ 128 秒以上先に進んでいる場合、 これにより、逆向きの時計設定が生じることがあります。 アプリケーションによっては、この動作に耐えられないものもあるかも しれません。 コマンド行に -x オプションを含めている場合、時計の設定は決して行なわれません。 時刻の微調整のみを行ないます。

-x オプションを使うと決める前に、それによる問題を注意深く調査する 必要があります。 可能な最大微調整速度は 500 parts-per-million (PPM) に 制限されています。 これは、NTP プロトコル設計とアルゴリズム設計が 根拠とする正しさの原理による結論です。 結果として、ローカル時計が許容可能なオフセットに収束するまでに長い時間を 必要とする可能性があります。 時計が許容可能な範囲外にある場合、1 秒につき 約 2,000 秒が必要となります。 その間は、ローカル時計は他のネットワーク時計のどれとも一貫性はなく、 このシステムは、正しく同期したネットワーク時間を必要とする 分散アプリケーションに利用することができません。

上記の予防策にも関わらず、大きな周波数誤差が存在する場合に、ときどき、 結果として時間オフセットは 128ms の範囲を逸脱し、その際に、 時刻設定または時刻の微調整が必要となります。 そのような時刻修正の あと、最初のサンプルも受理可能な範囲外となるほど周波数誤差が大きいならば、 ntpd は、 ntp.drift ファイルが存在しない場合と同じ状態に入ります。 この動作の意図は、周波数を素早く補正し、通常の追跡モードに動作を 戻すことにあります。 最も極端な場合 (time.ien.it のことを思い出しますが) として、 時刻設定/微調整による時刻補正と、その後周波数補正とが生じることもあります。 この動作は、このような場合に、サーバを設定する際にキーワード burst を使う助けになります。

  周波数の修正
起動時の ntpd の動作は、周波数ファイル (普通は、 ntp.drift ) が存在するかどうかに依存します。 このファイルは、時計の周波数誤差の最新の予測値が含まれます。 ntpd が起動され、このファイルが存在しないとき、 ntpd はシステムクロック発振器の時刻誤差と周波数誤差に 急速に適合するために特に設計された特殊モードに入ります。 このモードには約 15 分を必要とします。 その後、時刻と周波数は公称値に設定され、 ntpd は通常のモードに入ります。 このモードでは時刻と周波数は連続的にサーバに対し追従します。 1 時間後、周波数ファイルが生成され、現在の周波数オフセットが書き込まれます。 ntpd が起動され、このファイルが存在するとき、 ntpd の周波数はこのファイルの値から初期化され、直ちに通常のモードに 入ります。 その後、1 時間間隔で、その時点の周波数オフセットが このファイルに書き込まれます。

  動作モード
ntpd ユーティリティはいくつかのモードのいずれかで動作します。 それらのモードとしては、 "アソシエーション管理" のページ (/usr/share/doc/ntp に提供された HTML 文書の一部として利用可能です) で示したように、 対称的アクティブ/パッシブ、クライアント/サーバ、 ブロードキャスト/マルチキャスト、メニーキャストがあります。 本プログラムは、普通は連続的に動作します。 その間、小さな周波数変化を監視し、時計を究極の精度に向けて調整します。 しかしながら、単発モード (one-time mode) で動作することもあります。 このモードでは、時刻が外部サーバから設定され、周波数は以前に 記録しておいた周波数ファイルから設定されます。 ブロードキャスト/マルチキャスト、もしくはメニーキャストクライアントは、 リモートサーバを発見し、サーバクライアント間の伝播遅延補正係数を 計算し、自分自身を自動的に設定することができます。 このモードにより、その環境固有の設定を詳細にわたり指定することなしに、 多数のワークステーションを配備することができます。

デフォルトでは、 ntpd は、連続モードで動作します。 このモードでは、複雑な状態機械により 決定される時間間隔で、いくつかある外部サーバのそれぞれに対し ポーリングを掛けます。 状態機械は、それに付随して 往復遅延時間の変動と発振器周波数の逸脱 (wander) を測定し、 ヒューリスティックなアルゴリズムを用いて最適なポーリング間隔を 決定します。 通常は、ほとんどのオペレーティングシステム環境で、この状態機械は 64 秒の時間間隔で開始し、状況に応じ、1024 秒まで段階的に増加させます。 サーバへのアクセス集中を避けるため、微小なランダム偏差も入れて あります。 加えて、しばらくの間サーバが到達できない状態になる場合には、 ネットワークのオーバヘッドを減らすために、 ポーリング間隔を 1024 秒まで段階的に増加させます。

いくつかの場合では、 ntpd が連続モードで動作することが現実的でないことがあります。 この場合、これまでは、普通の対応方法として、 cron(8) ジョブから ntpdate(8) プログラムを 指定した時刻に実行させていましたが、 このプログラムは、 ntpd が持つ 信号処理、誤差チェック、緩和アルゴリズムに関する練り込みを 持っていません。 -q オプションはこの目的のためにあります。 このオプションを設定することにより ntpd は、時計を 1 回設定した直後に実行終了します。 時計の初期設定の手順は、連続モードと同じものです。 ほとんどの応用では、 server 設定コマンドで、 iburst キーワードを指定しようとすることになると思います。 このキーワードにより、メッセージが連続して矢継ぎ早に交換され、 データが整えられ、時計はおよそ 1 分間で設定されます。 適当な期間、喪に服した後に、 ntpdate(8) プログラムは引退ということになると思います。

純正の Solaris, Tru64, Linux, FreeBSD の場合がそうですが、 時計周波数修正についてカーネルサポートが利用可能な場合には、 時計周波数の修正という有益な機能が利用可能です。 まず、 ntpd は、選択されたサーバに対し連続モードで動作し、 固有の時計周波数オフセットを測定し、周波数ファイルに記録します。 周波数とオフセットが定常状態になるまでに数時間掛かることも あります。 そのあと、 ntpd は停止し、必要に応じ単発モードで動作します。 プログラム開始時には、 周波数はファイルから読み込みカーネル内周波数を初期化します。

  ポーリング間隔制御
このバージョンの NTP は、測定された時間変動と逸脱とに合致した レベルの同期の質を維持するため、複雑な状態機械を含んでいます。 精度を増大させる処理には、時間間隔を減少させる目的や、 ネットワークのオーバヘッドを減らすために時間間隔を増大させる目的の 方法がいくつかあります。 しかし、デフォルト最小値の 64 秒からデフォルト最大値の 1024 秒の 間のポーリング調整範囲の変更の結果について注意深く考慮することを、 ユーザには推奨します。 デフォルト最小値は tinker minpoll コマンドを用いて 16 秒以上の範囲で変更することができます。 設定コマンドの minpoll オプションで上書き設定されない限り、 設定されたアソシエーションのすべてでこの値が使用されます。 注意: ポーリング間隔が 64 秒より小さい場合、ほとんどの デバイスドライバは正しく動作しません。 また、ブロードキャストサーバと メニーキャストクライアントのアソシエーションも、上書き設定しない限り デフォルト値を使用します。

ダイアルアップサービスや従量性課金サービスなどの場合、 最小間隔を数 10 分にし、最大間隔を 1 日程度に増やすと便利かも しれません。 通常の動作条件では、時計修正ループがひとたび安定化すると、 時間間隔は最小値から最大値まで段階的に増えてゆきます。 しかし、これは、修正ループが誤差を修正できる程度まで 固有時計周波数誤差が小さいことが前提です。 ループの誤差補足可能範囲は、64 秒の間隔において 500 PPM で、 間隔を 2 倍にするごとに 2 の因数で減少します。 例えば、最小値 1,024 秒では、誤差補足可能範囲は 31 PPM にしか過ぎません。 固有誤差がこの値より大きい場合、ドリフトファイル (drift file) ntp.drift は、この制限以下の剰余誤差を減少させるため特別扱いせねばなりません。 この状態が一度生じると、ドリフトファイルは自動的に 1 時間に 1 回 更新され、それ以後のデーモンの再起動の際に周波数を初期化できるように なります。

  スーハーフィルタ(huff-n'-puff filter)
電話線モデム経由で相当量のデータをダウンロード/アップロードするような 使い方では、時刻維持の品質が著しく低下する可能性があります。 これは、2 方向の送信における遅延の差が極めて大きくなる可能性があるからです。 多くの場合、時刻誤差が明らかに大きくなり、設定修正の閾値を越え、 データ転送の後もしくは途中に設定による補正が生じます。

スーハーフィルタは、これらの場合に目立つ時間オフセットを補正するために 設計されました。 これは、他のトラフィックが存在しないときの伝播遅延の 知識に依存します。 普通の状況でこれが生じるのは業務以外の時間です。 このフィルタは、最近の時間間隔で通常は数時間測定した中で 最小遅延を記憶するシフトレジスタを保持します。 遅延が厳しい状況では、このフィルタは、 問題の遅延と最小遅延の差と、オフセットの符号とを用いて 問題のオフセットを補正します。 このフィルタの名前は、オフセットの符号に依存した、 負の補正 (ハーと吹く) と正の補正 (プーと吹く) を表しています。

このフィルタは tinker コマンドと huffpuff キーワードにより有効にされます。 これは、 ntp.conf(5) に詳しい説明があります。

関連ファイル
/etc/ntp.conf
    デフォルトの設定ファイル名
/etc/ntp.drift
    デフォルトのドリフトファイル名
/etc/ntp.keys
    デフォルトの鍵ファイル名

関連項目
ntp.conf(5), ntpdate(8), ntpdc(8), ntpq(8)

提供されているマニュアルページに加えて、 包括的なドキュメントが world wide web 上の http://www.ntp.org/ にあります。 このドキュメントのスナップショットが HTML 形式で /usr/share/doc/ntp にあります。 David L. Mills, Network Time Protocol (Version 1), RFC1059. David L. Mills, Network Time Protocol (Version 2), RFC1119. David L. Mills, Network Time Protocol (Version 3), RFC1305.

バグ
ntpd ユーティリティはかなり大きくなってしまいました。 巨大とは言いませんが、ワークステーションで高優先度で実行する ntpd として望ましい大きさを超えてしまいました。 特に、階層数 (stratum) の大きいワークステーションよりは、 高負荷のプライマリサーバにあわせて、 かさばる凝った特徴の多くが設計されているからです。