Die Linux Watchdog-Treiber-API

https://www.kernel.org/doc/html/latest/watchdog/watchdog-api.html


Docs » Linux Watchdog Support » The Linux Watchdog driver API

The Linux Watchdog driver API

Last reviewed: 10/05/2007

Copyright 2002 Christer Weingel [email protected]

Some parts of this document are copied verbatim from the sbc60xxwdt driver which is (c) Copyright 2000 Jakob Oestergaard <jakob@ostenfeld.dk>

Ein Teil dieses Dokuments wird so kopiert, wie es vom sbc60xx wdt-Treiber von (c) Copyright 2000 Jakob Oestergaard [email protected] stammt.

This document describes the state of the Linux 2.4.18 kernel.

Dieses Dokument wurde mit dem Linux 2.4.18-Kernel geschrieben.

Introduction

A Watchdog Timer (WDT) is a hardware circuit that can reset the computer system in case of a software fault. You probably knew that already.

Watchdog Timer (WDT) ist eine Hardwareschaltung, die das Computersystem bei einem Softwareproblem zurücksetzen kann. Das wissen Sie vielleicht schon.

Usually a userspace daemon will notify the kernel watchdog driver via the /dev/watchdog special device file that userspace is still alive, at regular intervals. When such a notification occurs, the driver will usually tell the hardware watchdog that everything is in order, and that the watchdog should wait for yet another little while to reset the system. If userspace fails (RAM error, kernel bug, whatever), the notifications cease to occur, and the hardware watchdog will reset the system (causing a reboot) after the timeout occurs.

Normalerweise benachrichtigen User-Space-Daemons den Kernel-Wachdog-Treiber regelmäßig darüber, dass sie noch am Leben sind, und zwar über die spezielle Gerätedatei / dev / watchdog, die im User-Space aktiv ist. Wenn eine solche Benachrichtigung auftritt, benachrichtigt der Treiber normalerweise den Hardware-Watchdog, dass alles in Ordnung ist, und der Watchdog muss noch etwas länger warten, um das System zurückzusetzen. Wenn ein Problem mit dem Benutzerplatz auftritt (RAM-Probleme, Kernel-Fehler usw.), tritt kein Verlauf mehr auf und der Hardware-Watchdog setzt das System nach einer Zeitüberschreitung (dh einem Neustart) zurück. Masu).

The Linux watchdog API is a rather ad-hoc construction and different drivers implement different, and sometimes incompatible, parts of it. This file is an attempt to document the existing usage and allow future driver writers to use it as a reference.

Die Linux-Watchdog-API ist eine provisorische Struktur. Unterschiedliche Treiber haben unterschiedliche Implementierungen, sind inkompatibel und implementieren einige von ihnen. Diese Datei ist ein Versuch, die vorhandene Verwendung zu dokumentieren und für herkömmliche Treiberautoren sichtbar zu machen.

The simplest API

All drivers support the basic mode of operation, where the watchdog activates as soon as /dev/watchdog is opened and will reboot unless the watchdog is pinged within a certain time, this time is called the timeout or margin. The simplest way to ping the watchdog is to write some data to the device. So a very simple watchdog daemon would look like this source file: see samples/watchdog/watchdog-simple.c

Alle Treiber unterstützen grundlegende Verarbeitungsmodi. Der Watchdog wird aktiviert, sobald / dev / watchdog geöffnet wird. Wenn dann die Benachrichtigung an Watchdog für einen bestimmten Zeitraum stirbt, wird sie neu gestartet. Diese Zeit wird als Timeout oder Margin bezeichnet. Der einfachste Weg, einen Watchdog zu pingen, besteht darin, einige Daten auf das Gerät zu schreiben. Ein sehr einfacher Watchdog-Daemon sieht also wie die folgende Quelldatei aus: Siehe Beispiele / watchdog / watchdog-simple.c. ,

A more advanced driver could for example check that a HTTP server is still responding before doing the write call to ping the watchdog.

Fortgeschrittenere Treiber können beispielsweise überprüfen, ob der HTTP-Server noch reagiert, bevor sie einen Schreibaufruf zum Pingen des Watchdogs ausführen.

When the device is closed, the watchdog is disabled, unless the “Magic Close” feature is supported (see below). This is not always such a good idea, since if there is a bug in the watchdog daemon and it crashes the system will not reboot. Because of this, some of the drivers support the configuration option “Disable watchdog shutdown on close”, CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when compiling the kernel, there is no way of disabling the watchdog once it has been started. So, if the watchdog daemon crashes, the system will reboot after the timeout has passed. Watchdog devices also usually support the nowayout module parameter so that this option can be controlled at runtime.

