【问题标题】:From userspace, how can I tell if Linux's soft watchdog is configured with no way out?从用户空间,我如何判断 Linux 的软看门狗是否配置为没有出路?
【发布时间】:2009-02-18 04:13:19
【问题描述】:

我正在为 Linux 编写一个系统监视器,并希望包含一些看门狗功能。在内核中,即使 /dev/watchdog 关闭,您也可以配置看门狗继续运行。换句话说,如果我的守护进程正常退出并关闭 /dev/watchdog,系统仍会在 59 秒后重新启动。这可能是用户想要的行为,也可能不是。

我需要让我的守护进程知道这个设置,因为它会影响我处理 SIGINT 的方式。如果设置为开启,我的守护进程将需要(最好)在退出时开始有序关闭,或者(至少)警告用户系统即将重新启动。

有人知道从用户空间获取此设置的方法吗?我在 sysconf() 中看不到任何获取值的内容。同样,我需要能够判断软件看门狗是否已启用。

编辑:

Linux 提供了一个非常简单的看门狗接口。进程可以打开 /dev/watchdog ,一旦设备打开,内核将开始倒计时 60 秒以重新启动,除非将一些数据写入该文件,在这种情况下时钟会重新设置。

根据内核的配置方式,关闭该文件可能会也可能不会停止倒计时。来自文档:

看门狗可以在没有的情况下停止 如果设备导致重启 /dev/watchdog 正确关闭, 除非你的内核是用 CONFIG_WATCHDOG_NOWAYOUT 选项 已启用。

我需要能够判断 CONFIG_WATCHDOG_NOWAYOUT 是否是在用户空间守护进程中设置的,这样我才能以不同的方式处理所述守护进程的关闭。换句话说,如果该设置很高,那么简单:

# /etc/init.d/mydaemon stop

... 将在 59 秒内重新启动系统,因为不再向 /dev/watchdog 写入任何内容。因此,如果它设置为高,我的 SIGINT 处理程序需要做额外的事情(即至少警告用户)。

我找不到从用户空间获取此设置的方法:(感谢任何帮助。

【问题讨论】:

    标签: c linux watchdog


    【解决方案1】:

    啊哈!在挖掘内核的linux/watchdog.hdrivers/watchdog/softdog.c 之后,我能够确定softdog ioctl() 接口的功能。查看它在struct watchdog_info 中宣布的功能:

    static struct watchdog_info ident = {
                    .options =              WDIOF_SETTIMEOUT |
                                            WDIOF_KEEPALIVEPING |
                                            WDIOF_MAGICCLOSE,
                    .firmware_version =     0,
                    .identity =             "Software Watchdog",
            };
    

    确实支持(似乎)覆盖CONFIG_WATCHDOG_NOWAYOUT 的魔术关闭。所以,正常终止时,我必须写一个字符'V'到/dev/watchdog 然后关闭它,计时器将停止计数。

    文件描述符上的简单ioctl()/dev/watchdog 询问WDIOC_GETSUPPORT 允许确定是否设置了此标志。伪代码:

    int fd;
    struct watchdog_info info;
    
    fd = open("/dev/watchdog", O_WRONLY);
    if (fd == -1) {
       perror("open");
       // abort, timer did not start - no additional concerns
    }
    
    if (ioctl(fd, WDIOC_GETSUPPORT, &info)) {
        perror("ioctl");
        // abort, but you probably started the timer! See below.
    }
    
    if (WDIOF_MAGICCLOSE & info.options) {
       printf("Watchdog supports magic close char\n");
       // You have started the timer here! Handle that appropriately.
    }
    

    使用硬件看门狗时,您可能希望使用O_NONBLOCK 打开,因此ioctl() 而不是open() 块(因此检测到忙卡)。

    如果不支持WDIOF_MAGICCLOSE,则应假定软看门狗配置为NOWAYOUT。请记住,只需打开设备即可成功开始倒计时。如果您正在做的只是探测它是否支持魔法关闭并且确实支持,那么魔法关闭它。否则,请务必处理您现在有一个正在运行的看门狗的事实。

    不幸的是,如果不实际启动它,就没有真正的方法可以确定它,至少我找不到。

    【讨论】:

    • API 规范中的 Magic Close 和 IOCTL 的详细信息证实了上述 cmets,但提供了更多背景详细信息。例如,请参阅this。首先找到here
    【解决方案2】:

    看门狗可防止系统因软件崩溃或硬件故障而硬锁定。

    您需要的是一个守护程序监控守护程序 (dmd)。检查“监控”

    【讨论】:

    • 我正在编写一个 DMD,专门用于具有一些 nagios 风格功能的半虚拟化 xen 来宾(sysinfo 数据写入 xenbus,特权域可以在其中查看)。请查看对该问题的其他修改,我不够清楚。
    【解决方案3】:

    我认为看门狗设备驱动程序确实适用于嵌入式平台(或至少是控制良好的平台),在这些平台上,开发人员可以控制正在使用的内核。

    这可以被认为是疏忽,但我认为不是。

    您可以尝试另一件事,如果看门狗是作为可加载模块构建的,那么卸载它可能会中止关机?

    【讨论】:

    • 如果软狗是一个可加载的模块,生活变得非常容易,因为它在加载时也接受参数(是的,卸载会停止它)。问题是,在嵌入式系统上(正如你所说,我正在研究)你经常看到单体内核,所有内容都是静态对象。
    • 我认为这是,实际上有点疏忽,这就是为什么他们后来更改了软看门狗以服从神奇的关闭字符..即向设备写入单个“V”,然后关闭它,总是停止倒计时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多