Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

bookworm版のRaspberry Pi OSでは、watchdogはマイクロプロセッサ内部にあるwatchdogが利用できます。 一般的なプロセス数増大などによる応答なし状態(固まったみたいな)から本体を再起動させるには、/etc/systemd/system.confの設定を加えるだけで済んでしまいます。簡単になりましたね。

aptでインストールできるwatchdogも利用出来るので少しややこしいうえ、ネット上には古くからの情報も多く、新旧を判別するのが難しいと思ったので少しまとめてみました。

watchdogをどう使うのか

watchdogはラズパイに限らずPCでも原理は同じなのですが、裏側で動いているためあまり気にしていませんよね。

簡単な現象でご説明すると、不具合のあるコードやアプリを実行した際、無限ループのように実行プロセスが膨大に増えたり、メモリーの利用が膨大になってメモリー不足に陥ることがあります。

画面が固まったりマウスカーソルが動かなくなったり、基本的な動作が割り込めなくなるような状態です。

この状態から自動的に再起動がかかって復旧させるのにwatchdogが働いています。

他にも定期的に監視していることで利用できる使い方があります。

watchdogは定期的な監視システム

専門的だと私には難しくて説明ができません。間違っている、誤解している場合はご容赦ください。

watchdogは英語から訳せば「番犬」になり、意味としては監視している状態です。番犬ですからね。実際は監視しているというより、監視に使える状態を作り出しているとも言えるでしょう。

一定周期でカウントしている機能です。

例えば10〜1秒までカウント(ダウン)して行き、トータル10秒でリセットするとします。10〜1といったカウントダウンのパターンもあります。

この周期を利用して、あるプロセスの実行が不具合によって一定時間を過ぎても実行されない時、これを不具合と検知するトリガーになるというものです。

正確には一定カウントで実際にシステムをリセットしてしまいます。それでは使えないので、リセットされる前にカウンターを元に戻す処理をしています。正常ならシステムリセットはかからず、異常時にカウントダウン(アップ)が止まらずにシステムがリセットされるという仕組みです。

いつもの周期より早い場合も異常と検知することもできるためやや複雑ですが、このリセットさせるループ処理を不具合や異常の検知用に使われています。

ウォッチドッグはウォッチドッグタイマーとも呼ばれるカウントするタイマーです。

内蔵されたwatchdogの設定

Raspberry Pi にはマイクロプロセッサチップ(bcm2835-wdt)に内蔵されているwatchdogがあります。

kernelにドライバーとして組み込まれています。

cat /lib/modules/$(uname -r)/modules.builtin | grep wdt
kernel/drivers/watchdog/bcm2835_wdt.ko

Pi 5でも起動後にdmesgで検索するとBroadcom BCM2835 Watchdog timerが/dev/watchdog0デバイスなのが分かります。

dmesg | grep watchdog
[    0.382383] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
[    2.017757] systemd[1]: Using hardware watchdog 'Broadcom BCM2835 Watchdog timer', version 0, device /dev/watchdog0

設定は/etc/systemd/system.confにします。

コメントを有効にして書き換えるか、最下部に追記していきます。

sudo nano /etc/systemd/system.conf

#RuntimeWatchdogSec=off
#RuntimeWatchdogSec=15
#RuntimeWatchdogPreSec=off
#RuntimeWatchdogPreGovernor=
#RebootWatchdogSec=10min
#KExecWatchdogSec=off
#WatchdogDevice=
...(続く)

RuntimeWatchdogSec=10
RebootWatchdogSec=2min

RuntimeWatchdogSecは、最大タイムアウト秒です。長さは1~15 秒。(bcm2835-wdtは15秒が上限でデフォルト値も15)異常を検知後、15秒待ってから再起動がかかることになります。

RebootWatchdogSecは、再起動後に再度ウォッチドッグが再開するまで待つ時間です。

他の項目は最低限であればそのままでもOKです。

再起動することで適用できます。

■Pi 5は8GBモデルがオススメ

Watchdogサービスを使う場合

先程の元から組み込まれているWDは設定を施すだけでした。今度はサービスとして動くwatchdogを使ってみます。より細かな制御が可能になります。

センサーによる温度、Wi-Fiの有効/無効なども検知できます。プログラムで柔軟に利用したいなら、サービス版になるのでしょうか。プログラマではないので分かりません。

異常からの再起動といった基本的なウォッチドッグ機能だけで良いなら、aptからインストールするwatchdogサービスは必須ではありません。

内蔵されているハードウェア版watchdogの設定ファイル(/etc/systemd/system.conf)の指定箇所を有効にするだけで済みます。

ソフトウェア版watchdogの導入後はdmesgにsystemd[1]:の表示が無くなっています。

dmesg | grep watchdog
[    0.379740] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer

watchdogのインストール

サービスで動作するwatchdogはaptでインストールするだけです。

sudo apt install watchdog

bookwormの現バージョン、Pi 5で記事執筆時点で試した結果、インストールのメッセージにwarningが表示されました。(WDバージョン:5.16-2~rpt2)

でも大丈夫です。インストールは無事に済みます。

.../watchdog_5.16-2~rpt2_arm64.deb を展開する準備をしています ...
watchdog (5.16-2~rpt2) を展開しています...
watchdog (5.16-2~rpt2) を設定しています ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Created symlink /etc/systemd/system/default.target.wants/watchdog.service → /lib/systemd/system/watchdog.service.
wd_keepalive.service is a disabled or a static unit, not starting it.

恐らく、古いコマンドsudo update-rc.d <service> stop/startが利用できない警告でしょう。systemctl startで使用できます。