Watchdog ist deaktiviert, wenn das Gerät geschlossen wird, wenn die Funktion "Magic Close" nicht unterstützt wird (siehe unten). Dies ist nicht immer eine gute Idee. Wenn der Watchdog-Daemon einen Fehler aufweist und abstürzt, kann das System nicht neu gestartet werden. Daher unterstützen einige Treiber die Konfigurationsoption "Diasable Watchdog Shutdown beim Schließen", CONFIG_WATCHDOG_NOWAYOUT. Wenn dies beim Kompilieren des Kernels auf Y gesetzt ist, kann es nicht mehr gestoppt werden, sobald der Watchdog gestartet wird. Wenn der Watchdog-Daemon abstürzt, wird das System daher nach Ablauf des Timeouts neu gestartet. Watchdog-Geräte unterstützen normalerweise auch einen Nowayout-Modulparameter, um diese Option zur Laufzeit zu steuern.

Magic Close feature

If a driver supports “Magic Close”, the driver will not disable the watchdog unless a specific magic character ‘V’ has been sent to /dev/watchdog just before closing the file. If the userspace daemon closes the file without sending this special character, the driver will assume that the daemon (and userspace in general) died, and will stop pinging the watchdog without disabling it first. This will then cause a reboot if the watchdog is not re-opened in sufficient time.

Wenn der Treiber "Magic Close" unterstützt, kann der Treiber das Watchdog-spezifische Magic-Zeichen "V" nicht deaktivieren, ohne es vor dem Schließen der Datei an / dev / watchdog zu senden. Wenn der User Space-Daemon die Datei schließt, ohne eine spezielle Zeichenfolge zu senden, benachrichtigt der Treiber den Watchdog, ohne dass der Daemon (und im Allgemeinen der User Space) zum ersten Mal stirbt. Es gilt als gestoppt. Wenn der Watchdog nicht rechtzeitig wieder geöffnet wird, führt dies zu einem Neustart.

The ioctl API

All conforming drivers also support an ioctl API.

Alle kompatiblen Treiber unterstützen auch die ioctl-API.

Pinging the watchdog using an ioctl:

Benachrichtigung an Watchdog mit ioctl.

All drivers that have an ioctl interface support at least one ioctl, KEEPALIVE. This ioctl does exactly the same thing as a write to the watchdog device, so the main loop in the above program could be replaced with:

Treiber mit einer ioctl-Schnittstelle unterstützen mindestens die KEEP ALIVE-Schnittstelle. Dieses ioctl entspricht dem Schreiben auf das Watchdog-Gerät, sodass die Hauptschleife im vorherigen Programm wie folgt umgeschrieben werden kann:

while (1) {
        ioctl(fd, WDIOC_KEEPALIVE, 0);
        sleep(10);
}

the argument to the ioctl is ignored.

Das Argument ioctl ist ungültig.

Setting and getting the timeout

For some drivers it is possible to modify the watchdog timeout on the fly with the SETTIMEOUT ioctl, those drivers have the WDIOF_SETTIMEOUT flag set in their option field. The argument is an integer representing the timeout in seconds. The driver returns the real timeout used in the same variable, and this timeout might differ from the requested one due to limitation of the hardware:

Bei einigen Treibern können Sie das Watchdog-Timeout während der Ausführung mit SETTIMEOUT ioctl ändern. Für diese Treiber ist im Optionsfeld das Flag WDIOF_SETTIMEOUT gesetzt. Das Argument ist vom Typ Integer und gibt die Anzahl der Sekunden des Timeouts an. Der Treiber gibt das tatsächliche Zeitlimit mit derselben Variablen zurück. Dieses Zeitlimit kann aufgrund von Hardwareeinschränkungen von dem angeforderten abweichen.

int timeout = 45;
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
printf("The timeout was set to %d seconds\n", timeout);

This example might actually print “The timeout was set to 60 seconds” if the device has a granularity of minutes for its timeout.

Wenn in diesem Beispiel das Zeitlimit für das Gerät in Minuten angegeben ist, lautet die tatsächliche Ausgabe "Das Zeitlimit wurde auf 60 Sekunden festgelegt".

Starting with the Linux 2.4.18 kernel, it is possible to query the current timeout using the GETTIMEOUT ioctl:

Im Linux 2.4.18-Kernel können Sie das aktuelle Timeout auch mit GETTIMEOUT ioctl anfordern.


ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
printf("The timeout was is %d seconds\n", timeout);

Pretimeouts

Some watchdog timers can be set to have a trigger go off before the actual time they will reset the system. This can be done with an NMI, interrupt, or other mechanism. This allows Linux to record useful information (like panic information and kernel coredumps) before it resets:

Bei einigen Watcjdog-Timern können Sie einen Trigger vor der tatsächlichen Zeit zum Neustart des Systems setzen. Es kann NMI, Interrupts oder andere Mechanismen nutzen. Auf diese Weise kann Linux vor dem Neustart nützliche Informationen (z. B. Panikinformationen und Kernel-Core-Dumps) beibehalten.

