我们知道,通过打开/dev/watchdog
看门狗会激活并在不到一分钟内发送一个字符,它就会重置。说明是这里。
BBB使用的处理器AM335x默认情况下启用其内部看门狗。但当U-Boot或Ubuntu启动时,该看门狗被禁用。操作系统启动后/dev/watchdog
即可使用。
我想确保即使 U-Boot 或内核无法启动时看门狗也能正常工作。那么如何才能做到呢?
- 内核和 U-Boot 不应禁用看门狗定时器。
- 看门狗的默认超时时间应在 U-Boot 启动内核前一分钟以上,以便操作系统能够完全启动
我需要提及的是,更改 U-Boot 代码或 Linux 内核代码的某些部分是可以接受的。但外部看门狗不是一个选项。
答案1
经过我的调查,我发现Linux内核并没有在启动时禁用看门狗,但它实际上使用了一个定时器来重置看门狗。当内核发生错误或恐慌时,它仍然会重置看门狗,这样系统就不会因看门狗定时器溢出而重新启动。
/proc/sys/内核/恐慌
该文件提供对内核变量panic_timeout的读/写访问。如果这个值为零,内核将在恐慌时循环;如果非零,则表示内核应在此秒数后自动重新启动
显然,应该将非零值传递给该文件。根据这个答案,要传递一个值,/proc/sys/kernel/panic
我们应该修改/etc/sysctl.conf
并添加参数,kernel.panic = 3
在发生内核恐慌后重新启动之前等待 3 秒。
但这并没有解决我的问题。通过调查其他与恐慌相关的问题,我发现man proc
:
/proc/sys/kernel/panic_on_oops(自 Linux 2.5.68 起)
当遇到 oops 或 BUG 时,该文件控制内核的行为。如果该文件包含 0,则系统尝试继续操作。如果它包含 1,那么系统会延迟几秒钟(给 klogd 时间来记录 oops 输出),然后出现紧急情况。如果 /proc/sys/kernel/panic 文件也不为零,则机器将重新启动。
我的问题不是恐慌,而是内核哎呀!因此,通过添加kernel.panic_on_oops = 1
,/etc/sysctl.conf
标志/proc/sys/kernel/panic_on_oops
更改为 1。现在每当内核停止时,它都会在 3 秒后重新启动。