Armadilloフォーラム

RTCのハード故障時の挙動について

masaya_yoshitomi

2022年11月28日 18時55分

お世話になっております。
吉冨です。

SIMを用いたLTE通信を想定したシステムを考えております。
NTPサーバに接続したタイミングでシステムクロック→ハードウェアクロックを時刻更新するような動きとなる前提での質問です。
RTCがハード的に故障していた場合システムクロックとハードウェアクロックとが非同期になるとは思いますが、NTPサーバに接続できておりシステムクロックのみが更新可能な状態であればLinuxシステム上は動作可能でしょうか?
またRTCの故障を検出するためのコマンドなどありますでしょうか?

ご教示お願いいたします。

コメント

古関です。

> RTCがハード的に故障していた場合システムクロックとハードウェアクロックとが非同期になるとは思いますが、
> NTPサーバに接続できておりシステムクロックのみが更新可能な状態であればLinuxシステム上は動作可能でしょうか?

RTCだけがハード的に故障して他には何も故障が無いという前提ですと、
NTPサーバーからも時刻取得できていないときに
保存したログやファイルのタイムスタンプがズレますがLinuxとしては動作します。

ただ、あまりこの状態になるケースはないと考えています。

Armadillo-IoT G3では一般的なRTCのICを搭載しているわけではなく、
独自のBMIC( Board Management IC)内に電源管理など様々な機能を搭載し、RTCはその中の一機能です。

基板全体の中で、BMICだけがピンポイントで故障し、
かつその一機能のRTCだけピンポイントで壊れるという症状はまず起きないと考えています。

仮に、RTCの機能が故障している場合、BMIC全体が故障している可能性が極めて高く
そもそも製品が起動しないという症状になると考えています。

> またRTCの故障を検出するためのコマンドなどありますでしょうか?
何をもって故障とするかが難しいのですが、
hwclockコマンドを実行して、エラーになった場合に故障とみなすのはいかがでしょうか。
※ RTCだけが壊れて起動する状態じゃないとできませんが。。

また、あまりないと思いますが、例えばRTCから時刻は取得できるとけど、
時間がおかしいなどの症状の故障が出た場合は判断が難しいです。
(ありえないような時刻の場合NGという判断はできそうです)

よろしくお願いいたします。

横からすみません。間違ってたらごめんなさい。
質問にあんま関係無い話ですが。

> RTCがハード的に故障していた場合システムクロックとハードウェアクロックとが非同期になるとは思いますが、
故障していても居なくても非同期じゃないでしょうか。
UNIX/LinuxはCPUクロック(に連動するタイマーの定期割り込み)の数を数えて時刻日時を作っています。
RTCがある場合は、起動時のシステムクロックをRTCで初期化するだけで、それ以降はRTCとは関係なくOSのシステムクロックは進行するのでは?

あと一つ疑問なのは、
RTCがあるけど故障している場合は、壊れたRTCの値を読み取って変な日時にしちゃうとか可能性があるような気がします。

> NTPサーバに接続できておりシステムクロックのみが更新可能な状態であればLinuxシステム上は動作可能でしょうか?

ご存じとは思いますが念のため:
NTPは時刻の微調整しかしないので大幅な時刻差(確か1000秒以上)があると同期しません(日時が飛ぶような変更はしない)。最初に1回ntpdateコマンド等で日時あわせをして、それいこうのズレをntpデーモンに修正してもらうという手順になろうかと思います。

アットマークテクノの古賀です。

saitohさん:
>横からすみません。間違ってたらごめんなさい。
>質問にあんま関係無い話ですが。
>
>>RTCがハード的に故障していた場合システムクロックとハードウェアクロックとが非同期になるとは思いますが、
>故障していても居なくても非同期じゃないでしょうか。
>UNIX/LinuxはCPUクロック(に連動するタイマーの定期割り込み)の数を数えて時刻日時を作っています。
>RTCがある場合は、起動時のシステムクロックをRTCで初期化するだけで、それ以降はRTCとは関係なくOSのシステムクロックは進行するのでは?

そうですね。

>あと一つ疑問なのは、
>RTCがあるけど故障している場合は、壊れたRTCの値を読み取って変な日時にしちゃうとか可能性があるような気がします。

RTC から読んだ日時が異常な場合(日時として整合していない場合)は、無効な値として無視され、システム日時の初期値が使われると思います。この質問スレッドの対象製品 Armadillo-IoT G3 の場合は、init として systemd が動いており、systemd は、直近で NTP サーバから取得した日時があれば、それを記録しておいて初期値として使うと思います。

Armadillo-IoT G3 の初期日時については、こちらの弊社 Blog で説明しています:
 https://armadillo.atmark-techno.com/blog/10900/8012
また、フォーラムの、この質問スレッドでも話題に上がりました:
 https://armadillo.atmark-techno.com/forum/armadillo/10248