pretimeout = 10;
ioctl(fd, WDIOC_SETPRETIMEOUT, &pretimeout);

Note that the pretimeout is the number of seconds before the time when the timeout will go off. It is not the number of seconds until the pretimeout. So, for instance, if you set the timeout to 60 seconds and the pretimeout to 10 seconds, the pretimeout will go off in 50 seconds. Setting a pretimeout to zero disables it.

Beachten Sie, dass das Zeitlimit die Zeit in Sekunden ist, bevor das Zeitlimit ausgelöst wird. Dies ist kein Buchstabe k bis zum Pretimeout. Wenn Sie beispielsweise das Zeitlimit auf 60 Sekunden und das Zeitlimit auf 10 Sekunden einstellen, wird das Zeitlimit nach 50 Sekunden aktiviert. Sie kann deaktiviert werden, indem pretimeout auf 0 gesetzt wird.

There is also a get function for getting the pretimeout:

Es gibt auch eine Funktion, um das Pretimeout abzurufen.

ioctl(fd, WDIOC_GETPRETIMEOUT, &timeout);
printf("The pretimeout was is %d seconds\n", timeout);

Not all watchdog drivers will support a pretimeout.

Nicht alle Watchdog-Treiber unterstützen Pretimeout.

Get the number of seconds before reboot

Some watchdog drivers have the ability to report the remaining time before the system will reboot. The WDIOC_GETTIMELEFT is the ioctl that returns the number of seconds before reboot:

Einige Watchdog-Treiber können Sie über die verbleibende Zeit vor dem Neustart des Systems informieren. WDIOC_GETTIMELEFT ist ein ioctl, das die Anzahl der Sekunden vor dem Neustart zurückgibt.

ioctl(fd, WDIOC_GETTIMELEFT, &timeleft);
printf("The timeout was is %d seconds\n", timeleft);

Environmental monitoring

All watchdog drivers are required return more information about the system, some do temperature, fan and power level monitoring, some can tell you the reason for the last reboot of the system. The GETSUPPORT ioctl is available to ask what the device can do:

Alle Watchdog-Treiber müssen viele detaillierte Informationen über das System zurückgeben. Einige überwachen Temperatur, Lüfter und Leistungsstufen. Einige werden Sie als letzten Faktor benachrichtigen, der den Neustart des Systems verursacht hat. GETSUPPORT ioctl kann nachfragen, was das Gerät kann.

struct watchdog_info ident;
ioctl(fd, WDIOC_GETSUPPORT, &ident);

the fields returned in the ident struct are:

Das Feld der Ident-Struktur ist wie folgt.

identity a string identifying the watchdog driver firmware_version the firmware version of the card if available options a flags describing what the device supports

Identitäts-Watchdog-Treiber-ID-Zeichenfolge firmware_version Wenn aktiviert, die Firmware-Version der Karte options Vom Gerät unterstützte Flag-Deskriptoren.

the options field can have the following bits set, and describes what kind of information that the GET_STATUS and GET_BOOT_STATUS ioctls can return. [FIXME – Is this correct?]

Im Optionsfeld können Sie um die folgenden Bits konkurrieren und Informationen in GET_STATUS oder GET_BOOT_STATUS ioctl [FIXME-Ist das wahr? ]]

WDIOF_OVERHEAT Reset due to CPU overheat The machine was last rebooted by the watchdog because the thermal limit was exceeded:

WDIOF_OVERHEAT Neustart wegen CPU-Überhitzung Die Maschine hat ihre Temperaturgrenze erreicht und der Watchdog hat einen endgültigen Neustart durchgeführt.

WDIOF_FANFAULT Fan failed A system fan monitored by the watchdog card has failed

WDIOF_FANFAULT Fan failed Dieses System hat versagt, dass der Lüfter von der Watchdog-Karte überwacht wird.

WDIOF_EXTERN1 External relay 1 External monitoring relay/source 1 was triggered. Controllers intended for real world applications include external monitoring pins that will trigger a reset.

WDIO F_EXTERN1 Externer Faktor 1 Ein externer Überwachungsfaktor / Trigger für Quelle 1 ist aufgetreten. Der Controller für reale Anwendungen enthält einen Pin zum Auslösen eines Resets.

WDIOF_EXTERN2 External relay 2 External monitoring relay/source 2 was triggered

WDIOF_EXTERN2 External relay 2 Ein externer Überwachungsfaktor / Trigger für Quelle 1 ist aufgetreten.

WDIOF_POWERUNDER Power bad/power fault The machine is showing an undervoltage status

WDIOF_POWERUNDER Stromausfall / Stromausfall Bei dieser Maschine wurde ein Niederspannungszustand festgestellt.

WDIOF_CARDRESET Card previously reset the CPU The last reboot was caused by the watchdog card

