我が家では、USB接続のHDDをラズパイに接続し、NASとして使用している。
しかし、稀にアクセスができなくなり、SSH接続もできない状態になる場合があった。
そこで、この状態をなんとかすべく、ウォッチドッグタイマーという仕組みを導入することにした。


0.ウォッチドッグタイマーとは?


システムの動作を監視し、動作が停止していた場合に、リセット等の動作を行うことで、システム停止状態から復帰するための仕組み。
一定時間で行う動作を監視し、その動作が途切れた場合に、システムが停止していると判断する。
一定時間で行う動作のことをサービスパルスとか、ハートビートとか言いますね。

ちなみに、ウォッチドッグは、番犬の意味。

ハード:Raspberry Pi 2B
OS:Raspbian GNU/Linux 10

なお、この方法は、RaspbianのバージョンがJessie(8.0)以降でないと対応していない。
この点はご注意頂きたい。


1.ウォッチドッグタイマーの有効化


まずはウォッチドッグタイマーを使用可能にする。
Raspbianでは、標準でウォッチドッグタイマーに対応しているため、設定を有効化すればよい。
有効にする方法は以下の通り。

/boot/config.txt に、以下を追加
dtparam=watchdog=on


2.ハートビートを待つ設定


ウォッチドッグタイマーを有効にしたら、ハートビートの待ちを設定する。
ここで設定した時間が経過してもハートビートが来なかったら、リセット動作を行います。

/etc/modprobe.d/bcm2835-wdt.conf というファイルを作成し、以下の内容を記述する。
options bcm2835_wdt heartbeat=60 nowayout=0

hertbeatの値がハートビートの応答を待機する秒数です。

ちなみに、この作成するファイル名は、どういう意味なんだ?と思ったので、調べました。
bcm2835というのは、ラズパイに搭載されているチップの名称のようです。
wdtは、おそらくウォッチドッグタイマーの略でしょう。


3.ハートビート実行周期の設定


次は、ハートビートの実行間隔を設定します。
ハートビートは、systemdで実行します。
この設定を忘れると、ハートビートが来ないので、延々と再起動することになります。

/etc/systemd/system.conf のRuntimeWatchdogSecのコメントアウトを解除し、値を設定する。
RuntimeWatchdogSec=60

以上で設定完了。
再起動して設定を反映させる。
reboot


反映確認


ハートビートが有効になっているかは、以下のコマンドで確認します。
dmesg | grep bcm2835-wdt
dmesgは、カーネルから出力されたメッセージを表示するコマンドです。

こんな表示がされればOK。
[    0.973297] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer

どういう時に出力されるメッセージなんでしょうか?
ハートビートのタイミングで出力されているわけでもない。
概ね2分強周期で動いているようなのですが・・・


実験


最後に、本当に有効になっているかを確認する。
確認するためには、システムをフリーズさせる必要がありますので、フォーク爆弾というDos攻撃コマンドを実行します。

なお、このコマンドは、実行するとシステムがフリーズするため、実行は細心の注意の上、行ってください。
:(){ :|:& };:

これで再起動されれば、設定は成功です。