KVM虚拟机需先由宿主机通过XML配置添加i6300esb模拟watchdog设备(<watchdog model='i6300esb' action='reset'/>),再在虚拟机内安装watchdog服务、设置interval=10、realtime=yes、nowayout=0,否则无法真正触发重启。

直接在虚拟机里装 watchdog 服务没用——它只管喂狗,不管狗是不是真硬件。KVM/QEMU 虚拟机必须先由宿主机显式挂载 softdog 或 i6300esb 类型的模拟 watchdog 设备,虚拟机才能识别 /dev/watchdog 并真正触发重启。
给 KVM 虚拟机添加 softdog 模拟设备
QEMU 的 -device 参数支持注入软件模拟的 watchdog,这是最轻量、兼容性最好的方式。关键不是装包,而是让虚拟机 BIOS 看到这个设备。
- 关机状态下编辑虚拟机 XML 配置(
virsh edit vm-name),在<devices>区块内插入:
<watchdog model='i6300esb' action='reset'/>
-
model='i6300esb'是 QEMU 内置的成熟模拟器,比ib700更稳定;action='reset'表示超时后硬复位(不是关机或暂停) - 不要用
model='diag288'(s390x 架构专用)或model='wdt_i6300esb'(旧名,已弃用) - 改完保存,启动虚拟机后运行
lspci | grep -i watchdog,应看到类似00:1f.0 System peripheral: Intel Corporation 6300ESB Watchdog Timer
虚拟机内必须禁用 watchdog 关闭时的“魔术关闭”行为
Linux 内核 watchdog 驱动默认开启 nowayout 保护:一旦打开 /dev/watchdog,进程退出不写 'V' 就会立刻触发重启。但用户态 watchdog 服务重启时会先 close 再 reopen,若未正确处理,几秒后就意外重启。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 加载模块时必须加
nowayout=0参数:sudo modprobe softdog nowayout=0 - 永久生效:写入
/etc/modprobe.d/watchdog.conf:options softdog nowayout=0 - 验证是否生效:
cat /sys/module/softdog/parameters/nowayout输出应为N - 这步漏掉,
systemctl restart watchdog后虚拟机大概率在 10 秒内自动重启
watchdog.conf 里最关键的三个参数不能照抄默认值
默认配置假设你有真实硬件,而 i6300esb 模拟器实际超时窗口只有 30 秒左右,且不响应所有 ioctl。填错就会“假喂狗”——服务看似运行,实则从不重置计数器。
-
watchdog-device = /dev/watchdog:必须写对,不能是/dev/watchdog0(那是多设备场景) -
interval = 10:喂狗间隔必须 ≤ 实际超时时间的 1/3,建议设 10 秒(模拟器典型 timeout=30s) -
realtime = yes:必须启用,否则在高负载虚拟机里,watchdog进程可能被调度延迟,错过喂狗窗口 - 删掉或注释掉
temperature-device和test-binary—— 模拟器不支持温度读取,自定义脚本失败会导致服务静默退出
测试时别用 echo c > /proc/sysrq-trigger
这个命令触发的是内核 panic,但 i6300esb 模拟器在 panic 过程中可能无法完成最后的喂狗清空动作,导致结果不可复现。真要验证,得切断“喂狗源”本身。
- 先确认服务在跑:
systemctl status watchdog - 手动 kill 喂狗进程:
sudo pkill -f "watchdog.*-c /etc/watchdog.conf" - 观察 30 秒内是否重启:如果没重启,说明
interval太大或nowayout没关对 - 注意:测试前确保虚拟机开启了自动启动(
virsh autostart vm-name),否则重启后只是关机状态
最易忽略的一点:QEMU 模拟的 watchdog 不会出现在 lspci 里,除非你用了 model='i6300esb' 且虚拟机内核启用了 CONFIG_I6300ESB_WDT=m。很多教程让你查 softdog,但在 KVM 里它根本不会被虚拟机检测到——那只是宿主机的模块。

















