udev:hwclockの設定に失敗しましたか?

udev:hwclockの設定に失敗しましたか?

"/usr/lib/udev/hwclock-set"にファイルがあります。

RTCで正しい日付/時刻を設定する必要がありますが、問題があります。

if [ -e /run/systemd/system ] ; then
    exit 0
fi
/shin/hwclock ....

udevがhwclockルールを実行すると、上記のフォルダがすでに存在するため、システム時間を設定せずにスクリプトが終了します。

この条件の後に隠されたアイデアは何ですか?

また、udevルールとsystemdサービスがこのスクリプトを介してシステム時間を設定するのを防ぎます。

私を狂わせてください。この障害を処理できるudevルールやシステムサービスはありません。

追加2: "exit"のコメントを外してudevルールがこのスクリプトを実行しようとすると、すべての "hwclock"呼び出しは1(エラー)を返します。

このスクリプトを手動で実行すると(コメントなしの「exit」を使用)、時間が正しく設定されます。

答え1

現代的なsystemd-udevd操作

CapabilityBoundingSet=~CAP_SYS_TIME CAP_WAKE_ALARM

サービスファイルに。これは、udevルールによって開始されたプロセスを意味します。システム時間を操作できません。これは、関数が子プロセスCAP_SYS_TIMEから除外されたためです。udevd

一方、systemdブートプロセスの初期(デフォルトではブート時)systemdの(最初の)RTCでシステムクロック設定を独自に処理する必要があります。これを成功させるには、ハードウェアRTCドライバをモジュールではなくカーネルに組み込む必要があります。

あるいは、ハードウェアに複数のRTCがある場合は、システム時に必要なRTCドライバを組み込む必要があり、他のドライバはロード可能なモジュールである必要があります。これにより、正しいRTCが検出されるようにする必要があります。これは明らかにシステム時間を設定するrtc0ために自動的に使用されるRTCです。systemd

systemd明らかに、この動作は、ハードウェアに複数のRTCがあり、使用しようとしているRTCが以下のようにカーネルで最初のRTCとして検出されない場合には少し驚くことがあります。最近あなたがいただいたもう一つの質問

もちろん、複数のRTCを含む組み込みシステムを扱い、RTCドライバをモジュールとして必要とする場合は、ファイルudevからその行を削除し、ブロック条件を削除して、サブプロセスがシステム時間を操作できるようにすることが有効です。ファイルから。文書。CapabilityBoundingSet=systemd-udevd.service/usr/lib/udev/hwclock-set

新しい「標準設定」の最大の利点は次のとおりです。すべてのログに正しいタイムスタンプが必要です。一度systemd始めたら、考える必要もありません。適切なRTCドライバモジュールをロードした後にudevルールがシステムクロック設定を処理するように変更すると、最初の起動時に誤ったタイムスタンプを持つメッセージが記録される可能性があるため、ログを読み取るときにこの点に注意する必要があります。

関連情報