質問に答える

質問に答える

何人かの人々に非常に奇妙な影響を与えることを調査していますビーグルボーンブラック(BBB)マザーボード。時々、システムクロックが数ヶ月ずつジャンプするのがわかります。これは常にシステムクロックの更新systemd-timesyncdに関連しています。私たちは、さまざまな場所にある2,000のデバイスで週に2〜3回この現象を確認します。

SNTPを確認するのに多くの時間を費やしましたが、正常に動作しているようです。

我々は、最終的に電子ノイズによってランダムに131072秒(36時間)ジャンプすることができるオンボードリアルタイムクロックのハードウェア問題を発見しました。これはすぐに正確ではありません。報告された時間ジャンプは非常に具体的であり、私たちが観察したものよりはるかにまれです。質問をより深く読むと、ジャンプがよりランダムである可能性があることがわかります。たぶん逆さまです。

私の質問は…Linuxはシステムクロックを維持するためにリアルタイムクロックをどのように使用しますか?

リアルタイムクロックエラーは、時刻同期エージェント(ntpdまたはsystemd-timesyncd)が更新されたときにシステムクロックにのみ表示されるかどうか疑問に思います。システムクロックとRTCの間に直接リンクがありますか、それともエージェントでのみ使用されますか?


メモ:最初の段落では、私はシステム時計が数ヶ月ずつジャンプするのを見ることができると述べました。これは常にシステムsystemd-timesyncd時計の更新に関連しています。つまり、タイムジャンプ後の最初のsyslogメッセージはTime has been changedsyslogメッセージです。

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 changedsyslogメッセージです。

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

おすすめ記事