ブログ

Armadillo-IoT G3/X1:システムクロックとハードウェアクロックの動作

at_yukari.hara
2020年11月13日 17時17分

Linux の時刻には、Linux カーネルが管理するシステムクロックと、RTC が管理するハードウェアクロックの 2 種類があります。
Linux システムでは、システムクロックがすべての動作の基準となります。
※時刻を正確に保つ最も信頼性の高い方法はNTP(Network Time Protocol)を使用することですが、当ブログではNTPを使用せずに、時刻を保持する場合の動作を記載しております。

それでは、システムクロックとハードウェアクロックの関係性と、
システムの構築方法によって時刻が保持される基準の違いを確認してみましょう。

システムクロックとハードウェアクロックの関係性と時刻が保持される基準

1.システムクロックのみ時刻を設定した場合

Linuxカーネルが管理するシステムクロックのみ時刻を設定した場合は、Armadilloを再起動するまで時刻は保持されます。
Armadilloを再起動すると、初期設定の時刻にリセットされます。

Armadilloの状態 システムクロック ハードウェアクロック
起動時 systemdがビルドされた時刻 1970年1月1日
システムクロック設定時 2020年11月13日 1970年1月1日
再起動時 systemdがビルドされた時刻 1970年1月1日
電源断時 systemdがビルドされた時刻 1970年1月1日

2.システムクロックとハードウェアクロックの時刻を設定した場合

Linuxカーネルが管理するシステムクロックと、RTCが管理するハードウェアクロックの時刻を設定した場合は、
Armadilloへの電源供給が断たれるまで時刻は保持されます。
Armadilloを再起動すると、システムクロックはハードウェアクロックの時刻を参照して設定します。
※システム起動時に、ハードウェアクロックの値より"/var/lib/systemd/clock"のタイムスタンプの値のほうが新しい場合は、その値にシステムクロックが設定されますのでご注意ください。

Armadilloの状態 システムクロック ハードウェアクロック
起動時 systemdがビルドされた時刻 1970年1月1日
システムクロックと
ハードウェアクロック設定時
2020年11月13日 2020年11月13日
(システムクロック→ハードウェアクロック)
再起動時 2020年11月13日
(ハードウェアクロック→システムクロック)
2020年11月13日
電源断時 systemdがビルドされた時刻 1970年1月1日

3.システムクロックとハードウェアクロックの時刻を設定し、RTC用外部バッテリーを接続した場合

Linuxカーネルが管理するシステムクロックと、RTCが管理するハードウェアクロックの時刻を設定してRTC用外部バッテリーを接続した場合は、 Armadilloの電源が断たれても、時刻が保持されます。

Armadilloの状態 システムクロック ハードウェアクロック
起動時 systemdがビルドされた時刻 1970年1月1日
システムクロックと
ハードウェアクロック設定時
2020年11月13日 2020年11月13日
(システムクロック→ハードウェアクロック)
再起動時 2020年11月13日
(ハードウェアクロック→システムクロック)
2020年11月13日
電源断時 2020年11月13日
(ハードウェアクロック→システムクロック)
2020年11月13日

【参考情報】時刻のズレが生じた際に確認すること

(1)システムクロックの設定、ハードウェアクロックへの反映は行いましたか?

Armadilloの時刻の設定方法はマニュアルをご確認ください。

Armadillo-IoT G3 Armadillo-IoTゲートウェイ G3 製品マニュアル

6.5.1. RTCに時刻を設定する

Armadillo-X1 製品マニュアル

6.5.1. RTCに時刻を設定する

(2)RTC用外部バッテリーは接続していますか?

RTC用外部バッテリーが接続されていない状態でArmadilloの電源断が発生すると、ハードウェアクロックが初期化されます。
電源断が発生した場合も時刻を保持したい場合は、RTC用外部バッテリーを接続する必要がございます。

(3)RTC用外部バッテリーの電圧値は2.4V以上でていますか?

詳細はマニュアルの「推奨動作条件」をご確認ください。

Armadillo-IoTゲートウェイ G3 製品マニュアル

16.2. 推奨動作条件

Armadillo-X1 製品マニュアル

15.2. 推奨動作条件

(4)NTP サーバーから時刻を取得したことがありますか?

システムの起動時に、ハードウェアクロックの値よりも NTP サーバーから取得した時刻が反映される「/var/lib/systemd/clock」のタイムスタンプの値のほうが新しい場合は、そちらの値にシステムクロックが設定されるようになっております。
また、「/var/lib/systemd/clock」のタイムスタンプが無い、または時刻の反映が無効化されている場合は、
"systemd" がビルドされた時刻とハードウェアクロックの時刻を比べて新しいほうがシステムクロックに設定されます。

(5)BMICボード情報はv2.5以降をご利用でしょうか?

RTCバックアップインターフェースに外部バッテリーを接続した状態、かつSoC(i.MX7 Dual)からBMICにi2cアクセス中に、電源入力インターフェースから電源供給を切断したときに、まれに時刻が保持できない現象が発生する可能性がございます。
詳細はArmadillo ソフトウェア不具合のお知らせ (Armadillo-X1対象) RTCバックアップインターフェースに接続した外部バッテリーが、ごく稀に想定より早く消費される不具合をご参照ください。