びぼうろく

北海道の人。適当にもっさりまったり書きます。さくら荘のましろが好きです。アニメとかパソコンとか

Raspberry Pi ZeroにWatchdogを設定する

はじめに

自宅の室温監視用のラズパイが、気がつくと死んでいることが何度かありました。
原因を調べてもよくわからず、とりあえず電源OFF→ONで復帰するので、
それならwatchdogでもつければいいのでは?と思い立ったので、作業のメモ。

Watchdog基板つけなくてもSoCにWatchdog付いてるじゃん

外部watchdogを考えていましたが、RaspberryPi ZeroのSoC(BCM2835)には内蔵watchdog付いてるんですね。
しかし公式なドキュメントが全く出てこない・・・。

$ ls -al /dev/watchdog*
crw------- 1 root root  10, 130  5月 28 12:17 /dev/watchdog
crw------- 1 root root 250,   0  5月 28 12:17 /dev/watchdog0

/devにwatchdogという名前のなにかがいるのでwatchdogと呼ばれているなにかがありそうだけど。。

公式ドキュメントでwatchdogについて言及されているところとか知っている人いたら教えてください。

とりあえず他の人に前ならえする

絶対良くないんだけど、やるだけやってみることにする

参考にしたのは以下のサイト様たち
RaspberryPi 1BでBCM2835内蔵のウォッチドッグを有効にした - 悪霊にさいなまれる世界 -The Demon-Haunted World
Raspberry PiにハードウェアWatchdogを設定してみましょう | CANDY LINE Blog

手順

1. watchdogを有効化

/boot/config.txtを開いて以下の1行を追加する

dtparam=watchdog=on
2. watchdogのタイムアウト時間を設定

/etc/modprobe.d/bcm2835-wdt.confを開く(ない場合は新規で作成)
以下の1行を追加する。
これでどうやら15秒間ハートビートを待つ(15秒間に1度もハートビートが無いとwatchdogが発火する)らしい。

options bcm2835_wdt heartbeat=15 nowayout=0
3. ハートビート送信間隔の設定

/etc/systemd/system.confを開いて以下を探してコメントアウトを解除し、設定値を変更する。
これでsystemdがハートビートを5秒以内に1度送信してくれるらしい。
正常時はwatchdogのタイムアウトまで2回は通知されるようにしたいので、
ワーストケースを考えて5秒にした。

//↓これを探す
#RuntimeWatchdogSec=0
//↓これを追加
RuntimeWatchdogSec=5
4. 再起動で設定が反映される

再起動後、fork爆弾を使ってwatchdogのテストをしてみる。

$ :(){ :|:& };:

実行後すぐterminalの応答が返ってこなくなり、数分後に自動的に再起動することが確認できる。

最後に

公式のwatchdogについて書かれているドキュメントをご存じの方、教えてください。