Watchdog
Ein Watchdog Timer (WDT) ist eine Hardware-Schaltung, die ein Computersystem im Falle eines Software- oder Prozessor-Fehlers zurücksetzen kann. Ein aktivierter Watchdog führt dazu einen Countdown durch, erreicht dieser den Wert 0 initiiert der Watchdog einen Hardware-Reset.
Grundlegende Funktionsweise


Die Funktion eines aktivierten Watchdogs ähnelt der Funktion einer Sicherheitsfahrschaltung in Zügen:[1]
- Der Watchdog Timer führt einen Countdown durch, z. B. von 30 Sekunden abwärts.
- Erreicht der Countdown den Wert 0, führt der Watchdog Timer einen Neustart durch.
- Um ungewollte Neustarts bei funktionierendem System zu verhindern, teilt ein Softwaredienst (watchdogd) dem Kernel-Watchdog-Treiber über die spezielle Gerätedatei /dev/watchdog in kürzeren Abständen mit, dass der Userspace noch aktiv ist. Der Watchdog Timer startet daraufhin den Countdown erneut. Im Normalbetrieb läuft das System somit ohne Unterbrechung.
- Stürzt der Softwaredienst ab (RAM-Fehler, Kernel-Bug, Prozessor-Fehler, ...) erreicht der Countdown nach einer Weile den Wert 0 und das System wird neu gestartet.
Watchdog aktivieren
Ein vorhandener Watchdog Timer kann im Betriebssystem und teilweise auch zusätzlich bereits im BIOS aktiviert werden:
- Watchdog im BIOS aktivieren: Häufig gibt es bereits im BIOS eine Option, den Watchdog Timer zu aktivieren. Dabei muss der Wert für den Countdown ausreichend hoch gewählt werden. Ansonsten erreicht dieser den Wert 0 bevor der Softwaredienst zum Neustarten des Countdowns (watchdogd) aktiviert wird. Es würden dann ständig Resets auftreten, das System könnte nicht mehr vollständig hochfahren bis im BIOS der Watchdog deaktiviert wird oder der Wert für den Countdown entsprechend erhöht wird. Ein Wert von 5 Minuten (300 Sekunden) ist hier häufig sinnvoll (Beispiel zeigt LES plus v3 Watchdog Einstellungen im BIOS via Advanced -> System Power Management):
- Watchdog im Betriebssystem aktivieren: Beim Starten des Softwaredienstes (watchdogd) öffnet dieser das Watchdog Device, damit wird auch der Watchdog aktiviert.
Funktionen der Linux Watchdog Driver API
- Basic Mode: Der Watchdog wird aktiviert, sobald das /dev/watchdog Device geöffnet wird.
- Magic Close: Wenn ein Treiber „Magic Close“ unterstützt, wird der Treiber den Watchdog nur dann deaktivieren, wenn kurz vor dem Schließen der Datei ein spezielles magisches Zeichen 'V' an /dev/watchdog gesendet wurde. Wenn der Userspace-Daemon die Datei schließt, ohne dieses spezielle Zeichen zu senden, geht der Treiber davon aus, dass der Daemon (und der Userspace im Allgemeinen) gestorben ist, und hört auf, den Watchdog anzupingen, ohne ihn vorher zu deaktivieren. Dies führt dann zu einem Neustart, wenn der Watchdog nicht in ausreichender Zeit wieder geöffnet wird.
- Pretimeout: Einige Watchdog Timer können so eingestellt werden, dass ein zusätzliches Event (watchdog pretimeout governor) vor dem Hardware Reset ausgelöst wird. Dies kann mit einem Non-maskable Interrupt (NMI), einem normalen Interrupt oder einem anderen Mechanismus geschehen. Dadurch kann Linux nützliche Informationen vor dem Reset aufzeichnen (z.B. Panic-Informationen und Kernel-Core-Dumps). Mögliche Events (watchdog pretimeout governors) sind:[2]
Watchdog Chips einiger Thomas-Krenn-Server
| System | Watchdog Chip (via Super I/O chip) | Linux Kernel Modul | Linux Kernel Support seit | Weitere Informationen |
|---|---|---|---|---|
| LES v3 | Fintek F81803 | f71808e_wdt | 5.4 | kernelnewbies.org, Commit |
| LES v4 | ITE IT8613E | it87_wdt | 6.7 | kernelnewbies.org, Commit |
| (Testsystem) | ITE IT8659 | 6.8 | kernelnewbies.org, Commit | |
| LES plus v2 | ITE IT8784E-I | 6.8, | Commit | |
| LES plus v3 | ITE IT8786 | |||
| LES network 6L v2 |
Testen der Watchdog Funktion
Beispiel LES v3
Im BIOS können unter Advanced -> Super IO Configuration folgende Watchdog Optionen gesetzt werden:
- WatchDog Reset Timer (Enabled/Disabled)
- WatchDog Reset Timer Value
- WatchDog Reset Timer Unit (Sec./Min.)
- WatchDog Wake-up Time (Enabled/Disabled).
In diesem Beispiel (mit installiertem Ubuntu 20.04.3) aktivieren wir den WatchDog Reset Timer und stellen den Wert dazu auf 5 Min. Wenn Linux dann gestartet wird und keine weitere Konfiguration vorgenommen wird, startet das System alle 5 Minuten neu.
Nach dem Starten von Ubuntu 20.04.3 mit Linux Kernel 5.11 laden Sie das Watchdog Modul und überprüfen Sie die Ausgabe von dmesg:
tk@ubuntu:~$ sudo modprobe f71808e_wdt tk@ubuntu:~$ dmesg | tail -n 1 [ 185.557090] f71808e_wdt: Found f81803 watchdog chip, revision 16
Das Kommando wdctl zeigt danach Details zum Watchdog:
tk@ubuntu:~$ sudo wdctl Device: /dev/watchdog Identity: f81803 watchdog [version 0] Timeout: 60 seconds FLAG DESCRIPTION STATUS BOOT-STATUS CARDRESET Card previously reset the CPU 0 0 KEEPALIVEPING Keep alive ping reply 0 0 MAGICCLOSE Supports magic close char 0 0
Die Einstellung des BIOS (5 Min.) wird durch die Einstellung im OS (60 Sekunden) überschrieben. Ebenso ist der Watchdog nun deaktiviert. Erst ein Schreiben auf das Watchdog-Device /dev/watchdog aktiviert den Watchdog wieder.
Zum Testen der Watchdog-Funktionalität führen Sie als root Benutzer folgendes Kommando aus, drücken danach 2x die Enter-Taste und warten dann:
root@ubuntu:~# cat >> /dev/watchdog
Nach Ablauf des Timeouts (60 Sekunden in diesem Beispiel) kommt es zu einem Reboot.
Für eine reguläre Verwendung des Watchdog installieren Sie das Paket watchdog. Stellen Sie anschließend sicher, dass das f71808e_wdt Modul sowie der Watchdog Daemon bei einem Systemstart automatisch gestartet werden. Der Daemon schreibt regelmäßig auf das Watchdog-Device, dadurch wird ein Reboot durch den Watchdog verhindert. Kommt es zu einem Crash, wird der Watchdog nach Ablauf des Timeouts das System neu starten.
Beispiel LES v4
Bislang unterstützt das it87_wdt Modul im Linux Kernel den verbauten ITE IT8613E nicht.
tk@debian12:~$ uname -a Linux debian12 6.5.0-rc3-dirty #1 SMP PREEMPT_DYNAMIC Thu Jul 27 13:35:58 CEST 2023 x86_64 GNU/Linux tk@debian12:~$ sudo modprobe it87_wdt modprobe: ERROR: could not insert 'it87_wdt': No such device tk@debian12:~$ sudo dmesg | tail -n 1 [ 270.984823] it87_wdt: Unknown Chip found, Chip 8613 Revision 000c
Testpatch für IT8613 Support
diff --git a/drivers/watchdog/it87_wdt.c b/drivers/watchdog/it87_wdt.c
index bb1122909396..e888b1bdd1f2 100644
--- a/drivers/watchdog/it87_wdt.c
+++ b/drivers/watchdog/it87_wdt.c
@@ -13,9 +13,9 @@
* http://www.ite.com.tw/
*
* Support of the watchdog timers, which are available on
- * IT8607, IT8620, IT8622, IT8625, IT8628, IT8655, IT8665, IT8686,
- * IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726, IT8728,
- * IT8772, IT8783 and IT8784.
+ * IT8607, IT8613, IT8620, IT8622, IT8625, IT8628, IT8655, IT8665,
+ * IT8686, IT8702, IT8712, IT8716, IT8718, IT8720, IT8721, IT8726,
+ * IT8728, IT8772, IT8783 and IT8784.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@@ -50,6 +50,7 @@
/* Chip Id numbers */
#define NO_DEV_ID 0xffff
#define IT8607_ID 0x8607
+#define IT8613_ID 0x8613
#define IT8620_ID 0x8620
#define IT8622_ID 0x8622
#define IT8625_ID 0x8625
@@ -277,6 +278,7 @@ static int __init it87_wdt_init(void)
max_units = 65535;
break;
case IT8607_ID:
+ case IT8613_ID:
case IT8620_ID:
case IT8622_ID:
case IT8625_ID:
Kompilieren am LES v4:
tk@debian12:~/git/kernels/libata$ time make -j4 [...] LD [M] sound/soc/sof/intel/snd-sof-pci-intel-lnl.ko BTF [M] sound/soc/sof/intel/snd-sof-pci-intel-lnl.ko real 156m47.475s user 545m57.216s sys 64m2.834s tk@debian12:~/git/kernels/libata$ sudo make modules_install [...] tk@debian12:~/git/kernels/libata$ sudo make install [...] tk@debian12:~/git/kernels/libata$ sudo reboot
tk@debian12:~$ uname -a Linux debian12 6.6.0-rc2-dirty #2 SMP PREEMPT_DYNAMIC Fri Sep 22 12:20:27 CEST 2023 x86_64 GNU/Linux tk@debian12:~$ sudo modprobe it87_wdt tk@debian12:~$ sudo dmesg | tail -n 1 [ 72.801650] it87_wdt: Chip IT8613 revision 12 initialized. timeout=60 sec (nowayout=0 testmode=0) tk@debian12:~$
Test:
tk@debian12:~$ sudo wdctl /dev/watchdog1 Device: /dev/watchdog1 Identity: IT87 WDT [version 1] Timeout: 60 seconds Pre-timeout: 0 seconds FLAG DESCRIPTION STATUS BOOT-STATUS KEEPALIVEPING Keep alive ping reply 1 0 MAGICCLOSE Supports magic close char 0 0 PRETIMEOUT Pretimeout (in seconds) 1 0 SETTIMEOUT Set timeout (in seconds) 0 0 tk@debian12:~$ sudo su - root@debian12:~# cat >> /dev/watchdog1
hwmon / sensors
- ITE IT8613E #167 (github.com/lm-sensors/lm-sensors/issues)
- https://github.com/a1wong/it87
- https://wiki.odroid.com/odroid-h3/application_note/fan_speed_control_with_temp
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/drivers/gpio/gpio-it87.c
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/drivers/hwmon/it87.c
Das Kommando sensors-detect von lm-sensors liefert u.a. folgende Ausgabe:
[...]
Some Super I/O chips contain embedded sensors. We have to write to
standard I/O ports to probe them. This is usually safe.
Do you want to scan for Super I/O sensors? (YES/no):
Probing for Super-I/O at 0x2e/0x2f
Trying family `National Semiconductor/ITE'... No
Trying family `SMSC'... No
Trying family `VIA/Winbond/Nuvoton/Fintek'... No
Trying family `ITE'... Yes
Found `ITE IT8613E Super IO Sensors' Success!
(address 0xa30, driver `to-be-written')
Probing for Super-I/O at 0x4e/0x4f
Trying family `National Semiconductor/ITE'... No
Trying family `SMSC'... No
Trying family `VIA/Winbond/Nuvoton/Fintek'... No
Trying family `ITE'... No
[...]
Beispiel LES plus v2

