准备将 Cubieboard 留在家里,放在路由器边长期开着收收短信什么的。
有了 Watchdog Timer(看门狗计时器),一旦 Cubieboard 死机,系统将自动重启。重启由硬件实现,确保可靠性。
内核支持
需在编译 Linux 内核时开启 Watchdog Timer 支持、编译 sunxi watchdog 驱动。
选项位于Device Drivers >> Watchdog Timer Support
,勾选WatchDog Timer Driver Core
和Allwinner A10/A13 Watchdog
。可以考虑勾选Disable watchdog shutdown on close
,选择后若 watchdog 进程意外结束也将触发重启,否则 watchdog 将随 watchdog 进程的关闭而关闭。[1]
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_SUNXI_WDT=m |
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_SUNXI_WDT=m
若驱动编译为内核模块,需要手动加载:
可在/etc/modules
加入一行,系统启动时将自动加载:
加载成功后可以看见/dev/watchdog
。任意程序打开该文件将启动 watchdog,打开后必须定期“戳一下” (poking) 它,即往里写数据。[1]
安装用户空间程序
戳狗程序当然有现成的:
sudo apt-get install watchdog
sudo service watchdog start |
sudo apt-get install watchdog
sudo service watchdog start
可以留意下配置/etc/watchdog.conf,
有检测负载、内存、网络和自定义检测命令等可选功能。
U-Boot 支持
上述方案中,watchdog 只会在系统正常启动,且正常加载 sunxi_wdt,且 watchdog daemon 正常运行后才会生效。若开启 U-Boot 内置的 watchdog 支持,可在系统引导失败时重启系统。
这是可选项,我还没试过,只是看文档中有写。(嘛毕竟有山寨货了(见下文((
首先编译 u-boot-sunxi 时需启用CONFIG_WATCHDOG
。
其次修改boot.scr
,在bootm
这行之上加入watchdog 16
。该文件在引导分区,若无需自行建立。
我还没试过,就不乱说了,请参考 u-boot-sunxi/wiki#bootscr-support 配置。
需要注意的是,A10 只支持最长 16 秒的间隔时间[2]。也就是说,从加载内核、挂载分区、一直到启动 watchdog daemon 必须在 16 秒内完成,否则将触发重启。
在此之前…
由于不知道 SoC 内置了 watchdog,我翻了些零件自己山寨了一个…
山寨 Watchdog (左) 和 Cubieboard (右)
洞洞板是以前焊的,其上是一块 ATmega16U,都闲置好久了;
左边方块是一个继电器和三极管二极管电阻之类的,通过 USB 口连接着 Cubieboard 的电源;
中间蓝线连着单片机与一 GPIO 口,用一个脚本周期性输出 0,1 来戳狗。
单片机检测到超时没戳时,给继电器通电几秒,就成了..
(说来 ATmega 也内置一个 Watchdog Timer…
[1] The Linux Watchdog driver API;
[2] Allwinner A10 User Manual v1.20 (PDF), P99 10.3.25. Watch-Dog Mode Register.