何人かの人々に非常に奇妙な影響を与えることを調査していますビーグルボーンブラック(BBB)マザーボード。時々、システムクロックが数ヶ月ずつジャンプするのがわかります。これは常にシステムクロックの更新systemd-timesyncd
に関連しています。私たちは、さまざまな場所にある2,000のデバイスで週に2〜3回この現象を確認します。
SNTPを確認するのに多くの時間を費やしましたが、正常に動作しているようです。
我々は、最終的に電子ノイズによってランダムに131072秒(36時間)ジャンプすることができるオンボードリアルタイムクロックのハードウェア問題を発見しました。これはすぐに正確ではありません。報告された時間ジャンプは非常に具体的であり、私たちが観察したものよりはるかにまれです。質問をより深く読むと、ジャンプがよりランダムである可能性があることがわかります。たぶん逆さまです。
私の質問は…Linuxはシステムクロックを維持するためにリアルタイムクロックをどのように使用しますか??
リアルタイムクロックエラーは、時刻同期エージェント(ntpdまたはsystemd-timesyncd)が更新されたときにシステムクロックにのみ表示されるかどうか疑問に思います。システムクロックとRTCの間に直接リンクがありますか、それともエージェントでのみ使用されますか?
メモ:最初の段落では、私はシステム時計が数ヶ月ずつジャンプするのを見ることができると述べました。これは常にシステムsystemd-timesyncd
時計の更新に関連しています。つまり、タイムジャンプ後の最初のsyslogメッセージはTime has been changed
syslogメッセージです。
grep 'Time has been changed' /var/log/syslog
Oct 2 23:53:33 hostname systemd[1]: Time has been changed
Nov 21 00:07:05 hostname systemd[1]: Time has been changed
Nov 21 00:05:17 hostname systemd[1]: Time has been changed
Nov 21 00:03:29 hostname systemd[1]: Time has been changed
Nov 21 00:01:43 hostname systemd[1]: Time has been changed
Oct 3 02:07:20 hostname systemd[1]: Time has been changed
Oct 3 06:37:04 hostname systemd[1]: Time has been changed
私が知る限り、これらのメッセージをエクスポートする唯一のものはsystemd-timesycnd(ソースコードを見る)。明らかに、他の人がsystemd
それに一致する他の一般的なsyslogメッセージを知っている場合は、提案に開いています。
ベストアンサー1
タイトルを含むこれらのポイントのいくつかを反映することができます。
[...] これは常に
systemd-timesyncd
システムクロックの更新に関連しています。つまり、タイムジャンプ後の最初のsyslogメッセージはTime has been changed
syslogメッセージです。grep 'Time has been changed' /var/log/syslog Oct 2 23:53:33 hostname systemd[1]: Time has been changed
実際、このメッセージは、どのプログラムが時間ジャンプを引き起こしたかを知らせません。これは時間ジャンプの症状にすぎません。
systemd
これは、カーネルにクロックが変更されたというメッセージが渡されると発生します。 [*]systemd
システムログにこのメッセージを記録し、デバイスを.timer
起動する必要があるタイミングを再計算して応答します。
メッセージsystemd
はではなくプログラムによって印刷されますsystemd-timesyncd
。
より具体的には、メッセージプレフィックス "systemd[1]:" はプロセス ID 1 から来たことを示します。 PID 1は特別な「init」プロセスです。 systemdプロジェクトは、systemd
ユーザーサービスを管理するインスタンスと区別するために、これを「システム管理者」とも呼びます。
systemd
システムの起動が完了した後、呼び出されたプログラムは時計を変更しません。
接続されている現在のシステムソースツリーからRTC /ハードウェアクロック/ hwclockを読み取る唯一のプログラムは、timedated
でクエリを実行する場合にのみ可能ですtimedatectl
。
私が覚えているように、systemd
このプログラムの以前のバージョンは、別のプログラムを実行する前に起動時にhwclockを一度読み、それに応じてシステムクロックを設定しました。最新バージョンではsystemd
これは行われません。一部のハッカーだけがカーネルに何を伝えます。タイムゾーンハードウェアクラッキングに使用されます。 (そして「時間歪み」と呼ばれる非常に具体的なものを引き起こさないでください。)
つまり、現在は、systemd
他の何かがシステムクロックを初期化したと暗黙的に仮定しているようです。ほとんどの場合、これはカーネルになります。
カーネルビルドオプション「ブートとリカバリ時にRTCでシステム時間を設定する」を探しますCONFIG_RTC_HCTOSYS
。
完全な理解のために、「NTP同期に基づいてRTC時間を設定する」オプションもあることに注意してくださいCONFIG_RTC_SYSTOHC
。
[*] Linux固有の機能を使用してシステムクロックの変化を検出します。バラよりTFD_TIMER_CANCEL_ON_SET
。