Ab BIOS Version KBR2L200 können im BIOS unter Advanced -> ACPI Settings folgende Watchdog Optionen gesetzt werden:
- WatchDog (Enabled/Disabled)
- WatchDog Count Unit (Sec./Min.)
- WatchDog Time-out Value
Nach dem Starten von Ubuntu 20.04.3 mit Linux Kernel 5.11 laden Sie das Watchdog Modul und überprüfen Sie die Ausgabe von dmesg:
tk@ubuntu:~$ sudo modprobe it87_wdt tk@ubuntu:~$ dmesg | tail -n 1 [ 190.437364] it87_wdt: Chip IT8784 revision 4 initialized. timeout=60 sec (nowayout=0 testmode=0)
tk@ubuntu:~$ sudo wdctl Device: /dev/watchdog Identity: IT87 WDT [version 1] Timeout: 60 seconds Pre-timeout: 0 seconds FLAG DESCRIPTION STATUS BOOT-STATUS KEEPALIVEPING Keep alive ping reply 1 0 MAGICCLOSE Supports magic close char 0 0 SETTIMEOUT Set timeout (in seconds) 0 0
Die Einstellung des BIOS (5 Min.) wird durch die Einstellung im OS (60 Sekunden) überschrieben. Ebenso ist der Watchdog nun deaktiviert.
Hinweis: Ein erneutes Aktivieren via OS konnten wir bislang noch nicht erfolgreich testen. Treiber-Support ist erst mit Linux Kernel 5.10 eingeflossen, dies könnte noch eine Ursache für Kompatibilitätsprobleme sein. Zudem könnte das Flag KEEPALIVEPING eine Rolle spielen. Wir testen weiter und werden diesen Artikel entsprechend aktualisieren.
Kernel 6.1
Hier einige Testausgaben von Debian 12 mit Kernel 6.1:
root@debian12:~# dmesg | grep -i wdt [ 3.788142] iTCO_wdt iTCO_wdt: Found a Intel PCH TCO device (Version=4, TCOBASE=0x0400) [ 3.796556] iTCO_wdt iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) root@debian12:~# modprobe it87_wdt root@debian12:~# dmesg | grep -i wdt [ 3.788142] iTCO_wdt iTCO_wdt: Found a Intel PCH TCO device (Version=4, TCOBASE=0x0400) [ 3.796556] iTCO_wdt iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) [ 377.573631] it87_wdt: Chip IT8784 revision 4 initialized. timeout=60 sec (nowayout=0 testmode=0)
root@debian12:~# wdctl Device: /dev/watchdog0 Identity: iTCO_wdt [version 0] Timeout: 30 seconds Timeleft: 30 seconds Pre-timeout: 0 seconds FLAG DESCRIPTION STATUS BOOT-STATUS KEEPALIVEPING Keep alive ping reply 1 0 MAGICCLOSE Supports magic close char 0 0 PRETIMEOUT Pretimeout (in seconds) 1 0 SETTIMEOUT Set timeout (in seconds) 0 0 root@debian12:~# wdctl /dev/watchdog1 Device: /dev/watchdog1 Identity: IT87 WDT [version 1] Timeout: 60 seconds Pre-timeout: 0 seconds FLAG DESCRIPTION STATUS BOOT-STATUS KEEPALIVEPING Keep alive ping reply 1 0 MAGICCLOSE Supports magic close char 0 0 PRETIMEOUT Pretimeout (in seconds) 1 0 SETTIMEOUT Set timeout (in seconds) 0 0 root@debian12:~#
Beispiel LES plus v3

