Armadilloフォーラム

再起動時のRTC設定ズレについて

nakata

2024年7月22日 15時25分

電源断時のArmadillo-iot G3L再起動時、RTCの値はどの様になるでしょうか。
・バックアップ電池は無し
・通常動作時は起動してからNTPでの時刻同期を行う

実際に見られた現象として、通常動作時の時刻から、再起動時に約7日分の日にちがずれていました。(過去に戻った)

電源断による再起動時にはRTCが初期化されると考えていましたが、中途半端な日にちであったため、起こりうることなのか否かのコメントをいただきたく。
よろしくお願いします。

ファイル ファイルの説明
データ欠損時.png 動作ログの写しです
コメント

nakata

2024年7月23日 10時34分

お世話になります。
その後調べていると、RTC情報がeMMCメモリに保存され、それが参照されることがあるようである、と確認しました。
LTE通信停止(不具合で停止してしまっている)かつ電源断での再起動時、eMMCメモリに保存されている古いRTC値(LTE通信があった時)を参照したために、時間が遡って設定されてしまったのかと想像しています。
電源断からの再起動時には、RTC値はリセットせずにeMMCメモリ保存値を読むということで認識はあっていますでしょうか。

at_dominique.m…

2024年7月23日 10時58分

nakataさん

お世話になっています、
マルティネです。

Armadillo G3L のデフォルトでは systemd-timesyncd が有効になっていて、そのサービスが eMMC の /var/lib/systemd/timesync/clock に定期的に時刻を記載していて、ネットワーク接続がなくても起動時に RTC の時間がその時刻より古い場合にその時刻を使います。
また、このファイルがない場合(overlayfs での運用など)に systemd のビルドした時刻を同じく使います。

その後は通常にネットワークに接続できていれば NTP で正しい時刻を取得して時間を再び直しますので、そういう起動の場合のログでは三つの時刻が記載されます:
- RTC 空の状態で 1970年の時刻
- systemd-timesyncd が eMMC に記載した時刻に更新
- ネットワークからの更新の時間に再び切り替える

ちなみにバックアップ電池を搭載しなくても10秒程度の電源断でしたらコンデンサで RTC を維持していますので、短い電源断でしたら RTC の時間が正しいままになります。

よろしくお願いします。

nakata

2024年7月23日 11時25分

マルティネさん
ご説明ありがとうございます。
動作について分かりました。
ちなみに定期的に時刻を記載とのことですが、この定期的が時間は決められているのでしょうか。
もしくは設定かのうですか?設定されていない場合のデフォルト値も教えていただけますと幸いです。

at_dominique.m…

2024年7月23日 12時11分

> ちなみに定期的に時刻を記載とのことですが、この定期的が時間は決められているのでしょうか。
> もしくは設定かのうですか?設定されていない場合のデフォルト値も教えていただけますと幸いです。

systemd 250 以降では /etc/systemd/timesyncd.conf の SaveIntervalSec 値で設定できます。デフォルトの値は 60秒です。
https://www.man7.org/linux/man-pages/man5/timesyncd.conf.5.html
Armadillo IoT G3L に debian Bookworm を使っていただいてる場合は使いますが、Buster や Stretch版ではまだ設定ありませんでした。

Buster や Stretch の場合は 60秒間隔でもなく、時刻を更新する度にファイルを保存しているようです。
「timedatectl timesync-status」の「Poll interval」の値になります(手元の Armadillo では最大34分と出力されてます)
新しい開発でしたらどのみち Bookworm を推奨していますので、重要な情報でしたらそちらを使ってください。

以下は確認(strace -tt -e %file の一部の出力。起動直後の間隔が短いですが、どんどん長くなります)

[pid   328] 11:53:44.851783 openat(AT_FDCWD, "/var/lib/systemd/timesync/clock", O_RDONLY|O_LARGEFILE|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 16
[pid   328] 11:54:49.102370 openat(AT_FDCWD, "/var/lib/systemd/timesync/clock", O_RDONLY|O_LARGEFILE|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 16
[pid   328] 11:56:57.351681 openat(AT_FDCWD, "/var/lib/systemd/timesync/clock", O_RDONLY|O_LARGEFILE|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 16
[pid   328] 12:01:45.851179 openat(AT_FDCWD, "/var/lib/systemd/timesync/clock", O_RDONLY|O_LARGEFILE|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 16
[pid   328] 12:10:18.102841 openat(AT_FDCWD, "/var/lib/systemd/timesync/clock", O_RDONLY|O_LARGEFILE|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 16

よろしくお願いします。