Armadilloフォーラム

ハードウェアウォッチドッグタイマ発動後による再起動を確認する方法

eqc_1101

2023年3月23日 10時55分

いつもお世話になっております。
Armadillo-IoT G3L にてハードウェアウォッチドッグの使用を行っており、
/dev/watchdogへのアクセスでタイムアウトによるリブートが発生することまでは確認できました。
 ⇒「echo > /dev/watchdog」をコマンド実行後、何もしないと10秒後リブート
 ⇒「echo > /dev/watchdog」をコマンド実行後、10秒以内に定周期でコマンド実行するとリブートされない

今検討しているのは、ユーザーアプリケーションでも別途リブートする処理を実装しているため、
再起動の要因を判別したく考えております。

①ユーザーアプリケーションによる再起動
②ハードウェアウォッチドッグタイマーによる再起動

①については、作成するユーザーアプリケーションにて判断できるため問題ないのですが、
②についてはどう判断すべきか分かりません。

自前で、①以外の場合は②と判断する、といった方法以外に、何か方法があればご教授頂けると幸いです。
(可能であれば、カーネルコンフィグレーション変更やカーネルコード変更等、
 カーネルビルドによるインストールディスクの再作成を伴わない方法が望ましいです。(遠隔地のArmadillo更新があるため)
 例:再起動後、あるファイルを見れば分かる/あるコマンドを実行すれば分かる等)

使用環境(他に必要があればご指示ください):
Linux 4.9.133-at25

参考フォーラム:
https://armadillo.atmark-techno.com/forum/armadillo/4228
(似た問い合わせでしたが、製品がArmadillo-800シリーズだったため異なるかなと思っております)

よろしくお願いします。

コメント

溝渕です。

> 今検討しているのは、ユーザーアプリケーションでも別途リブートする処理を実装しているため、
> 再起動の要因を判別したく考えております。
>
> ①ユーザーアプリケーションによる再起動
> ②ハードウェアウォッチドッグタイマーによる再起動
>
> ①については、作成するユーザーアプリケーションにて判断できるため問題ないのですが、
> ②についてはどう判断すべきか分かりません。

前提として、i.MXの実装では再起動は全てハードウェアウォッチドッグタイマーによるリセットが入ります。その為、リセット後では再起動の要因を把握することはできません。

なので、アプリケーションでリセット前にログを残すする必要があります。

起動要因については、次のように確認できると思います。

[armadillo]# i2cget -y 3 0x17 0x02 b
0: 電源投入での起動
1: ハードウェアウォッチドッグタイマーによる再起動

回答ありがとうございます。
アプリケーションでリセット前にログを残す方向で考えたとして、追加で確認させてください。


ハードウェアウォッチドッグタイマーのタイムアウトを事前に検出するのは
難しいのではと考えましたが、過去事例でもよいので何か案がございましたらご教示願います。


①が難しい場合、カーネルコンフィグレーション変更必須の認識ですが、
ソフトウェアウォッチドッグタイマーであれば再起動要因の特定は可能でしょうか?
(例えばご教示いただいたi2cgetのようなコマンドで再起動後に判別可能、等)


②も不可であるならば、ソフトウェアウォッチドッグタイマーであれば
リセット前にログを残すことは可能でしょうか?
例えば参考フォーラムには別製品ですがカーネルソース(?)にログ出力を
追記することで判別可能になるのでは、といった記述がありました。

①で解決できるのがよいと考えますが、②③についても
ご確認いただけますと幸いです。

よろしくお願いします。

溝渕です。

> ①
> ハードウェアウォッチドッグタイマーのタイムアウトを事前に検出するのは
> 難しいのではと考えましたが、過去事例でもよいので何か案がございましたらご教示願います。

ハードウェアウォッチドッグタイマーがタイムアウトするという事は、ソフトウェアが正常に動作していないという事です。その為、(正常に動作していない)ソフトウェアでタイムアウトを検出するのは厳しいと思います。

> ②
> ①が難しい場合、カーネルコンフィグレーション変更必須の認識ですが、
> ソフトウェアウォッチドッグタイマーであれば再起動要因の特定は可能でしょうか?
> (例えばご教示いただいたi2cgetのようなコマンドで再起動後に判別可能、等)

再起動要因は何が挙げられますか?

また、Linux起動パラメータに、
"soft_noboot=1"
を追加すると、ソフトウェアウォッチドッグタイマーがタイムアウトしても再起動しないようになります。このときにログを残して再起動する等で判別できませんか?

