1. 程式人生 > >一個軟件實現的Linux看門狗—soft_wdt

一個軟件實現的Linux看門狗—soft_wdt

while reboot config port 大量 ron depend fail failed

soft_wdt(下面簡稱本軟件)是一個軟件實現的Linux看門狗。

本軟件是一款開源、免費軟件。

下載地址:

https://github.com/sunmingbao/soft-wdt/archive/master.zip



本軟件和/drivers/watchdog/softdog.c實現的軟件看門狗差點兒一樣。
基本的不同點是,前者支持一個看門狗。本軟件則支持大量的看門狗。


soft_wdt代碼編譯後。生成一個內核模塊soft_wdt.ko。




模塊載入後,將創建一個設備文件/dev/soft_wdt


用戶態程序,通過系統調用open每打開一次/dev/soft_wdt,就得到一個新的看門狗,
此看門狗的用法就和普通的看門狗一樣。


比如:
1) 向fd寫入不論什麽數據,就等於是餵狗。
2) 用戶能夠通過ioctl對看門狗進行各種操作。
3) 假設模擬載入時,模塊參數nowayout的值為0,
那麽當用戶向fd寫入一次含有字符V(註意。是大寫)的數據時,
就將此看門狗設置成了可關閉的。


以下介紹一下此軟件的用法

(一)模塊編譯


方法一、單獨編譯


在soft_wdt源代碼文件夾下。運行例如以下命令就可以
make -C /path/to/kernel/source/dir M=`pwd` modules


方法二、在Linux內核編譯體系中編譯


1. 拷貝soft_wdt.c到drivers/watchdog/文件夾下。



2. 將以下這行代碼。追加到內核源代碼的drivers/watchdog/Makefile中(在Architecture Independant部分)
obj-$(CONFIG_SOFT_WDT) += soft_wdt.o

3. 將以下的內容追加到內核源代碼的drivers/watchdog/Kconfig中(在Architecture Independant部分)


config SOFT_WDT

tristate "software watchdog timer (multiple dogs)"
default m
help
A software watchdog driver, supporting multiple dogs.
Each time, user opens the device file(/dev/soft_wdt),
a new dog was created, associated with the fd returned
by the open system call. The usage of each dog is just
the same as ordinary watchdog, including MAGIC CLOSE.
Currently the driver supports a maximum of 128 dogs.


To compile this driver as a module, choose M here: the
module will be called soft_wdt.


4. 運行make menuconfig進入watchdog驅動程序的選擇界面,然後直接退出,並保存配置。

5. 運行make modules。然後在drivers/watchdog/文件夾下。就會生成模塊文件soft_wdt.ko


(二)模塊載入


本軟件提供的模塊參數例如以下。

用戶可依據須要進行指定。


nowayout - 一旦啟動看門狗,不能夠停止 (0。no;1,yes。default=0)
timeout - 看門狗超時時間。單位:秒。 (0 ~ 65536, default=5)
no_reboot - 看門狗超時。不重新啟動系統 。(0,no; 1,yes default=0)
core_dump_ill_task - 看門狗超時時,core dump異常任務,(0,no; 1,yes default=1)


註意,core dump是通過向異常線程發送SIGABRT信號實現的。


因此。假設使用看門狗的程序。想自己記錄異常信息。能夠通過捕獲SIGABRT信號來實現。


以下是載入命令的演示樣例。




1. 使用默認參數載入(默認值如上面所列)
insmod soft_wdt.ko


2. 指定參數載入(12秒超時,看門狗可關閉。超時不重新啟動機器)
insmod soft_wdt.ko timeout=12 nowayout=0 no_reboot=1


(三)用戶態程序使用看門狗

以下是演示樣例代碼


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>

#define    SOFT_WDT_DEV    "/dev/soft_wdt"

int feed_dog_cnt;
int feed_dog_gap;

int main(int argc, char *argv[])
{
    int i;
    int  timeout;
    struct watchdog_info ident;
    
    int fd;

    if (argc<3)
    {
        printf("usage:\n %s  <feed_gap(in seconds)>  <feed_cnt>\n", argv[0]);
        return 0;
    }
    
    fd=open("/dev/soft_wdt", O_WRONLY);

    if (fd < 0)
    {
        printf("open %s failed\n", SOFT_WDT_DEV);
        exit(1);
    }


    printf("open %s succeed\n", SOFT_WDT_DEV);
    
    timeout = 7;
    printf("set timeout to %d\n", timeout);
    ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

    timeout = 0;
    ioctl(fd, WDIOC_GETTIMEOUT, &timeout);
    printf("get timeout returns %d\n", timeout);

    ioctl(fd, WDIOC_GETSUPPORT, &ident);
    printf("dog name is %s\n", ident.identity);

    printf("make the dog closable\n");
    write(fd, "V", 1);

    feed_dog_gap = atoi(argv[1]);
    feed_dog_cnt = atoi(argv[2]);
    for (i=0; i<feed_dog_cnt; i++)
    {
        printf("feed dog\n");
        write(fd, "1234", 4);
        usleep(feed_dog_gap*1000000);
    }

    printf("stop feeding dog\n");
    while (1)
    {
        usleep(1000000);
    }
    
    return 0;
}




一個軟件實現的Linux看門狗—soft_wdt