我が家では、USB接続のHDDをラズパイに接続し、NASとして使用している。
しかし、稀にアクセスができなくなり、SSH接続もできない状態になる場合があった。
そこで、この状態をなんとかすべく、ウォッチドッグタイマーという仕組みを導入することにした。
しかし、稀にアクセスができなくなり、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。
こんな表示がされればOK。
[ 0.973297] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
どういう時に出力されるメッセージなんでしょうか?
ハートビートのタイミングで出力されているわけでもない。
概ね2分強周期で動いているようなのですが・・・
実験
最後に、本当に有効になっているかを確認する。
確認するためには、システムをフリーズさせる必要がありますので、フォーク爆弾というDos攻撃コマンドを実行します。
なお、このコマンドは、実行するとシステムがフリーズするため、実行は細心の注意の上、行ってください。
:(){ :|:& };:
これで再起動されれば、設定は成功です。