Im BIOS (YCLUL222, Build Date 11/30/2022), können im BIOS unter Advanced -> System Power Management folgende Watchdog Optionen gesetzt werden:
- WatchDog (Enabled/Disabled)
- Timer Mode
- Boot Timeout Value
Nach dem Starten von Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-56-generic x86_64) laden Sie das Watchdog Modul und überprüfen Sie die Ausgabe von dmesg:
tk@ubuntu:~$ sudo modprobe it87_wdt tk@ubuntu:~$ dmesg | tail -n 1 [ 952.419872] it87_wdt: Chip IT8786 revision 4 initialized. timeout=60 sec (nowayout=0 testmode=0)
tk@ubuntu:~$ sudo wdctl Device: /dev/watchdog Identity: IT87 WDT [version 1] Timeout: 60 seconds Pre-timeout: 0 seconds FLAG DESCRIPTION STATUS BOOT-STATUS KEEPALIVEPING Keep alive ping reply 1 0 MAGICCLOSE Supports magic close char 0 0 SETTIMEOUT Set timeout (in seconds) 0 0
Weitere Informationen
- Super I/O (en.wikipedia.org)
- The Linux Watchdog driver API (docs.kernel.org)
- The Linux WatchDog Timer Driver Core kernel API (docs.kernel.org)
- WatchDog Module Parameters (docs.kernel.org)
- https://www.kernel.org/doc/html/v6.8/watchdog/watchdog-api.html
- Linux Watchdog Daemon (www.crawford-space.co.uk)
- Intel iTCO
- Testing the Intel TCO watchdog using Ubuntu live (www.madore.org, 14.09.2016)
- iTCO_wdt not finding device (groups.google.com)
- ACPI: Add support for WDAT (Watchdog Action Table) (lwn.net)
- https://uefi.org/sites/default/files/resources/Watchdog%20Descriptor%20Table.pdf
- https://www.supertechcrew.com/watchdog-keeping-system-always-running/
|
Autor: Werner Fischer Werner Fischer arbeitet im Product Management Team von Thomas-Krenn. Er evaluiert dabei neueste Technologien und teilt sein Wissen in Fachartikeln, bei Konferenzen und im Thomas-Krenn Wiki. Bereits 2005 - ein Jahr nach seinem Abschluss des Studiums zu Computer- und Mediensicherheit an der FH Hagenberg - heuerte er beim bayerischen Server-Hersteller an. Als Öffi-Fan nutzt er gerne Bus & Bahn und genießt seinen morgendlichen Spaziergang ins Büro. |
- ↑ Sicherheitsfahrschaltung (de.wikipedia.org)
- ↑ Tests:Watchdog-Pretimeout (elinux.org)
- ↑ pretimeout_noop.c (git.kernel.org)
- ↑ pretimeout_panic.c (git.kernel.org)
- ↑ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=da0d12ff2b829a35e9921918e925d79497b82bef

