RaspberryPiでWatchdogTimerを構成する方法



# 目次
[1.概要](#1-概要)
[2.手順](#2-手順)
[3.参考](#3-参考)

# 1. 概要
- Raspberry Pi 3B にはH/W watchdog timerが組み込まれている
	- カーネルにインライン化されている
		- lsmod では表示されない
		- モジュールのロードは不要（カーネルに組み込まれていなかった時は必要だったらしい）
		- BCM2835 は最大 15 秒のタイムアウトのみをサポート
			- [RPi3B+ and watchdog...](https://forums.raspberrypi.com/viewtopic.php?t=210974#p1302250)
			- [Changing watchdog timeout on RPi3](https://raspberrypi.stackexchange.com/questions/71052/changing-watchdog-timeout-on-rpi3)
- プラットフォームが wd デバイスを含んでいることを Linux に伝えるように config.txt を設定する
- システムで実行するウォッチドッグマネージャーを選ぶ
	- watchdog パッケージ
		- [software watchdog daemon - Linux man page - Die.net](https://linux.die.net/man/8/watchdog)
	- systemd に組み込まれたもの
		- [systemd.service - Freedesktop.org](https://www.freedesktop.org/software/systemd/man/systemd.service.html)
		- [systemd(1) - Linux manual page - man7.org](https://man7.org/linux/man-pages/man1/init.1.html)
	- その他のカスタム

# 2. 手順

## 2.1. 使っているラズパイの種類やバージョンを調べる

- [使っているラズパイの種類やバージョンを調べるコマンド](https://raspida.com/command-cpuinfo)

```
$ 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がカーネルにコンパイルされていることを調べる

- リストに表示されている場合は、カーネル内でコンパイルされている
	-  [How to activate bcm2835_wdt watchdog kernel module for raspberry pi 3?](https://stackoverflow.com/questions/48211548/how-to-activate-bcm2835-wdt-watchdog-kernel-module-for-raspberry-pi-3)
	- [How to set watchdog timer on RaspberryPi](https://iotassistant.io/raspberry-pi/how-to-set-watchdog-timer-raspberrypi/)
```
$ 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】](https://debimate.jp/2020/11/28/%E3%80%90watchdogtimer%E3%80%91raspberry-pi4%E3%82%B5%E3%83%BC%E3%83%90%E3%81%8C%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E8%87%AA%E5%8B%95/)
1. `/etc/modprobe.d/bcm2835-wdt.conf`というパスにファイルを作成
2. 作成したら１行追加
- 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
```

### 参考
- [Linux でシステムのフリーズを検知して自動的に再起動させる方法](https://zenn.dev/noraworld/articles/watchdog-timer)

### 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
```

### 参考
- [update-rc.d - \[サーバー運営上必要なコマンド\]](https://www.fulldigit.co.jp/command/s2_update-rc-d.html)

## 2.5. WDTを有効にする

- `/boot/config.txt`に１行追加

```
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 への最初の書き込みが発生するまでカウント ダウンを開始しない
		- [RPi3B+ and watchdog...](https://forums.raspberrypi.com/viewtopic.php?t=210974#p1302250)

## 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
```

- フォークボムで再起動させる
	- 他にも方法があるらしい
		- [WatchDogTimer】Raspberry Pi4サーバがフリーズ(停止)した場合に自動再起動する方法【HeartBeat】](https://debimate.jp/2020/11/28/%E3%80%90watchdogtimer%E3%80%91raspberry-pi4%E3%82%B5%E3%83%BC%E3%83%90%E3%81%8C%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E8%87%AA%E5%8B%95/)

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

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

```
$ python -c "import os, itertools; [os.fork() for i in itertools.count()]"
```

# 参考
- [WatchDogTimer】Raspberry Pi4サーバがフリーズ(停止)した場合に自動再起動する方法【HeartBeat】](https://debimate.jp/2020/11/28/%E3%80%90watchdogtimer%E3%80%91raspberry-pi4%E3%82%B5%E3%83%BC%E3%83%90%E3%81%8C%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E8%87%AA%E5%8B%95/)
- [ラズパイ安定化対策－フリーズ対応編](https://www.my-hacks.info/2019/05/16/post-682/)
- [Rapberry Pi 初期設定の半自動化](https://qiita.com/god19/items/68103e3755383e531d4c)
- [Raspberry Pi 3B+のウオッチドッグタイマー（Watch Dog Timer:WDT）を有効化して自動再起動する方法](https://atooshi-note.com/raspberry-pi-watchdog/)
- [RUNNING FOREVER WITH THE RASPBERRY PI HARDWARE WATCHDOG](https://diode.io/raspberry%20pi/running-forever-with-the-raspberry-pi-hardware-watchdog-20202/)
- [watchdog timerのインストールと設定](http://carol-net.co.jp/ikakashi/5-watchdog-timer%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A/)
- [How to activate bcm2835_wdt watchdog kernel module for raspberry pi 3?](https://stackoverflow.com/questions/48211548/how-to-activate-bcm2835-wdt-watchdog-kernel-module-for-raspberry-pi-3)
- [How to set watchdog timer on RaspberryPi](https://iotassistant.io/raspberry-pi/how-to-set-watchdog-timer-raspberrypi/)
- [[solved] how to start the watchdog with jessie](https://forums.raspberrypi.com/viewtopic.php?t=147935)