インストールしたら、watchdogを有効にしサービスを開始させます。最後にステータスを確認してエラーがなければOKです。

sudo systemctl enable watchdog
sudo systemctl start watchdog
sudo systemctl status watchdog

ここではイジりませんが、関係しているサービスがwatchdog.serviceの他にwd_keepalive.serviceがあります。

インストール後のステータス例です。

sudo systemctl status watchdog

● watchdog.service - watchdog daemon
     Loaded: loaded (/lib/systemd/system/watchdog.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-10-18 10:22:01 JST; 3min 20s ago
   Main PID: 2971 (watchdog)
      Tasks: 1 (limit: 4438)
        CPU: 7ms
     CGroup: /system.slice/watchdog.service
             └─2971 /usr/sbin/watchdog

10月 18 10:22:01 kiosk-pi watchdog[2971]:  file: no file to check
10月 18 10:22:01 kiosk-pi watchdog[2971]:  pidfile: no server process to check
10月 18 10:22:01 kiosk-pi watchdog[2971]:  interface: no interface to check
10月 18 10:22:01 kiosk-pi watchdog[2971]:  temperature: no sensors to check
10月 18 10:22:01 kiosk-pi watchdog[2971]:  no test binary files
10月 18 10:22:01 kiosk-pi watchdog[2971]:  no repair binary files
10月 18 10:22:01 kiosk-pi watchdog[2971]:  error retry time-out = 60 seconds
10月 18 10:22:01 kiosk-pi watchdog[2971]:  repair attempts = 1
10月 18 10:22:01 kiosk-pi watchdog[2971]:  alive=[none] heartbeat=[none] to=root no_act=no force=no
10月 18 10:22:01 kiosk-pi systemd[1]: Started watchdog.service - watchdog daemon.

エラーがなければ、ここではOKです。

confファイルの編集

先程と同じようにwatchdogのパラメータを編集します。watchdogをインストール後、次の2つのファイルが生成されています。

  • /etc/default/watchdog
  • /etc/watchdog.conf

編集するのは/etc/watchdog.confです。

/etc/default/watchdogは特段触らなくてもOKでした。

その前に、system.confで設定した箇所をコメントアウトしておきます。

sudo nano /etc/systemd/system.conf

#RuntimeWatchdogSec=10
#RebootWatchdogSec=2min

これでsystemctl statusでcannot open /dev/watchdog (errno = 16 = 'Device or resource〜のエラーが出ないと思います。

sudo nano /etc/watchdog.conf

コメントを外して値を有効にして編集するのは、最低限で次の2つです。

# default /dev/watchdog
watchdog-device = /dev/watchdog
# default 60
watchdog-timeout = 10

max-load-1 = 24を有効にしても違いが分かりませんでした。カーネルパニックなどでは、25を超えるということらしい。保険として24があった方がいいかもしれません。今回は有効にしていません。1分間に24?が閾値の下限みたい。

再起動後、systemctlのstatusで覗いてみます。

sudo reboot

sudo systemctl status watchdog.service

最初と異なるのは下3行分ほどで、10秒にセットしてあること、aliveに/dev/watchdogが入っています。

10月 19 12:58:52 kiosk-pi watchdog[1928]:  interface: no interface to check
10月 19 12:58:52 kiosk-pi watchdog[1928]:  temperature: no sensors to check
10月 19 12:58:52 kiosk-pi watchdog[1928]:  no test binary files
10月 19 12:58:52 kiosk-pi watchdog[1928]:  no repair binary files
10月 19 12:58:52 kiosk-pi watchdog[1928]:  error retry time-out = 60 seconds
10月 19 12:58:52 kiosk-pi watchdog[1928]:  repair attempts = 1
10月 19 12:58:52 kiosk-pi watchdog[1928]:  alive=/dev/watchdog heartbeat=[none] to=root no_act=no force=no
10月 19 12:58:52 kiosk-pi watchdog[1928]: watchdog now set to 10 seconds
10月 19 12:58:52 kiosk-pi watchdog[1928]: hardware watchdog identity: Broadcom BCM2835 Watchdog timer
10月 19 12:58:52 kiosk-pi systemd[1]: Started watchdog.service - watchdog daemon.

最低限はこれでOKです。

テストしてみる

実際に異常を発生させるため、フォークボムかカーネルパニック現象を引き起こさせるコマンドを実行してみましょう。

どちらもラズパイの動作が急激に遅くなり、指定した秒数後に再起動がかかるハズです。

SSH接続で試すと、しばらくメッセージが表示され、すぐに何も出来なくなります。

フォークボム:

sudo bash -c ':(){ :|:& };:'

カーネルパニック:

sudo su
echo c > /proc/sysrq-trigger

今回の例では10秒に設定したので、10秒ほどで再起動がかかりました。成功です。

デフォルトでイイかも

実際に試してみると、私が欲しい最低限の機能は、デフォルトの内蔵ハードウェア版watchdogで事足ります。ソフトウェア版watchdogとなるサービスで稼働させるwatchdogは、設定できる項目も多いため、/etc/watchdog.conf内の注釈を読んでみてください。

おまけの補足

んー、wdctlコマンドがバージョンが古いのか機能しない。2024年7月4日v2.40.2が最新だった。

wdctl -V
wdctl from util-linux 2.38.1

ウォッチドッグを有効にすると、wdctlはエラーになる。

wdctl: cannot read information about /dev/watchdog0: そのようなファイルやディレクトリはありません

それと、Watchdogのカウントはカウントダウンです。