Linux je sám o sobě spolehlivý systém... V případě nějakého problému (interního či vnějšího vlivu - například problém s napájením, jiskření a jiné rušení...) se může vyskytnout stav tzv. zakousnutí systému. Tento jev se dá vyřešit tím, že k RPI dojdeme a restartujeme ho ručně (odpojením od napájení). Ovšem ne vždy máme možnost k RPI neustále chodit v případě poruchy... Tento problém vyřeší WDT systém.
WDT je časovač, který se musí po určité době nulovat (neustále se zasílá příkaz pro vynulování). V případě zamrznutí systému se přestane WDT nulovat a tím dojde k přetečení časovače WDT. WDT provede restart systému. Tzn. v případě problému (zakousnutí) vyřeší WDT reset RPI.
Máme štěstí :-) Broadcom BCM2708 obsahuje i HW Watchdog. Máme k dispozici dva způsoby použití watchdogu v RPI (a nebo b nelze obojí!)
a) použijeme démona pro hlídání RPI systému
Nainstalujeme Watchdog (WDT):
sudo apt-get install watchdog
Otevřeme v editoru soubor /etc/watchdog.conf:
sudo nano /etc/watchdog.conf
a odkomentujeme (dáme pryč křížek) na řádcích (nebo i jiné křížky):
watchdog-device = /dev/watchdog
max-load-1 = 24
Otevřeme v editoru soubor /etc/modules
sudo nano /etc/modules
a přidáme položku:
# watchdog
bcm2708_wdog
Spustíme příkaz k aktivaci modulu a služby:
sudo modprobe bcm2708_wdog
sudo service watchdog restart
sudo apt-get install watchdog chkconfig
sudo chkconfig watchdog on
sudo /etc/init.d/watchdog start
Pro test služby zahltíme systém (RPI se během chvíle samo restartuje):
:(){ :|:&};:
b) použijeme pro hlídání našeho programu (běh programu v Pythonu, pokud se náš program kousne dojde k restartu RPI)
Nainstalujeme Watchdog (WDT):
sudo apt-get install python-dev
sudo apt-get install python-pip
sudo easy_install watchdogdev
Otevřeme v editoru soubor /etc/modules
sudo nano /etc/modules
a přidáme položku:
# watchdog
bcm2708_wdog
Spustíme příkaz k aktivaci modulu a služby:
sudo modprobe bcm2708_wdog
test program pro Python:
#!/usr/bin/env python
import subprocess
from time import sleep
from watchdogdev import *
wd = watchdog('/dev/watchdog')
# povolime hw watchdog
command = 'sudo modprobe bcm2708_wdog'
subprocess.Popen(command , shell=True,stdout=subprocess.PIPE)
print "Watchdog bezi a hlida chod programu"
# smycka
while True:
wd.keep_alive() # musime do 10 sec vzdy spustit jinak restart rpi
print "WDT cas= ",wd.get_time_left()
sleep(1)
# pokud program ukoncime dojde do 10 sekund k restartu RPI
# pro ukonceni wdt je nutne do naseho programu pridat:
# wd.magic_close() # vypne wdt a nedojde k restartu RPI