Hardwarový watchdog v GNU/Linux na embedded zařízení

watchdog

Watchdog, doslovně přeloženo hlídací pes, je součást elektronických zařízení, která umožňuje detekovat poruchy a následně provést obnovení činnosti. Ve většině případů provede vypnutí nebo restart zařízení. Tím pádem je příslušné zařízení neustále v provozu bez nutnosti zásahu člověka. Pro zjednodušení si tento systém můžeme přirovnat ke strojvedoucímu, který musí v určitých intervalech mačkat tzv. tlačítko bdělosti. Pokud jej nestiskne, ozve se na konci probíhajícího intervalu zvukový signál. Jestliže strojvedoucí opět nereaguje, watchdog provede automatické zastavení vlaku. Obdobně může být watchdog využit např. ve vesmírných sondách, kde při výpadku modulu nebo zacyklení programu provede restart a obnovení činnosti. Aby se zabránilo problémům s tímto systémem samotným, musí být co nejjednodušší. Ve většině případů je řešen na úrovni hardware, a to čipové sadě nebo přímo v procesoru/mikrokontroléru.

Jak bylo uvedeno v příkladu s pravidelným mačkáním tlačítka bdělosti strojvedoucím, watchdog je časovač, který v předem nastavených intervalech provádí kontrolu zařízení. Velmi často je tedy označován jako watchdog timer. Místo strojvedoucího se zpravidla využívá programového kódu, který pravidelně, před uplynutím zmiňovaného intervalu, posílá watchdogu informaci o své funkčnosti (tlačítko bdělosti).

Pokud chceme využít watchdog pro naše projekty, musí být součástí hardware, případně můžeme použít softwarový, který však nebude funkční v případě kompletního zastavení systému.

V každém případě musíme watchdog aktivovat, nastavit příslušný interval a chování, a nastartovat obslužný program (programový uživatelský kód), který bude s watchdogem pravidelně komunikovat. Četnost této komunikace musí být vyšší, nežli nastavený interval watchdogu.

Následující postup se bude týkat zprovoznění v systému GNU/Linux (Arch Linux) na embedded platformách Raspberry Pi a Alix 3D3. Při konfiguraci jaderných modulů jsou patrné rozdíly na obou deskách.

Cíl

Cílem je automatické provedení restartu v případě selhání operačního systému a překročení nastavených limitů využití operační paměti nebo vysoké zátěže.

Nastavení jaderného modulu

Jak bylo uvedeno, pokud chceme využít hardwarový watchdog v GNU/Linux, musí být přítomen příslušný jaderný modul, který slouží pro jeho ovládání.

Pokud naše distribuce tento modul neobsahuje a lze jej nalézt ve stromě zdrojových kódů jádra, např. https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/drivers/watchdog, můžeme si jej zkompilovat.

Informace o API a využití vývojáři nalezneme na adrese https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/Documentation/watchdog.

Pro každý typ hardware se používá jiný jaderný modul. Pokud máme štěstí, je při startu našeho systému automaticky zaveden.

V opačném případě je nutné nalézt název správného modulu a nastavit jeho zavádění. Zde nám pomůže internet. Je ale také pravděpodobné, že náš systém hardwarový watchdog nemá, nebo nejsou dostupné jaderné moduly. Je-li to náš případ, použijeme watchdog softwarový, přidáme další hardware, který watchdog emuluje, anebo využijeme jiných možností, viz Závěr.

Pro Alix 3D3 i Rasberry Pi jsou však tyto moduly dostupné. Pro Alix se jmenuje geodewdt, pro Raspberry Pi 1 model B je to bcm2708_wdog.

Různé moduly mohou mít také různé parametry, které je možné zadat při jejich zavádění. Pro jejich zobrazení použíjeme příkaz modinfo.

Všimněme si zejména parametrů timeout/heartbeat. Oba znamenají to samé – již zmíněný interval, během kterého čeká watchdog na „stisk tlačítka bdělosti“. Každý má přednastaven jinou hodnotu. Tuto hodnotu však můžeme přenastavit, a přenastavíme na 15 sekund. Parametr nowayout můžeme nechat na 0. Informuje modul o tom, že je možné jej zastavit, pokud běží.

Následně nastavíme automatické zavedení modulů při startu:

Na Alix 3D3 potřebujeme instruovat linuxové jádro, že využíváme tuto platformu. pokud jsme to ještě neudělali, přidáme do souboru /etc/default/grub:

Následně vytvoříme novou konfiguraci pro Grub (pokud je to nutné):

Poznámka: V mém systému Arch Linux na Alixu 3D3 je poslední funkční verze jádra 4.0.4-2. Vyšší (zkoušel jsem max. 4.0.6) bohužel nebootuje.

Instalace a konfigurace uživatelské služby

Instalace a konfigurace služby v uživatelském prostoru je hardwarově nezávislá.
Nejdříve nainstalujeme balíček watchdog:

Nastavíme nově nainstalovanou službu. Tato operace se provádí v souboru /etc/watchdog.conf:

Naším cílem je automatický restart v případě selhání systému a překročení nastavených limitů využití operační paměti nebo vysoké zátěže.

  1. selhání systému: odkomentujeme řádek identifikující přístup k hardwarovému zařízení watchdog-device = /dev/watchdog, nastavíme interval notifikace watchdogu službou (musí být vždy menší hodnota než interval nastavený jaderným modulem) interval = 1, nastavíme interval watchdogu (stejná hodnota jako v případě modulu jádra) watchdog-timeout = 15.
  2. limit využití operační paměti: nastavíme parametr min-memory – viz manuálová stránka man watchdog.conf.
  3. limit zátěže systému: Nastavíme max-load-1, max-load-5max-load-15.

Start služby

Nyní můžeme službu povolit a případně nastartovat:

Pokud mám zaveden příslušný jaderný modul, měli bychom vidět otevřené zařízení /dev/watchdog příkazem watchdog:

Test

Nejjednodušším testem je „zabití“ služby watchdog:

Po vypršení intervalu nastaveného jaderným modulem by mělo dojít k restartu systému. Avšak pozor, nedojde k odpojení připojených disků ani k uložení dat v paměti!

Mazáci mohou použít sofistikovanější příkaz, který zahltí paměť a vytíží systém:

Korektní testovací skripty jsou součástí zdrojových kódů jádra na adrese https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/Documentation/watchdog.

Závěr

Při použití watchdogu si musíme uvědomit, že v případě restartu zařízení s disky připojenými v režimu pro zápis, může dojít k nekonzistenci dat nebo dokonce jejich ztrátě.

Pokud bychom chtěli restart iniciovaný jádrem v případě události Kernel Panic, nastavíme:

Leave a Reply