目次
1. 概要
- Raspberry Pi 3B にはH/W watchdog timerが組み込まれている
- カーネルにインライン化されている
- lsmod では表示されない
- モジュールのロードは不要(カーネルに組み込まれていなかった時は必要だったらしい)
- BCM2835 は最大 15 秒のタイムアウトのみをサポート
- カーネルにインライン化されている
- プラットフォームが wd デバイスを含んでいることを Linux に伝えるように config.txt を設定する
- システムで実行するウォッチドッグマネージャーを選ぶ
- watchdog パッケージ
- systemd に組み込まれたもの
- その他のカスタム
2. 手順
2.1. 使っているラズパイの種類やバージョンを調べる
$ cat /proc/cpuinfo
processor : 0
BogoMIPS : 38.40
Features : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 1
BogoMIPS : 38.40
Features : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 2
BogoMIPS : 38.40
Features : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 3
BogoMIPS : 38.40
Features : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
Hardware : BCM2835
Revision : a22082
Serial : 00000000059fb933
Model : Raspberry Pi 3 Model B Rev 1.2
2.2. WDTがカーネルにコンパイルされていることを調べる
- リストに表示されている場合は、カーネル内でコンパイルされている
$ cat /lib/modules/$(uname -r)/modules.builtin | grep wdt
kernel/drivers/watchdog/bcm2835_wdt.ko
$ sudo cat /var/log/kern.log* | grep watchdog
Dec 14 21:03:51 raspberrypi kernel: [ 3.029813] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
2.3. Watchdogを動かすカーネルモジュールの設定
モジュールの設定
- これに効果があるかは未検証
- 少なくとも10分に設定した時は設定が反映されず、10数秒ほどで再起動した
- WatchDogTimer】Raspberry Pi4サーバがフリーズ(停止)した場合に自動再起動する方法【HeartBeat】
-
/etc/modprobe.d/bcm2835-wdt.conf
というパスにファイルを作成 - 作成したら1行追加
- 15秒のハートビートをWatchdogが期待する
options bcm2835_wdt heartbeat=15 nowayout=0
Parameter | Role |
---|---|
heartbeat | 秒単位の初期Watch Dog heartbeat(タイムアウトするまでの時間) |
nowayout | 一度起動した後に、Watch Dogを停止可能かどうかのフラグ |
2.4. Watchdogマネージャーを構成する
systemdに組み込まれたものを使用する場合
-
/etc/systemd/system.conf.d/main.conf
というファイルを作成-
/etc/systemd/system.conf
をいじっても良いのですが、/etc/systemd/system.conf.d/*.conf
を使用することが推奨されているので今回はこちらを使用します。 - ファイル名は任意なので
main.conf
でなくても大丈夫です。ただし拡張子は.conf
としてください。
-
- systemdにX秒間隔でHeartbeatを実施させる
[Manager]
RuntimeWatchdogSec=10
参考
Watchdogパッケージを使用する場合
インストールする
$ sudo apt install watchdog
自動起動設定
- update-rc.dを使用(もしかしたら不要?watchdogをインストールしただけで自動起動するかも)
$ sudo update-rc.d watchdog enable
$ update-rc.d -h
usage: update-rc.d [-f] <basename> remove
update-rc.d [-f] <basename> defaults
update-rc.d [-f] <basename> defaults-disabled
update-rc.d <basename> disable|enable [S|2|3|4|5]
-f: force
参考
2.5. WDTを有効にする
-
/boot/config.txt
に1行追加
dtparam=watchdog=on
- ウォッチドッグで再起動ループに陥った場合、WindowsPCなどでドライブを読み込み、
boot/config.txt
をdtparam=watchdog=off
と編集する - Watchdogマネージャーを構成せずに、WDTだけを有効にした場合、
/dev/watchdog
に1を書き込む(echo 1 | sudo tee /dev/watchdog
)とWDのタイマカウントが始まり、再度書き込まなければ、15秒で再起動が始まるらしい- ハードウェア デバイスは、/dev/watchdog への最初の書き込みが発生するまでカウント ダウンを開始しない
2.6. 再起動
設定を反映させるために再起動
$ sudo reboot
2.7. 動作確認
ウォッチドッグタイマ有効化の確認
-
bcm2835-wdt
が見つかればWDTが有効化されている
$ dmesg | grep bcm2835-wdt
[ 3.029263] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
-
/dev/watchdog
および/dev/watchdog0
が追加されていれば有効化されている
$ ls /dev/ | grep watchdog
watchdog
watchdog0
- フォークボムで再起動させる
$ :(){ :|:& };:
$ sudo bash -c ':(){ :|:& };:'
$ python -c "import os, itertools; [os.fork() for i in itertools.count()]"
参考
- WatchDogTimer】Raspberry Pi4サーバがフリーズ(停止)した場合に自動再起動する方法【HeartBeat】
- ラズパイ安定化対策-フリーズ対応編
- Rapberry Pi 初期設定の半自動化
- Raspberry Pi 3B+のウオッチドッグタイマー(Watch Dog Timer:WDT)を有効化して自動再起動する方法
- RUNNING FOREVER WITH THE RASPBERRY PI HARDWARE WATCHDOG
- watchdog timerのインストールと設定
- How to activate bcm2835_wdt watchdog kernel module for raspberry pi 3?
- How to set watchdog timer on RaspberryPi
- [solved] how to start the watchdog with jessie