悪霊にさいなまれる世界 -The Demon-Haunted World

30代独身機械系技術者が雑記/セキュリティ/資産運用なんかを書きます/PGP・GPG Key:BC884A1C8202081B19A7A9B8AB8B419682B02FF8

RaspberryPi 1BでBCM2835内蔵のウォッチドッグを有効にした

VPNサーバ兼バックアップ用に動かしているRaspberryPi 1B、ちょっとアクセスしにくい場所に置いてあるので何らかの理由でバグって停止すると再起動が面倒。なのでウォッチドッグ使って異常時に再起動をするようにした。

調べてみるとRaspberryPiのSoCであるBCM2835にはあらかじめウォッチドッグ機能がついているので特にソフト等をインストールする必要は無い模様。なので以下サイトを参考に有効化してみた。

Raspberry PiにハードウェアWatchdogを設定してみましょう | CANDY LINE Blog

内容はリンク先の前半部をそのままやっただけである。試しに初期状態のまま、システムをハングアップさせてしまうFork爆弾を打ち込んでみる。

:(){ :|:& };:

f:id:scienceasacandleinthedark:20190503152656p:plain

完全にハングアップです。本当にありがとうございました。こうなると電源ケーブルを抜いて強制再起動しかない。

ざっくりとしたシステムの流れとしては、

  1. 「SoCは設定した間隔内でハートビート信号が来ることを期待している」
  2. 「正常動作中はsystemdが別に設定された間隔でハートビート信号を送信する」
  3. 「ハートビート信号を受信すればSoCは正常動作と判断」
  4. 「ハングアップするとsystemdからのハートビート信号が途絶える」
  5. 「SoCはハングアップを検出して強制再起動」

ということになる、らしい。それではサクサクと設定していく。

まずウォッチドッグ機能を有効にする設定。/boot/config.txtを開いて一番下に下記行を追加。

#Enable watchdog
dtparam=watchdog=on

続いてSoCのカーネルモジュールの設定。/etc/modprobe.d/bcm2835-wdt.confを新規ファイルとして作成し、

options bcm2835_wdt heartbeat=20 nowayout=0

の一行を作成。これでBCM2835が20秒以内にハートビート信号を期待する設定となる。参照サイトでは14秒となっていたが、何となくキリが悪いので20秒にした。

最後にsystemdからハートビートを送信させる設定。/etc/systemd/system.confを開き、コメントアウトされている#RuntimeWatchdogSec=0を探してその下に一文を追加。

RuntimeWatchdogSec=10

これでsystemdから10秒おきにハートビート信号が送信されるはずである。期待時間が前述の通り20秒なので、1回は何らかの理由で跳んでも大丈夫だろう。設定を有効にするためrebootで再起動。

再起動したら有効になっているか、起動ログから確認する。

dmesg | grep bcm2835-wdt

有効化されていれば以下のような一行が表示される。冒頭の数字は起動からの秒数らしいので毎回異なるはず。

[ 0.902386] bcm2835-wdt 20100000.watchdog: Broadcom BCM2835 watchdog timer

これでOKである。試しに前述のFork爆弾をもう一度打ち込んで様子を見てみる。

:(){ :|:& };:

待つこと数分

f:id:scienceasacandleinthedark:20190503155309j:plain

 今回はちゃんと自動で再起動。ちゃんと監視が効いている模様なのでOKである。いじょ