Raspberry pi を安定して利用して行きたいと思うと、どうしてもちょっとしたトラブルの時は自動で再起動して欲しいと思います。
勿論、出来るだけフリーズしない様に設定するのは基本ですし、ハードウェア的にも熱暴走しない様にとかの話は当たり前。
でもやはり万が一の場合はあるわけですから、その時にでもとりあえず動き続けて欲しいですよね。
で、そこで Watch Dog Timer と言うものが登場します。
Watch Dog(番犬)と言うからには自分で自分を監視してくれます。
で、動きが取れなくなったらひとまずリブート。
Watch Dog の情報を集めていたら、どうも無駄な情報があふれていた様なので、備忘録を兼ね書き留めておきます。
まず最初にチェックするのはカーネルのモジュール。
たいていの資料には Watck Dog のモジュールをインストーるするところから始まっているのですが、Jessie ではデフォルトで入っていると言う話も。
で、以下の様に lsmod コマンドで確認して見ると
$ lsmod
Module Size Used by
bnep 10340 2
hci_uart 17943 1
btbcm 5929 1 hci_uart
bluetooth 326105 22 bnep,btbcm,hci_uart
brcmfmac 186403 0
brcmutil 5661 1 brcmfmac
cfg80211 428871 1 brcmfmac
rfkill 16037 4 cfg80211,bluetooth
snd_bcm2835 20447 0
snd_pcm 75762 1 snd_bcm2835
snd_timer 19288 1 snd_pcm
snd 51908 3 snd_bcm2835,snd_timer,snd_pcm
bcm2835_gpiomem 2976 0
bcm2835_wdt 3225 ← ここに既にインストールされています。
uio_pdrv_genirq 3164 0
uio 8000 1 uio_pdrv_genirq
ipv6 347620 36
勿論、出来るだけフリーズしない様に設定するのは基本ですし、ハードウェア的にも熱暴走しない様にとかの話は当たり前。
でもやはり万が一の場合はあるわけですから、その時にでもとりあえず動き続けて欲しいですよね。
で、そこで Watch Dog Timer と言うものが登場します。
Watch Dog(番犬)と言うからには自分で自分を監視してくれます。
で、動きが取れなくなったらひとまずリブート。
Watch Dog の情報を集めていたら、どうも無駄な情報があふれていた様なので、備忘録を兼ね書き留めておきます。
まず最初にチェックするのはカーネルのモジュール。
たいていの資料には Watck Dog のモジュールをインストーるするところから始まっているのですが、Jessie ではデフォルトで入っていると言う話も。
で、以下の様に lsmod コマンドで確認して見ると
$ lsmod
Module Size Used by
bnep 10340 2
hci_uart 17943 1
btbcm 5929 1 hci_uart
bluetooth 326105 22 bnep,btbcm,hci_uart
brcmfmac 186403 0
brcmutil 5661 1 brcmfmac
cfg80211 428871 1 brcmfmac
rfkill 16037 4 cfg80211,bluetooth
snd_bcm2835 20447 0
snd_pcm 75762 1 snd_bcm2835
snd_timer 19288 1 snd_pcm
snd 51908 3 snd_bcm2835,snd_timer,snd_pcm
bcm2835_gpiomem 2976 0
bcm2835_wdt 3225 ← ここに既にインストールされています。
uio_pdrv_genirq 3164 0
uio 8000 1 uio_pdrv_genirq
ipv6 347620 36
大抵は古い bcm2835_wdog をインストールする様に書かれています。
でも最新版がインストールされているので、このインストールは不要です。
次が /etc/modules への書き込み。
大体が、
$ echo "bcm2835_wdt" | sudo tee -a /etc/modules
とか書かれていますが、普通に /etc/modules に bcm2835_wdt の1行を追記するだけなので、私は nano で書いてしまいました。
$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
bcm2835_wdt ←この行を追加
さてここで Watch Dog の制御のパッケージをインストールします。
$ sudo apt-get install watchdog chkconfig
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
chkconfig watchdog
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
・
・
・
・
watchdog (5.14-3) を設定しています ...
/run/udev or .udevdb or .udev presence implies active udev. Aborting MAKEDEV invocation.
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
systemd (215-17+deb8u6) のトリガを処理しています ...
$
って感じで無事インストール完了。
インストールしたら設定ファイルの修正です
$ nano /etc/watchdog.conf
#ping = 172.31.14.1
#ping = 172.26.1.255
#interface = eth0
#file = /var/log/messages
#change = 1407
# Uncomment to enable test. Setting one of these values to '0' disables it.
# These values will hopefully never reboot your machine during normal use
# (if your machine is really hung, the loadavg will go much higher than 25)
max-load-1 = 24 ←この行のコメントを削除
#max-load-5 = 18
#max-load-15 = 12
# Note that this is the number of pages!
# To get the real size, check how large the pagesize is on your machine.
#min-memory = 1
#allocatable-memory = 1
#repair-binary = /usr/sbin/repair
#repair-timeout =
#test-binary =
#test-timeout =
# 2017-03-07
#watchdog-device = /dev/watchdog
watchdog-device = /dev/watchdog ←この行のコメントを削除
watchdog-timeout = 10 ←この行を追加
# Defaults compiled into the binary
#temperature-device =
#max-temperature = 120
# Defaults compiled into the binary
#admin = root
#interval = 1
#logtick = 1
#log-dir = /var/log/watchdog
# This greatly decreases the chance that watchdog won't be scheduled before
# your machine is really loaded
realtime = yes
priority = 1
# Check if rsyslogd is still running by enabling the following line
#pidfile = /var/run/rsyslogd.pid
赤字の部分を修正したら、同様に
$ nano /lib/systemd/system/watchdog.service
[Unit]
Description=watchdog daemon
Conflicts=wd_keepalive.service
After=multi-user.target
OnFailure=wd_keepalive.service
[Service]
Type=forking
EnvironmentFile=/etc/default/watchdog
ExecStartPre=/bin/sh -c '[ -z "${watchdog_module}" ] || [ "${watchdog_module}" = "none" ] || /sbin/modprobe $watchdog_module
ExecStart=/bin/sh -c '[ $run_watchdog != 1 ] || exec /usr/sbin/watchdog $watchdog_options'
ExecStopPost=/bin/sh -c '[ $run_wd_keepalive != 1 ] || false'
[Install]
WantedBy=multi-user.target ←この行を追加
最後に WatchDog のサービスを起動して
$ sudo chkconfig watchdog on
$ sudo systemctl enable watchdog
$ sudo systemctl start watchdog
最後に、 Watch Dog が動作している事を確認します。
$ sudo systemctl status watchdog
念のためリブートして再度確認しておくと良いでしょう。
これで、以下のエラー誘発のシェルを作成し、システムが再起動することを確認しておきます。
$ nano forkbomb.sh
#!/bin/bash
swapoff -a
:(){ :|:& };:
$ sudo chmod +x forkbomb.sh
$ ./forkbomb.sh
swapoff: Not superuser.
./forkbomb.sh: 行 4: amp: コマンドが見つかりません
$ ./forkbomb.sh: 行 4: amp: コマンドが見つかりません
./forkbomb.sh: 行 4: amp: コマンドが見つかりません
./forkbomb.sh: 行 4: amp: コマンドが見つかりません
・
・
・
となって最後にリブートしてくれます。
コメント
コメントを投稿