开启树莓派看门狗

树莓派内核默认没有启用看门狗功能,当内核挂死时将进入“死机”状态或kgdb调试状态,并不会自动重启系统。本文为树莓派开启看门狗功能并通过内核线程周期性喂狗,当出现系统崩溃时会自动重启Linux系统。

加载看门狗模块

sudo modprobe bcm2835_wdt

/etc/modules里添加信息

bcm2835_wdt

启用硬件看门狗

sudo su
echo 'dtparam=watchdog=on' >> /boot/config.txt
reboot

安装看门狗系统服务

sudo apt-get update
sudo apt-get install watchdog

如果安装过程报错,请看我的这篇文章对你是否有帮助
看门狗安装报错解决办法

配置看门狗服务

sudo su
echo 'watchdog-device = /dev/watchdog' >> /etc/watchdog.conf
echo 'watchdog-timeout = 15' >> /etc/watchdog.conf
echo 'max-load-1 = 24' >> /etc/watchdog.conf

启用服务

su pi
sudo systemctl enable watchdog
sudo systemctl start watchdog
sudo systemctl status watchdog

如果启用正常,会得到以下结果
在这里插入图片描述
如果要对此进行测试,可以尝试在shell上运行fork炸弹,模拟系统卡死情况:

sudo bash -c ':(){ :|:& };:'

https://diode.io/raspberry%20pi/running-forever-with-the-raspberry-pi-hardware-watchdog-20202/


启用bcm2835_wdt模块:

sudo modprobe bcm2835_wdt
在/etc/modules文件末尾添加一行:(sudo nano /etc/modules Linux下nano编辑器的使用 )

bcm2835_wdt
安装watchdog模块

sudo apt-get install watchdog
编辑/etc/watchdog.conf文件进行编辑配置看门狗: (sudo /etc/watchdog.conf Linux下nano编辑器的使用 )

#ping                   = 172.31.14.1
#ping                   = 172.26.1.255
#interface              = eth0
#file                   = /var/log/messages
#change                 = 1407
# 如果要使能,请去掉行前的注释标号,设置其中一个的值为0来禁用
# 这些值应设定为在正常使用期间不会重启你的设备的值
# (如果你的机器真的死机了,平均载入进程量应该超过25)
#max-load-m=n表示在m分钟内开超过n个进程的时候重启
max-load-1              = 24
#max-load-5             = 18
#max-load-15            = 12
# 注意这是内存分页的数量
# 请检查你的机器的分页大小以获取真实的大小
#最小剩余内存
#min-memory             = 1
#最小可分配内存
#allocatable-memory     = 1
#repair-binary          = /usr/sbin/repair
#repair-timeout         =
#test-binary            =
#test-timeout           =
#选择看门狗设备,这里用默认值
watchdog-device = /dev/watchdog
# 已经编译进二进制文件的默认值
#这个文件里面的内容就是CPU温度(摄氏温标)的一千倍
temperature-device      = /sys/class/thermal/thermal_zone0/temp
#设定为重置温度的一千倍
max-temperature = 75000
# 已经编译进二进制文件的默认值
#admin                  = root
#interval               = 1
#logtick                = 1
#log-dir                = /var/log/watchdog
# 这极大地减少了在你的机器真正加载完成前看门狗不被列入进程表的几率
realtime                = yes
priority                = 1
# 使能下面这行来检查rsyslogd是否仍然在运行
#pidfile                = /var/run/rsyslogd.pid

使看门狗服务开机自动启动:

sudo systemctl enable watchdog.service


测试看门狗:

sudo bash -c ':(){ :|:& };:'

所谓看门狗就是检测功能性软件是否还在运转的软件或硬件模块。当它检测到软件没有在工作时,就会重启机器,使得软件在重启之后能够继续工作。它的检测方式很简单,就让功能性软件定时的发信号给它(所谓的喂狗),一旦一定时间内没有接收到信号,那么就认为软件已经停止运行了,系统就需要重启了。在树莓派的硬件中就有看门狗的功能。下面我们就来玩玩这条狗。

教程目的:

用脚本的方式来喂狗,并试验当脚本停止喂狗后,树莓派会重启。(网上大量流传着下载watchdog这个软件来进行喂狗工作,本教程是自己写shell来喂狗的。当然,也是很简单的。)

教程器材及软件:

树莓派的板子。
SD卡(已经有镜像刷入)。
电源线及USB充电器。
U盘或USB硬盘
putty和psftp。
有DHCP的网线。
步骤:

先打开内核模块中的看门狗功能:
sudo modprobe bcm2708_wdog
(如果,你要在树莓派启动的时候,就启动看门狗功能。那么你需要在/etc/modules文件中加入,一行:bcm2708_wdog)
开启这个之后,你就可以在/dev目录下看到一个叫watchdog的文件。
执行完上面的命令,狗还不需要喂。但是一旦,你打开了这个文件(所谓,打开一种是c语言里的fopen,另一种就是等价的在shell中使用读写该文件的命令),就需要开始喂狗。喂狗的方式就是输入任何字符后数字除了V以外。此时,哪怕你关闭了文件,狗还是需要喂的。知道你输入V,才可以停止喂狗。有了这样子的原理,写一个喂狗的脚本就容易了。

!/bin/bash

while((1))
do
sleep 3
echo “Feed the dog”
echo “Feed the dog!” > /dev/watchdog
done
然后,运行这个脚本一段时间,一直喂狗,然后中断他。(Ctrl+C)
过了一会,树莓派就重启了。