Raspberry Pi 3B+のウオッチドッグタイマー(Watch Dog Timer:WDT)を有効化して自動再起動する方法です^_^

環境

  • Raspberry Pi 3B+
  • OS : Raspbian stretch9.3

ウオッチドッグタイマーとは(Watch Dog Timer:WDT)🐶とは?

まず初めに、ウオッチドッグとは読んで字のごとく「番犬」です。

システムを監視していて、動きがおかしい時に自動で再起動してくれます。

Watch Dog Timerの頭文字をとってWDTと言ったりします。

なぜ導入?どういう時に使う?

ラズパイを使っていると、理由は様々ですが、突然反応しなくなり使えなくなります。(システムがハングアップ)例えば以下のような事例

  • SSHも通らない
  • Pingも通らない
  • ラズパイのIPアドレスが見つからない(iPhoneアプリのFingなどを使用)

こんな時はラズパイから電源を引っこ抜いて電源を入れ直せば直るのですが、遠隔で使っていたりすると、この作業が非常に面倒くさいです!

そこでウオッチドッグタイマーです。

自分でシステムの状態を監視して自動で再起動して復帰します。

長期運用する際は入れておきたいですね。

私はラズパイ上にHome Assistantを構築して長期運用しているのでWDTを導入しています。

導入

watchdogのインストール

まず以下のコマンドを実行してwatchdogをインストールします。

$ sudo apt-get install watchdog

先頭の”$”はターミナルに元々表示されているものですので、入力不要です。

watchdog.serviceを編集します

以下のコマンドを実行し、nano(テキストエディタ)でwatchdog.serviceを開きます。

$ sudo nano /lib/systemd/system/watchdog.service

上記のファイルを開くと、[instal]という項がありますが、そこに”WantedBy=multi-user.target”を追加します。

[Install]

#WantedBy=default.target
WantedBy=multi-user.target

元々、[install]項には”WantedBy=default.target”の記載があるので、これを#でコメントアウトして上記を追加します。

watchdogの自動起動設定

以下のように、update-rc.dコマンドを実行して、watchdogの自動起動設定をします。

$ sudo update-rc.d watchdog enable

モジュールのロード

$ sudo modprobe bcm2835_wdt

watchdog.confを編集します

以下のコマンドを実行し、nano(テキストエディタ)でwatchdog.confを開きます。

$ sudo nano /etc/watchdog.conf

開いたら、以下のように編集します。 

  • #max-load-1 = 24
  • → max-load-1 = 24(#を外す)
  • #watchdog-device = /dev/watchdog
  • → #を外す
  • watchdog-device = /dev/watchdogの1つ下の行に”watchdog-timeout = 10″を追加する

再起動する

以下のコマンドを実行して再起動し、設定を反映させます。

$ sudo reboot

動作確認

WDTの自動起動確認

再起動後に以下のコマンドを実行して、WDTが自動起動していることを確認します。

$ dmesg | grep bcm2835-wdt

自動起動していれば、以下の表示がでます。何も表示されなければうまく設定できていませんので、上記を見直してみましょう。

[    0.642923] bcm2835-wdt 3f100000.watchdog: Broadcom BCM2835 watchdog timer

左の数字(ここでは0.642923)は必ず同じになるわけではないので、違っていても気にしないで下さい。

WDTの動作確認(フォークボム)

WDTの動作確認をするために、わざとラズパイのシステム動作に影響を及ぼす、フォークボム(Fork爆弾)を撃ってみます。

フォークボムとはプロセスをどんどん複製させ、フォークボム以外のプロセスが走る余裕をなくし、システムを動作させなくするというものです。

とても危険なコマンドなので、WDTを設定せずに行うと、電源を引っこ抜いて落とす以外に戻す方法がないので注意してください💣

以下のコマンドを実行します。

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

上記を実行すると、フォークプロセスが増えていき、徐々にシステムの反応が遅くなります。そして、応答しなくなります。

私が試したときは、SSHで接続していましたが、SSHが切断されました。

SSHのプロセスさえも動作しなくなったと思われます。

このあと、無事再起動したら、動作確認完了です。

お疲れさまでした(^o^)