web-dev-qa-db-ja.com

システムクロックは自動的にハードウェアクロックに同期しますか?

ハードウェアクロックは単純なクォーツクロックに基づいており、時間の経過とともに同期が外れることはわかっていますが、システム時間はCPUクロックに基づいており、結果として非常に正確です。

私はNTPを使用できる環境にいないので、システムクロック自動的にドリフトしないようにハードウェアクロックに同期しますか?

そうでない場合は、cronジョブをセットアップするか、hwclockを呼び出してハードウェアクロックに同期する必要があります。すべてがUTCに設定されているため、心配する必要はありません。

1
N Jones

このページ が最良の答えを提供すると思います:

2. Linuxが時間を追跡する方法

2.1基本戦略

Linuxシステムには実際には2つのクロックがあります。1つは、システムの電源が切れたときに時間を追跡するバッテリー駆動の「リアルタイムクロック」(「RTC」、「CMOSクロック」、または「ハードウェアクロック」とも呼ばれます)ですシステムの実行中は使用されません。もう1つは、タイマー割り込みに基づくソフトウェアカウンターである「システムクロック」(「カーネルクロック」または「ソフトウェアクロック」とも呼ばれます)です。システムが実行されていないときには存在しないため、ブート時にRTC(または他のタイムソース)から初期化する必要があります。 ntpdドキュメントの「クロック」への言及は、RTCではなくシステムクロックを指します。

2つのクロックは異なるレートでドリフトするため、徐々にずれて、「リアルタイム」からも離れます。それらを時間通りに保つ最も簡単な方法は、ドリフト率を測定し、ソフトウェアで補正係数を適用することです。 RTCはシステムが実行されていないときにのみ使用されるため、clock(8)またはhwclock(8)を使用して、ブート時にクロックが読み取られるときに修正係数が適用されます。システムクロックは、adjtimex(8)を使用して、各タイマー割り込みでシステム時間が進む速度を調整することにより修正されます。

Adjtimex(8)に代わる粗い代替方法は、chron(run)clock(8)またはhwclock(8)を定期的に使用して、システム時刻を(修正された)RTCに同期させることです。これはclock(8)のマニュアルページで推奨されており、システム時間で大きな「ジャンプ」を引き起こさない程度に頻繁に行うと機能しますが、adjtimex(8)はよりエレガントなソリューションです。一部のアプリケーションでは、時間が逆に進むと文句を言う場合があります。

精度を高める次のステップは、ntpdなどのプログラムを使用して、ネットワークタイムサーバーまたはラジオクロックから定期的に時刻を読み取り、システムクロックのレートを継続的に調整して、時刻が突然「ジャンプ」することなく常に一致するようにすることですシステム時刻。起動時に常にネットワーク接続がある場合は、RTCを完全に無視し、ntpdate(ntpdパッケージに付属)を使用して、タイムサーバーからシステムクロックを初期化できます。 LAN、またはインターネット上のリモートサーバー。ただし、ネットワーク接続がない場合や、ネットワークがアクティブになる前の起動シーケンス中に正確な時間が必要な場合は、RTCの時間も維持する必要があります。

2