Name
ntpd – Network Time Protocol (NTP) daemon
Synopsis
ntpd ]ネットワークタイムプロトコルデーモン。
Description
ntpdプログラムは、インターネット標準タイムサーバーと同期してシステム時刻を設定および維持するオペレーティングシステムデーモンです。 ntpd はほとんどの計算を 64 ビット浮動小数点演算で行い、 究極の精度である約 232 ピコ秒を維持するために必要なときだけ比較的扱いにくい 64 ビット固定小数点演算を行う。 この究極の精度は、今日の通常のワークステーションやネットワークでは達成できませんが、将来のギガヘルツCPUクロックやギガビットLANでは必要になるかもしれません。
How Ntp Operates
ntpdプログラムは、1つ以上の設定済みサーバーと指定したポーリング間隔でメッセージを交換することによって動作します。 このプログラムは、信号処理および緩和アルゴリズムがデータを蓄積して整理し、クロックを設定できるように、起動時に、初回または次回にかかわらず、これらのサーバーの大部分から数回の交換を必要とします。 バーストからネットワークを保護するために、各サーバーの最初のポーリング間隔は、数秒に わたってランダムな間隔で遅延されます。 デフォルトの初期ポーリング間隔である64秒では、クロックが設定されるまでに数分経過する可能性があります。
今日のほとんどのオペレーティングシステムとハードウェアには、電源がオフの期間中の時間を維持するために、TOY (Time of Year) チップが組み込まれています。 マシンが起動すると、このチップはオペレーティング・システムの時刻を初期化するために使用されます。 マシンがNTPサーバーに同期した後、オペレーティングシステムは時々チップを修正する。 TOYチップがない場合や、何らかの理由でサーバーの時刻と1000秒以上ずれている場合、ntpdは何かがひどく間違っているに違いないと判断し、唯一信頼できる行動は、オペレーターが介入して時計を手動で設定することである。 このため、ntpdはパニックメッセージをシステムログに残して終了する。 gオプションはこのチェックを無効にし、チップの時刻に関係なく時計をサーバ時刻に設定します。 しかし、CMOS バッテリの故障やクロックカウンタの不具合といったハードウェアの故障から保護するため、いったんクロックが設定されると、1000s を超えるエラーは ntpd を終了させる。
通常の環境では、ntpd はタイムスケールが効果的に連続し不連続性がないように小さなステップで時計を調整する。 極端なネットワーク輻輳の条件下では、往復遅延ジッターが3秒を超え、往復遅延の2分の1にエラーバジェット項を加えた同期距離が非常に大きくなる可能性があります。 ntpdアルゴリズムは、128ミリ秒未満のサンプルオフセットがない間隔が900秒を超えない限り、128ミリ秒を超えるサンプルオフセットを廃棄します。 それ以降の最初のサンプルは、オフセットに関係なく、クロックが指定された時間にステップします。 この動作の結果、いったんクロックが設定されると、ネットワーク経路の輻輳やジッターの極端なケースでも、128 ms を超えてクロックがずれることは非常にまれです。 特に、ntpd の初回起動時には、128ms を超えることがあります。 このため、ローカルクロックの時刻がサーバーに対して128秒以上先になっている場合、クロックが逆向きに設定されることがあります。 アプリケーションによっては、この動作は受け入れがたい場合があります。 コマンドラインに-xオプションが含まれている場合、クロックは決してステップされず、スルー補正のみが使用されます。
-xオプションの使用を決定する前に、問題を慎重に検討する必要があります。 NTP プロトコルおよびアルゴリズム設計が基づいている正しさの原則の結果として、可能な最大スルー・レートは 500 parts per million (PPM) に制限されています。 その結果、ローカルクロックが許容オフセットに収束するまでに時間がかかり、許容範囲から外れるごとに約2,000秒かかることがあります。 この間、ローカル・クロックは他のネットワーク・クロックと整合性がとれず、システムは正しく同期したネットワーク時間を必要とする分散アプリケーションに使用できません。
上記の予防措置にもかかわらず、大きな周波数誤差が存在する場合、結果として時間オフセットが128ms範囲を外れて、最終的にステップまたはスルー時間の補正が必要となることがあります。 このような補正の後、周波数誤差が非常に大きく、最初のサンプルが許容範囲外になった場合、ntpdはntp.driftファイルが存在しないときと同じ状態に陥ります。 この動作の意図は、周波数を迅速に修正し、通常のトラッキングモードに動作を戻すことです。 最も極端なケース(time.ien.itが思い浮かびます)では、時折ステップ/スルー補正とそれに続く周波数補正が発生することがあります。
Frequency Discipline
起動時の ntpd の動作は、通常 ntp.drift である frequency ファイルが存在するかどうかに依存します。 このファイルには、clockfrequencyの誤差の最新の推定値が含まれています。 ntpd が起動し、ファイルが存在しない場合、ntpd は特定のシステムクロック発振器の時間と周波数の誤差に迅速に適応するように設計された特別なモードに入ります。 その後、時刻と周波数は標準値に設定され、ntpdは通常モードになり、時刻と周波数はサーバーに対して連続的に追跡されます。 1時間後に周波数ファイルが作成され、現在の周波数オフセットがそこに書き込まれます。 ntpdが起動し、ファイルが存在する場合、ntpdの周波数はファイルから初期化され、すぐに通常モードになります。
動作モード
ntpd は、「アソシエーション管理」ページで説明したように、対称型アクティブ/パッシブ、クライアント/サーバーブロードキャスト/マルチキャスト、マルチキャストなどのいくつかのモードのいずれかで動作することができます。 通常、周波数のわずかな変化を監視し、究極の精度でクロックをトリミングしながら連続的に動作します。 ただし、外部サーバーから時刻を設定し、あらかじめ記録した周波数ファイルから周波数を設定するワンタイムモードで動作させることも可能です。 ブロードキャスト/マルチキャスト/メニーキャストクライアントは、リモートサーバーを検出し、サーバーとクライアントの伝搬遅延補正係数を計算し、自動的に設定することができます。
デフォルトでは、ntpd は連続モードで動作し、いくつかの外部サーバのそれぞれは、入り組んだステートマシンによって決定される間隔でポーリングされる可能性があります。 ステートマシンは、付随する往復遅延ジッタと発振器周波数の変動を測定し、発見的アルゴリズムを用いて最適なポーリング間隔を決定します。 通常、ほとんどの動作環境では、ステートマシンは64秒間隔で開始し、最終的には1024秒まで段階的に増加します。 さらに、サーバがある時間到達不能になった場合、 ネットワークのオーバーヘッドを減らすために、 ポーリング間隔が 1024 秒に増加されます。 一般的な回避策は、指定された時間に cronjob から ntpdate プログラムを実行することでした。 しかし、このプログラムは ntpd の精巧な信号処理、エラーチェック、緩和アルゴリズムを持っていません。 このオプションを設定すると、設定されたサーバーで初めて時計を設定した直後に、ntpdが終了します。 クロックを最初に設定する手順は、連続モードと同じです。ほとんどのアプリケーションは、サーバ設定コマンドでiburstキーワードを指定することを望むでしょう。 このキーワードを指定すると、データをグルーミングするために大量のメッセージが交換され、クロックは約10秒で設定されます。
Solaris, Tru64, Linux, FreeBSD のようにカーネルがクロック周波数を制御できる場合、クロック周波数を制御するための便利な機能が利用可能である。 まず、ntpdを選択したサーバで連続モードで実行し、固有クロックの周波数オフセットを測定して周波数ファイルに記録します。 周波数とオフセットが落ち着くまで、数時間かかることがあります。 その後、ntpdは停止され、必要に応じてインノーンタイムモードで実行されます。 各起動時に、周波数がファイルから読み込まれ、カーネル周波数を初期化します。
Poll Interval Control
このバージョンの NTP には、観察されたジッターやワンダーと一致する同期の品質を維持しながらネットワーク負荷を軽減する複雑なステートマシンが含まれています。 間隔を小さくして精度を高めたり、間隔を大きくしてネットワークのオーバーヘッドを減らしたりするために、動作を調整する方法がいくつか用意されています。 デフォルトの最小値は、tinker minpollコマンドで16秒以上の値に変更できます。この値は、設定コマンドのminpollオプションで上書きされない限り、すべての設定されたアソシエーションに使用されます。 また、ブロードキャストサーバとmanycastクライアントのアソシエーションは、上書きされない限りデフォルト値が使用されます。
ダイヤルアップや有料サービスを含むいくつかのケースでは、最小間隔を数十分、最大間隔を1日程度にすることが有用な場合があります。 通常の動作条件では、クロックディシプリンループが安定した後、最小から最大まで段階的に間隔を伸ばします。 ただし、これは固有クロックの周波数誤差が十分に小さく、ディシプリンループがそれを修正できることが前提です。 ループの捕捉範囲は64秒間隔で500PPMであり、間隔が2倍になるごとに2倍ずつ減少する。 例えば、最小1,024秒の場合、捕捉範囲は31PPMに過ぎない。 一旦これが行われると、ドリフトファイルは1時間に1回自動的に更新され、その後のデーモン再起動時に周波数を初期化するのに利用できます。
the Huff-n’-puff Filter
かなりの量のデータが電話モデムを介してダウンロードまたはアップロードされるシナリオでは、時間管理の品質は著しく低下することがあります。 これは、2つの伝送方向の差分遅延が非常に大きくなるために起こります。 多くの場合、見かけ上の時間誤差はステップ閾値を超えるほど大きく、データ転送中や転送後にステップ補正が発生します。
Huff-n’-puff Filterは、このような場合に見かけ上の時間オフセットを補正するように設計されています。 これは、他のトラフィックが存在しないときの伝搬遅延の知識に依存します。 一般的なシナリオでは、これは勤務時間以外に発生します。 このフィルターは、通常数時間で測定される直近の区間の最小遅延を記憶するシフトレジスタを保持します。 遅延がひどい場合、フィルタはオフセットの符号と見かけの遅延と最小遅延の差を使用して見かけのオフセットを修正します。 フィルタの名前は、オフセットの符号に依存する負の (huff) および正の (puff) 補正を反映します。
フィルタは、Miscellaneous Options ページで説明されているように、tinker コマンドと huffpuff キーワードによって有効になります。
ホスト名が期待されるコンテキストでは、ホスト名の前の -4 修飾子は IPv4 名前空間への DNS 解決を強制し、一方 -6 修飾子は IPv6 名前空間への DNS 解決を強制します。
ユーティリティプログラム ntpq および ntpdc を使用して、ntpd の実行中にさまざまな内部変数を表示し、設定オプションを変更することが可能です。
NTPD の起動時に umask の値を確認し、0 の場合は umask を 022 に設定する
-n, -d, -D オプションを使用しない限り、NTPD は現在の作業ディレクトリをルートディレクトリに変更するので、パスを指定するオプションまたはコマンドは絶対パスまたはルートからの相対パスを使用する必要がある。
コマンドラインオプション
-4 IPv4 名前空間へのホスト名の DNS 解決を強制します。 -6 IPv6 名前空間へのホスト名の DNS 解決を強制します。 -a ブロードキャストクライアント、マルチキャストクライアント、および対称型パッシブアソシエーションのために暗号化認証を必要とします。 これはデフォルトです。 -A ブロードキャストクライアント、マルチキャストクライアント、および対称的なパッシブアソシエーションに暗号化認証を要求しないようにします。 これは、ほとんど良いアイデアではありません。 -b クライアントがブロードキャストサーバーに同期することを有効にします。 -c conffile 設定ファイルの名前とパスを指定します (デフォルトは /etc/ntp.conf) -d デバッグモードを指定します。 このオプションは複数回指定することができ、指定するたびに詳細な表示が行われます。 -D level デバッグレベルを直接指定します。 -f driftfile 周波数ファイルの名前とパスを指定します。 これは、driftfile 設定コマンドと同じ操作である。 -g 通常、オフセットがパニック閾値 (デフォルトでは1000秒) を超えると、ntpdはシステムログにメッセージを出力して終了します。 このオプションにより、timeを制限なく任意の値に設定することができます。ただし、これは一度だけしか起こりません。 その後、閾値を超えた場合、ntpdはシステムログへのメッセージとともに終了します。 このオプションは、-qおよび-xオプションと一緒に使用することができます。 他のオプションについては、tinkerコマンドを参照してください。 -i jaildir サーバをjaildirディレクトリにchrootする このオプションは、サーバが起動時にルート権限を落とそうとすることを意味し(さもなければ、chrootはほとんど追加のセキュリティを与えません)、OSが完全なルート権限なしでサーバを動かすことをサポートしている場合にのみ利用可能です。 また、-u オプションを指定する必要がある場合もあります。 -I iface インターフェース上でリッスンします。 このオプションは回数に制限なく指定できます。 -k keyfile 共通鍵のファイル名とパスを指定します。 コンフィグレーションコマンドkeys keyfileと同じ操作になります。 -l logfile ログファイルの名前とパスを指定します。 デフォルトは、システム・ログ・ファイルです。 logfile logfileconfigurationコマンドと同じ操作です。 -L 仮想 IP をリッスンしない。 デフォルトはリッスンします。 -m メモリーをロックします。 -n フォークしない。 -N OSが許す範囲で、最高の優先度でntpdを実行します。 -p pidfile ntpdのプロセスIDを記録するために使用されるファイルの名前とパスを指定します。 これは、pidfile pidfileconfiguration コマンドと同じ操作です。 -P priority オペレーティングシステムが許可する範囲で、指定した優先度で ntpd を実行します。 -q 時計が最初に設定された直後に ntpd を終了します。 この動作は、引退させる ntpdate プログラムの動作を模倣しています。 g と -x オプションは、このオプションと一緒に使うことができます。 注意: このオプションを指定すると、カーネルの時間規律は無効になります。 -r broadcastdelay ブロードキャスト/マルチキャストサーバからこのクライアントへの既定の伝搬遅延を指定し ます。 これは、遅延がプロトコルによって自動的に計算されない場合にのみ必要です。 -s statsdir 統計機能によって作成されるファイルのディレクトリ・パスを指定します。 これは、statsdir statsdir 構成コマンドと同じ操作です。 -t key 信頼できる鍵のリストに鍵番号を追加します。 このオプションは複数回指定することができます。 -u user 切り替えるユーザーを指定し、オプションでグループを指定します。 このオプションは、OSが完全なルート権限なしでサーバを実行することをサポートしている場合にのみ使用できます。現在、このオプションは、NetBSD (–enable-clockctl で設定) および Linux (–enable-linuxcaps で設定) でサポートされています。 -U interface update interval ネットワークインターフェースの新規および削除を行うために、 インターフェースリストのスキャンを行う間隔を何秒にするか。 デフォルトでは、5分ごとにスキャンします。 -v 変数-V 変数 デフォルトでリストされているシステム変数を追加します。 -x 通常、オフセットがステップの閾値 (デフォルトでは128ミリ秒) よりも小さい場合は時間をスルーし、閾値より大きい場合はステップします。 このオプションは閾値を600秒に設定し、手動でクロックを設定する際の精度ウィンドウに十分収まるようにします。 注意: 典型的な Unix カーネルのスルーレートは 0.5ms/s に制限されているため、1 秒の調整には 2000s の償却間隔が必要です。 他のオプションについては、tinkerコマンドを参照してください。 注意:このオプションを指定すると、カーネル時間規律は無効になります。
設定ファイル
通常、ntpd は起動時に ntp.conf 設定ファイルを読み、同期元と動作モードを決定します。また、設定ファイルを必要としないように、制限付きですが、コマンドラインから動作する設定を指定することも可能です。 これは、ローカルホストがブロードキャスト/マルチキャストクライアントとして設定され、すべてのピアが実行時にブロードキャストを聞くことによって決定される場合に特に有用です。
通常、設定ファイルは /etc ディレクトリにインストールされますが、他の場所にインストールすることもできます (-c conffile コマンドラインオプションを参照)。 コメントは # 文字で始まり行末まで続き、空白行は無視されます。
設定コマンドは、最初のキーワードと空白で区切られた引数のリスト (一部はオプション) で構成されます。 コマンドは複数行に渡って継続することはできません。 引数には,ホスト名,ドット付き4進数で書かれたホストアドレス,整数,浮動小数点数(秒単位で時間を指定する場合),テキスト文字列を指定できます。 以下の説明では、オプションの引数は | で区切られ、選択肢は | の前の最後の項目のオプションの不定の繰り返しを意味する。
Exit Codes
0 以外の終了コードはエラーを示す。 エラーメッセージはすべてデフォルトでシステムログに記録されます。
終了コードが 0 になるのは、ntpd がシグナルによって終了したとき、または -q オプションが使用されていて ntpd がシステムクロックの設定に成功したときだけです。
See Also
ntp.conf(5), ntpq(8), ntpdc(8)