"/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ルールがシステムクロック設定を処理するように変更すると、最初の起動時に誤ったタイムスタンプを持つメッセージが記録される可能性があるため、ログを読み取るときにこの点に注意する必要があります。