WDIOF_CARDRESET Card previously reset the CPU Die Watchdog-Karte verursachte den endgültigen Neustart.

WDIOF_POWEROVER Power over voltage The machine is showing an overvoltage status. Note that if one level is under and one over both bits will be set - this may seem odd but makes sense.

WDIO F_POWEROVER Überstromversorgung

Diese Maschine hat einen Überstromzustand festgestellt. Beachten Sie, dass dies seltsam erscheinen kann, wenn eine Ebene abfällt und eine Ebene auf beide Bits gesetzt ist, dies jedoch sinnvoll ist.

WDIOF_KEEPALIVEPING Keep alive ping reply The watchdog saw a keepalive ping since it was last queried.

WDIOF_KEEPALIVEPING Keep alive ping reply watchdog hat bei der letzten Anforderung eine Keepalive-Benachrichtigung erkannt.

WDIOF_SETTIMEOUT Can set/get the timeout The watchdog can do pretimeouts.

WDIOF_SETTIMEOUT Can set/get the timeout Watchdog kann Pretimeout durchführen.

WDIOF_PRETIMEOUT Pretimeout (in seconds), get/set For those drivers that return any bits set in the option field, the GETSTATUS and GETBOOTSTATUS ioctls can be used to ask for the current status, and the status at the last reboot, respectively:

WDIOF_PRETIMEOUT Pretimeout (in seconds), get/set Der Treiber, der das im Optionsfeld gesetzte Bit zurückgibt, kann mit GETSTATUS und GETBOOTSTATUS ioctl den aktuellen Status und den Status zum Zeitpunkt des letzten Neustarts überprüfen. Wie nachstehend…

int flags;
ioctl(fd, WDIOC_GETSTATUS, &flags);

or

ioctl(fd, WDIOC_GETBOOTSTATUS, &flags);

Note that not all devices support these two calls, and some only support the GETBOOTSTATUS call.

Beachten Sie, dass nicht alle Treiber diese beiden Aufrufe unterstützen und einige nur den GETBOOTSTATUS-Aufruf unterstützen.

Some drivers can measure the temperature using the GETTEMP ioctl. The returned value is the temperature in degrees fahrenheit:

Einige Treiber können GET TEMP icotl verwenden, um die Temperatur zu messen. Der Rückgabewert ist die Temperatur von Fahrenheit Grad.


int temperature;
ioctl(fd, WDIOC_GETTEMP, &temperature);

Finally the SETOPTIONS ioctl can be used to control some aspects of the cards operation:

Schließlich kann SETOPTION ioctl Anweisungen zu verschiedenen Aspekten des Kartenbetriebs geben.

int options = 0;
ioctl(fd, WDIOC_SETOPTIONS, &options);

The following options are available:

Die folgenden Optionen sind gültig.

WDIOS_DISABLECARD Turn off the watchdog timer WDIOS_ENABLECARD Turn on the watchdog timer WDIOS_TEMPPANIC Kernel panic on temperature trip

WDIOS_DISABLECARD Stoppen Sie den Watch Dock Timer WDIOS_ENABLECARD Startet den Witch Dock Timer WDIOS_TEMPPANIC Verursacht Kernel-Panik aufgrund von Temperaturfaktoren

[FIXME – better explanations]


Ursprünglich ist es Teil des Quellcodes des Linux-Kernels, daher wird es als GPLv2 behandelt (Anerkennung, dass es sein sollte).

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

Recommended Posts

Die Linux Watchdog-Treiber-API
Einführung in PlantUML beim Lesen des Linux-Treibers
Versuchen Sie es mit der Twitter-API
[Linux] Aktualisieren Sie das Paket offline
Installieren Sie JDK unter Linux
Verstehen Sie das Linux-Audit-System Audit
Zusammenfassung der Linux FD-Ereignis-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
[Linux] Verzeichnis unter dem Stammverzeichnis
Rufen Sie die API mit python3 auf.
Fügen Sie den Link unter Linux ein
Linux Gadget Serial Driver v2.0
So bringen Sie den Druckertreiber für Oki Mac in Linux
[Linux ☓ Nvidia] Kurve Steuern Sie den Lüfter
Klicken Sie in Python auf die Sesami-API
[Python] Klicken Sie auf die Google Übersetzungs-API
Probieren Sie den Linux-Kernel-Sperrmechanismus aus
Befehl [linux] kill, um den Prozess abzubrechen
AlterLinux - Über die vollständig japanisierte Linux-Distribution
Klicken Sie auf die Web-API in Python
Verwenden Sie die Flickr-API von Python
Ich habe die neuartige API von Naruro ausprobiert
[Linux] Wer ist der Hintergrundjob? ??
Greifen Sie mit Python auf die Twitter-API zu
Ich habe versucht, die checkio-API zu verwenden