如何重置我的嵌入式 Linux 设备的看门狗

如何重置我的嵌入式 Linux 设备的看门狗

有没有类似的命令

vi > out
vi | out

我可以用它来重置我的嵌入式 Linux 设备的看门狗吗?

答案1

如果您的系统上有一个看门狗并且有一个使用 的驱动程序/dev/watchdog,那么您所要做的就是终止为其提供数据的进程;如果没有这个过程,那么你可以touch /dev/watchdog打开一次,如果你不再触摸它,它就会重置。

您可能还对使用“magic sysrq”方式重置设备感兴趣。如果您的内核已CONFIG_MAGIC_SYSRQ编译了该功能,则可以echo 1 > /proc/sys/kernel/sysrq启用它,然后echo b > /proc/sysrq-trigger重新启动。当您执行此操作时,它会立即重新启动,而无需卸载或同步文件系统。

答案2

如果您认为看门狗运行正常,并且想要测试它是否确实能够恢复崩溃的系统,那么您可以通过使用“magic sysrq”使系统因内核恐慌而崩溃,从而比 Shawn 的答案更好。首先同步文件系统是个好主意,因此请以 root 身份执行以下操作:

sync; sleep 2; sync; echo c > /proc/sysrq-trigger

如果启用了 sysrq,这应该会导致内核恐慌。然后,如果您等待大约 60 秒(看门狗模块的典型超时),您应该会看到机器重新启动。请注意,这仅适用于硬件看门狗,不适用于“软狗”模块。

答案3

终止看门狗进程是一种方法,但请注意,这并不是万无一失的:行为取决于特定的看门狗驱动程序,请参阅内核文档,特别是关于“Magic Close”和CONFIG_WATCHDOG_NOWAYOUT.根据内核配置的不同,答案sysrq也可能会给您带来误报 ( CONFIG_PANIC_TIMEOUT)。

我认为最直接的方法是编写自己的、简单且故意破坏的看门狗。以下程序(基于内核中包含的示例)对我有用:

// SPDX-License-Identifier: GPL-2.0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#include <sys/ioctl.h>
#include <linux/watchdog.h>

int main(void)
{
    int fd = open("/dev/watchdog", O_RDWR);
    if (fd == -1) {
        perror("watchdog");
        exit(EXIT_FAILURE);
    }
    int timeout;
    ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
    printf("The timeout was %d seconds\n", timeout);
    timeout = 1;
    ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
    printf("The timeout is now %d seconds. The system should reset soon...\n", timeout);
    while (1) {
        printf("Still here...\n");
        sleep(1);
    }
}

像例如一样运行它gcc prog.c && sudo sync && sudo ./a.out

答案4

只需将其放在前两篇文章的一行中即可:

echo 1 | sudo tee -a /proc/sys/kernel/sysrq; sync; sleep 2; sync; echo c | sudo tee -a /proc/sysrq-trigger

相关内容