> ③
> ②も不可であるならば、ソフトウェアウォッチドッグタイマーであれば
> リセット前にログを残すことは可能でしょうか?
> 例えば参考フォーラムには別製品ですがカーネルソース(?)にログ出力を
> 追記することで判別可能になるのでは、といった記述がありました。

ソフトウェアウォッチドッグタイマーで再起動した場合、以下のようなログが出力されると思いますが、
https://armadillo.atmark-techno.com/blog/53/1319
再起動後に/var/log/等からこのログを確認できますか?

①:
>ハードウェアウォッチドッグタイマーがタイムアウトするという事は、ソフトウェアが正常に動作していないという事です。
>その為、(正常に動作していない)ソフトウェアでタイムアウトを検出するのは厳しいと思います。
承知しました、同様の認識です。

②:
>再起動要因は何が挙げられますか?
ユーザーアプリケーションが正常動作しなくなったことを
ソフトウェアウォッチドッグで監視して再起動したく。
ユーザーアプリケーション内でソフトウェアウォッチドッグ(/dev/watchdogX)を
定周期で書き込みます。そのため、書き込まれない⇒異常状態⇒再起動、の考えです。

③:
ご案内ありがとうございます。
出力されるログは、
「SoftDog: Initiating system reboot.」
の1行の認識で相違ないでしょうか?
また、出力ファイルはsyslogでしょうか、kern.logでしょうか?

よろしくお願いします。

溝渕です。

> ③:
> ご案内ありがとうございます。
> 出力されるログは、
> 「SoftDog: Initiating system reboot.」
> の1行の認識で相違ないでしょうか?
> また、出力ファイルはsyslogでしょうか、kern.logでしょうか?

kern.logに出ると思いますが、出ませんか?

どのような意図でご質問いたいているかを教えていただけるとアドバイスしやすいです。

言葉足らず、失礼いたしました。

意図はソフトウェアウォッチドッグタイマーにより再起動されたのかを確認したいためです。
(ユーザーアプリケーション停止した場合の再起動、これの動作試験の結果を確認したい)

前段のやり取りで、ハードウェアウォッチドッグタイマーの場合は、
ログ出力もされず、起動後のコマンド等でも判断できない回答だったので、
ウォッチドッグタイマーによる再起動判別ができないと判断しました。
では、ソフトウェアウォッチドッグタイマーなら可能なのか、といった質問です。

結論、ソフトウェアウォッチドッグなら再起動時に、
「SoftDog: Initiating system reboot.」
のログが、kern.logに出力されるので、ログファイルを見れば確認可能、
という認識でよろしいでしょうか?
(当方まだ確認しておらず出力されるか否かの知りたく)

よろしくお願いします。

溝渕です。

ご説明いただきありがとうございます。

> 結論、ソフトウェアウォッチドッグなら再起動時に、
> 「SoftDog: Initiating system reboot.」
> のログが、kern.logに出力されるので、ログファイルを見れば確認可能、
> という認識でよろしいでしょうか?
> (当方まだ確認しておらず出力されるか否かの知りたく)

Linuxカーネルソースを確認してみましたが、critical levelの"SoftDog: Initiating system reboot."ログが出力されます。その後、すぐにresetされるので、loggerが拾う時間が無いように思います。

目的はアプリケーションの死活監視だと思いますので、アプリケーション内の起動と終了時にloggerにメッセージを投げると、判断できませんでしょうか?

例えば、このような判断はどうでしょうか?

Mar 24 13:50:55 [HOSTNAME] user-app[PID]: start
Mar 24 13:51:14 [HOSTNAME] user-app[PID]: stop //正常終了したと判断できる
Mar 24 13:51:42 [HOSTNAME] user-app[PID]: start
Mar 24 13:53:05 [HOSTNAME] user-app[PID]: start //終了せずに再度開始しているので、直前に異常終了したと判断できる

お返事が遅くなり申し訳ございません。
回答ありがとうございます。

対象ログが出力されるよう実装されているがloggerが拾えないと思う為、
実質kern.logには記録されない、ということで承知しました。
以上となります。

溝渕です。

> 対象ログが出力されるよう実装されているがloggerが拾えないと思う為、
> 実質kern.logには記録されない、ということで承知しました。

ちなみにですが、上記のような状況を救う為に、Kdumpという仕組みがあります。
https://armadillo.atmark-techno.com/forum/armadillo/13490

要件に合致するようでしたら利用してみてください。

>ちなみにですが、上記のような状況を救う為に、Kdumpという仕組みがあります。
存じておりませんでした。

内容を確認して検討してみます。
ありがとうございます。