RaspberryPi ZeroにWatchdog Timer(WDT)を設定して、リソース不足時に再起動させる設定にしたメモ

RaspberryPi Zero W と Zero WH で遊んでいるのですが、
時として、リソース不足からなのか止まることがあり、
cronで再起動するようにしていました。
なのですが、どうやらリソース不足を見張る番犬がいるみたいなので、
そちらで設定をし直したので、レポートします。
# 参考資料
ほぼ、次の内容の焼き直し
[Linux でシステムのフリーズを検知して自動的に再起動させる方法](https://qiita.com/noraworld/items/239a73686290107c0e11)
[RaspberryPiでWatchdogTimerを構成する方法](https://qiita.com/arta-crypt/items/017cf94e4d9714bd46b7)
[Raspberry Pi 3/ Zero / Zero W等で watchdogを有効化する
](https://qiita.com/hidenorly/items/a09486c4359e85d7583e)


# 環境
```cat /sys/firmware/devicetree/base/model```

```
Raspberry Pi Zero W Rev 1.1
```

```cat /etc/os-release```

```
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

``` cat /proc/version```

```
Linux version 5.10.103+ (dom@buildbot) (arm-linux-gnueabihf-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1529 Tue Mar 8 12:19:18 GMT 2022
```

# やること
- watch docの設定
    - 設定ファイルの変更
    - リブート

# watch docの設定
## 概要
- 設定ファイル追記
    - ```/boot/config.txt```
    - ```/etc/systemd/system.conf.d/watchdog.conf```
    - ```/etc/modprobe.d/bcm2835-wdt.conf```
- ```reboot```
- 確認
    - ```sudo dmesg | grep bcm2835-wdt```
    - ```sudo dmesg | grep systemd | grep watchdog```
## 設定ファイル追記

### ```/boot/config.txt```
```/boot/config.txt
# Watchdog timer
dtparam=watchdog=on
```
#### コマンド
```bash
sudo nano /boot/config.txt
```



#### やってること
ここでは起動時にwatch docを有効にする設定をしてるっぽいです。

Raspberry Pi はBIOSを持たないらしく、BIOSで設定すべきことを```/boot/config.txt```に記述してあげることで変更できるとのこと。
なので、このファイルは起動時の一回だけ読み込まれて、
以降の変更は再起動しないと適応されないとのことです。
調べる中でちょっと興味を引いたのが、起動中は```sudo nano /boot/config.txt```で修正して```reboot```となるのですが、
そもそも起動してなくてもSDカード自体をPCで読み込んで編集できたりします。
ということは、試行錯誤してるなかで起動できない状況になった時に
逃げ道になるなぁ、なんて感じました。

##### 資料
OSの設定(config.txt) － Raspberry Pi公式ドキュメントを日本語訳
https://igarashi-systems.com/sample/translation/raspberry-pi/configuration/config-text.html

Raspberry Pi で boot/config.txt ファイルを編集する 3 つの方法
https://ja.linux-console.net/?p=12699


### ```/etc/systemd/system.conf.d/watchdog.conf```
既定値
```/etc/systemd/system.conf
#RuntimeWatchdogSec=0
```

設定値
```/etc/systemd/system.conf.d/Watchdog.conf
RuntimeWatchdogSec=5
```

#### コマンド
```bash
sudo mkdir /etc/systemd/system.conf.d/
sudo touch /etc/systemd/system.conf.d/watchdog.conf
sudo nano /etc/systemd/system.conf.d/watchdog.conf
```

#### やってること
watch docが確認する時間間隔をLinuxの管理システムに設定してあげています。

```/etc/systemd/system.conf```を直接編集することは非推奨で、
```/etc/systemd/system.conf.d/```下に設定ファイルを作りなさいとのとのことでした。
なので、
```/etc/systemd/system.conf.d/Watchdog.conf```
に設定項目を記入します。
なお、設定ファイル名は```.conf```であればいいとのことで、
今回はわかりやすく```watchdog.conf```というファイル名で作成しています。

systemdはLinuxのサービスやデーモンを管理する仕組みで、
その設定ファイルである
```/etc/systemd/system.conf```に
watch docの設定が記載されています（既定値）。
```/etc/systemd/system.conf```は
コンパイル中に設定されたデフォルト値とのことで、
コメントアウトされているところから項目としては持っているものの、
現在はnullあるかいであるのかと思われます。

ここで、```/etc/systemd/system.conf.d/Watchdog.conf```に
```RuntimeWatchdogSec=5```と設定してあげることで、
既定値が上書きされ、5秒に一度死活確認を行うとのことです。
この設定値のことをHeartBeatというらしく
直訳すると鼓動になるのですが、
値の意味からは5秒に一度「生きてますかー？」と
問いかけをしているようなものなので、
ちょっとチグハグだなぁ、なんて感じました。

##### 資料
systemdのお勉強 #Linux - Qiita
https://qiita.com/s_szk/items/1c8fff34aa5ea744dba9

Linux でシステムのフリーズを検知して自動的に再起動させる方法 #Linux - Qiita
https://qiita.com/noraworld/items/239a73686290107c0e11

systemd-system.conf(5) — systemd — Debian testing — Debian Manpages
https://manpages.debian.org/testing/systemd/systemd-system.conf.5.en.html

### ```/etc/modprobe.d/bcm2835-wdt.conf```
```/etc/modprobe.d/bcm2835-wdt.conf
options bcm2835_wdt heartbeat=10 nowayout=0
```

### コマンド
```bash
sudo touch /etc/modprobe.d/bcm2835-wdt.conf
sudo nano /etc/modprobe.d/bcm2835-wdt.conf
```


#### やってること
カーネルモジュールの読み込みの設定を行い、
watchdogへのheartbeatの時間を設定している、との事です。

bcm2835はRaspberryPi Zeroなどに搭載されいてるチップで、
そのチップで設定できる項目の値の設定を行っています。
```/etc/modprobe.d/```の下に```.conf```の
ファイルがあると読み込まれるとのことで、
```bcm2835-wdt.conf```のファイルを作成し、
上記の項目を書き込み再起動することで有効になるっぽいです。


##### 資料
RaspberryPiでWatchdogTimerを構成する方法 #RaspberryPi - Qiita
https://qiita.com/arta-crypt/items/017cf94e4d9714bd46b7

Raspberry Pi搭載CPUの変遷にみた「上手なチップ開発術」：この10年で起こったこと、次の10年で起こること（26）（2/4 ページ） - EE Times Japan
https://eetimes.itmedia.co.jp/ee/articles/1806/29/news035_2.html


## 動作確認
### 再起動
設定したファイル群は起動時に読み込まれるものがほとんどなので、
再起動して設定が反映されるようにします。
#### コマンド
```bash
sudo reboot
```

### 内容の確認
#### コマンド
```bash
sudo dmesg | grep bcm2835-wdt
sudo dmesg | grep systemd | grep watchdog
```
#### やってること

Linuxカーネルが起動時に出力したメッセージを表示する
```dmesg```でwatchdogに関する表記があるか、
また、watchdogに関するフォルダーがあるかを見て、
設定が有効かどうかを見ていきます。

#### 出力
```bash
$ sudo dmesg | grep bcm2835-wdt
[    3.457458] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
```
有効であると、上のようにbcm2835について設定した項目が表示されます。

```bash
$ ls /dev/ | grep watchdog
watchdog
watchdog0
```
また、watchdogが有効化されると
```/dev/watchdog```と```/dev/watchdog0```が追加されるので、
それを確認します。


##### 資料
RaspberryPiでWatchdogTimerを構成する方法 #RaspberryPi - Qiita
https://qiita.com/arta-crypt/items/017cf94e4d9714bd46b7

RaspberryPiでWatchdogTimerを構成する方法 #RaspberryPi - Qiita
https://qiita.com/arta-crypt/items/017cf94e4d9714bd46b7#27-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D

【 dmesg 】コマンド――カーネルが出力したメッセージを表示する：Linux基本コマンドTips（74） - ＠IT
https://atmarkit.itmedia.co.jp/ait/articles/1612/20/news023.html


# Watchdog Timer(WDT)とはなにか？
コンピューターシステムが動いているかを確認する“タイマー”とのことです。
Watchdogは番犬という意味っぽいんで、
見張ってるんだなあなんて思っていたものの、
はてさてタイマーとはなんぞやと思って、
あれこれ調べて見たら、定期的な書き込みを行う処理を監視し、
一定時間行われなかった場合に
あらかじめ設定した処理を行うというもの、らしいです。
なので、システムのハングアップなどが起きたとき、
それを感知して再起動したりしてくれるので、
フリーズしたまま静かに固まり続けるというのを避けることができる。らしいです。

その実装はハードウェアとソフトウェアの二通りあって、
RaspberryPiの場合にはハードウェアでの実装があるので、
ちょっとの追加設定で使えるとのことでした。

参考
[ウォッチドッグタイマー wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%89%E3%83%83%E3%82%B0%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC)