Linux学習記 その3 NTPについて学んでみる。
業務に必要な知識のため、冬休みを使って、NTP,NAT・NAPT,APACHE,SMTP,POSTFIX,DNS,BINDについて学んでいこうと思います。
まず第一回、NTPの概要を理解する。
<概論>~NTPとは~
TCP/IPネットワークを通じて時刻の同期を行うために用いるOSI参照モデルの第7階層アプリケーション層に位置するプロトコルであり、UDPポート123番を使用する。
コンピュータ内部の時計を正しく調整するため、タイムサーバ(NTPサーバ)に問い合わせを行う手順が定義されている。
NTPサーバは階層構造になっており、最上位にはGPSや原子時計などが用いられ一般には公開されていないことが多い。
一般的には、この最上位サーバではなく、このサーバから得た情報で時刻同期を行った通信事業者のサーバにアクセスすることが多い。
<NTPサーバの仕組み>
■NTPサーバの構造
上述の通り、NTPは階層構造になっておりStratumで階層を表す。
時報の役目を行う原子時計やGPSが存在する階層をStratum0としStratum1~16まで存在するが、Stratum16は最下層となるため同期の対象にできない(つまり、NTPサーバは15までとなる)。なお、時刻源にあたるStratum0は誤差+-1μ(100万分の1)秒未満で刻んでいる。
NTPでは、精度の高い時刻同期を実現するために上位複数のサーバを取得先の対象とすることが可能である。また、下位NTPサーバからの取得先の対象となることも可能であり、サーバであると同時にクライアントとしての機能も有する。
しかし、NTPの性質として、そのサーバの性能に関わらず小さい数字のStratumが選択されるため、複数対象とする場合は同じStratumにしなければならない。そうでなければ、一つのサーバに接続が集中し精度を落とす要因となりうる。
また、時刻への影響として、Stratumの大きさよりもネットワーク上の距離の方が大きい。つまり、遠くのStratum1より近くのStratum2がより精度が良い。
この他、受信機の信号遅延や、受信機とStratum1との機器間との遅延も無視できない。
■NTPに実装されている補正機能
NTPは以下の機能を用いて時刻の補正を行う。
-
ntpd
クライアントとサーバの機能を有するデーモン。
クライアントとして、上位サーバとの時刻同期および時刻補正を行うことが出来る一方
下位NTPクライアントの時刻同期等の取得先のサーバとしての役割を果たす。
-
ntpdサービス
ntpdをシステム起動時に自動起動させるサービス。サービスの起動には、予め以下のように設定が必要である。
# /sbin/chkconfig --level <ランレベル> ntpd on
-
ntpdateコマンド
主に時刻同期を行うために上位サーバへ参照を行い、上位サーバの時刻と自身のサーバの時刻を合わせる。
ntpdを常駐させることによるセキュリティ・ホールへの懸念がある場合や、任意のタイミングで同期を行いたい場合など有効。
-
ntpdateサービス
ntpdateコマンドをシステム起動時に自動実行し、時刻補正を行うサービス。サービスの起動には、予め以下のように設定が必要である。
# /sbin/chkconfig --level <ランレベル> ntpdate on
※ntpdサービスとntpdateサービスが共に自動起動に設定されている場合、ntpdateサービスの後にntpdサービスが起動される。
■時刻補正の仕組み
ntpdデーモンを使用する場合、上位NTPサーバへの問い合わせは、最初は64秒間隔で行われる。この間隔のことをポーリング間隔という。
同期完了後、 ネットワークのオーバーヘッドを減少させるために、ポーリング間隔を128秒、256秒、512秒、と広げていき、最大で1024秒まで延ばすことができる。
このような補正を行う方法は、2種類ある。
-
step調整
時刻をずれを一気に正常にすることができる。その代わり、時刻の急変に逆進が発生したり、システムに支障を来たす場合がある。
- slew調整
時刻のずれを、1秒間に最大0.5m秒ずつ補正できる。そのため、正常な時刻に戻すには時間がかかる。
クライアントが進んでいる場合は増加分を抑え、遅れている場合は増やす。
■時刻補正の方法
ntpdで時刻同期を取る場合、step調整とslew調整の両方を組み合わせて使用する。
時刻差が1000秒を超過するとモードに関係なく/var/log/messageにメッセージを出力し終了する。
しかし、ntpdateを自動起動にしている場合、NTPサーバ起動時に1000秒を超過していてもまず、ntpdateによりstep調整が行われるためすぐに終了しない。
-
stepモード(デフォルト)
上位サーバとの時刻差が128ミリ秒以内の場合はslew調整を行う。
128ミリ秒を超過した場合は900秒監視を継続し、128ミリ秒を超過した状態からもどらない場合はNTPサーバとの同期をはずし、step調整を行う。step調整では最低5回の問い合わせにより同期する。
(同期に要する時間は、ポーリング間隔やその他条件により変動する)
-
slewモード(-xオプション)
上位サーバとの時刻差が600秒いないの場合はslew調整を行い、600秒を超過する場合はstep調整を行う。
■ドリフトの修正
NTPでは、時刻の校正だけでなく、時刻の進み具合や遅れ具合の度合いを調整する必要がある。この度合いのことをドリフトという。
一般的に、コンピュータの内部の時計には、ハードウェアに搭載されRTCをそのまま利用する場合と、割り込みなどによりソフトウェアで進める場合がある。
いずれの場合も、設計の段階で1ppm以上の誤差(10日で1秒程度)があるため、他のNTPサーバと比較を行い、そのドリフトを修正する必要がある。
■時刻同期の際の注意
システムの中には、突然時刻を変更されることにより不具合を来たす機能もあるため、時刻の同期は推奨される間隔で行われるのが理想である。
不具合を来たす機能として、UNIX系に実装されているcronなど日時に併せて自動で実行する系統のものなどが該当する。
■NTPサーバの接続形態
接続形態には2種類ある。
- Client/Server
- Symmetric Active/Passive(Peer)
- は一般的な上位または下位のサーバとの時刻同期を行ったり、下位サーバからの問い合わせに応答する。
- は同じStratum内で基準となるサーバを動的に決定し、同じStratum内でサーバ同士同期を取る。
これにより、同じStratum内での精度の均一化と向上を計れるほか、同じStratum内の他のサーバが上位サーバと通信不全に陥った場合でも他のPeer設定されているサーバと同期を取ることにより精度を維持できる。
注意点として、Peer設定を行う場合、ペアとなるサーバ同士が同じNTPサーバを取得先にしてはならないという条件がある。条件を満たしていない場合、正常に動作しなくなる。
■時間のずれの計算
この計算式では、計算に必要な各要素を以下の様に定義する。
※この計算式は、行きと帰りで時間のずれが等しいことが前提となる。
T1=クライアントの発信時刻
T2=サーバの受信時刻
T3=サーバの発信時刻
T4=クライアントの受信時刻
1.往復時間
クライアントとサーバ間の往復の通信にかかる時間を、クライアントの送信から受信までの所要時間から、サーバの処理時間を引いて割り出す。
1-1.計算式
(T4-T1)-(T2-T3)
1-2.考え方
クライアント軸で送受信に要した合計時間より、サーバの処理時間を引くことで、サーバの処理時間を0としたときの値、つまり単純な往復に要する通信時間を算出することが出来る。
2.クライアントの時間のずれ
サーバの時刻を基準として クライアントのずれを、サーバの送受信時刻を足した値からクライアントの送受信時刻を足した値を引くことにより割り出す。
2-1.計算式
(T2+T3)-(T1+T4)/2
2-2.考え方(オリジナル)
- T2からT1を引くことにより、所要時間(仮)1を割り出す。
- 同じようにT3からT4を引き所要時間(仮)2を割り出す。
※T2,T3から引くのは、サーバが基準なため。
- 所要時間(仮)1と2の和を求める。
最後に2で割るのに和を求めるのは、1と2には時間の不可逆性による差が生じるため、一度それを足す必要があるから。
画像を例にとると、T2-T1は6-0だから6。T3-T4は8-4だから4。差は2。この差の内訳は画像のA(+1),B(-1)となる。なぜ+と-に分かれるのかというと、サーバのT2,T3を基準0とするとT1は過去-1であり、T4は未来+1であるから。つまり、通信に要した時間をクライアント軸で表した値となる。0~1の1と、3~4の1の合計で2となる。
このように、T2T1ペアとT3T4ペアそれぞれの和を求めるだけでは、この性質により正確な値は求められない。
・1と2の和を2で割る。
画像を例に計算すると、6+4=10,10/2=5。つまり、時間のずれは5という値になる。
画像を見れば分かる通り、クライアントが0の時、サーバは5になる。
そして、T2T1ペアとT3T4ペアは両方ともサーバからクライアントの値を引くという同じ性質を持っているため、(T2+T3)-(T1+T4)/2というような計算式になっているものと思われる。
■参考文献
Linux時刻管理の仕組みと設定-@IT自分戦略研究所
http://jibun.atmarkit.co.jp/lskill01/rensai/lpicdrill08/lpicdrill01.html
Red Hut Enterprise Linux 6 ユーザーズマニュアル
http://jp.fujitsu.com/platform/server/primequest/catalog/manual/linux/pdf/J2UL-1337-05Z0.pdf