2个不稳定版本

0.2.0 2023年12月16日
0.1.0 2022年7月29日

576Unix APIs

Download history 315/week @ 2024-04-23 194/week @ 2024-04-30 244/week @ 2024-05-07 185/week @ 2024-05-14 265/week @ 2024-05-21 343/week @ 2024-05-28 217/week @ 2024-06-04 169/week @ 2024-06-11 115/week @ 2024-06-18 249/week @ 2024-06-25 296/week @ 2024-07-02 133/week @ 2024-07-09 64/week @ 2024-07-16 113/week @ 2024-07-23 103/week @ 2024-07-30 166/week @ 2024-08-06

461 每月下载量

MIT许可证

43KB
374 代码行数(不包括注释)

watchdog-device

Build Crate MIT licensed API

Linux Watchdog API的Rust实现。

此库简化了使用Linux内核提供的Watchdog驱动API。Watchdog用于自动检查程序是否按预期运行。以下文本改编自Linux内核文档

看门狗定时器(WDT)是一个硬件电路,可以在软件故障的情况下重置计算机系统。通常,用户空间守护进程会定期通知内核看门狗驱动程序用户空间仍然存活。当发生此类通知时,驱动程序通常会告诉硬件看门狗一切正常,看门狗应再等待一段时间以重置系统。如果用户空间失败(RAM错误、内核错误等),通知将停止发生,硬件看门狗将在超时后重置系统(导致重启)。

如果没有硬件看门狗,Linux内核通过softdog模块提供软件实现。可以通过调用以下方式加载:

# modprobe softdog

用法

要将此库集成到项目中,请在您的Cargo.toml文件中添加以下内容:

[dependencies]
watchdog-device = "0.2.0"

如果系统中存在任何/dev/watchdog*文件,则可使用看门狗。为了使用它,程序必须以具有读取/写入权限的用户身份执行。

可以存在多个看门狗。除了 /dev/watchdog 外,还可能有其他带有数字后缀的文件(例如: /dev/watchdog0 , /dev/watchdog1 等)。函数 Watchdog::new() 允许激活默认看门狗(由无后缀的文件表示)。函数 Watchdog::new_by_id() 允许通过指定数字 ID 作为参数来激活特定的看门狗(由带后缀的文件表示)。

所有驱动程序都支持基本操作模式,其中看门狗在创建 Watchdog 实例时立即激活,除非在指定时间内对看门狗进行 ping 操作,否则会重启。ping 看门狗的最简单方法是调用 keep_alive() 方法。

当设备关闭时,看门狗将被禁用,除非支持“魔法关闭”功能(见下文)。这并不总是一个好主意,因为如果看门狗守护进程中有错误并导致系统崩溃,系统将不会重启。因此,一些驱动程序支持配置选项“关闭时禁用看门狗”,CONFIG_WATCHDOG_NOWAYOUT。如果编译内核时将其设置为 Y,则一旦启动看门狗就无法禁用它。因此,如果看门狗守护进程崩溃,系统将在超时后重启。看门狗设备通常也支持 nowayout 模块参数,以便可以在运行时控制此选项。

魔法关闭功能

如果驱动程序支持“魔法关闭”,则驱动程序在释放看门狗实例之前不会禁用看门狗,除非调用 magic_close()。如果用户空间守护进程关闭看门狗而没有调用 magic_close(),驱动程序将假设守护进程(以及用户空间)已死,并停止 ping 看门狗而不先禁用它。这会导致重启,如果看门狗没有在足够的时间内重新打开。

示例

use watchdog_device::Watchdog;
use nix::errno::Errno;


let mut wd = Watchdog::new()?;
loop{
    do_something();
    if let Err(e) = wd.keep_alive(){
        println!("Error {}", e);
    }
}

测试

有一系列集成测试可用。

默认情况下,cargo test 会并行运行测试。由于它们会相互干扰,因此需要一次运行一个。

$ cargo test -- --test-threads=1

许可证

本项目受 MIT 许可证 许可。

依赖关系

~1.5MB
~37K SLoC