Linux guest内触发宿主机级重启需依赖libvirt/QEMU模拟的i6300esb硬件watchdog设备,配置model='i6300esb'和action='reset'后,guest通过/dev/watchdog喂狗失败时宿主机才执行VM重置;ESXi等平台不支持该机制。

Linux guest 内如何触发宿主机级重启(非仅 guest 自重启)
单纯在虚拟机内部写入 /dev/watchdog 只会让 guest 自己重启,**不会通知宿主机做任何事**。要实现“guest 假死后,宿主机主动杀掉并重启该 VM”,必须依赖虚拟化层提供的 watchdog 设备模拟机制,而非 guest 自身的软件看门狗。
- guest 内启用的
softdog模块(如modprobe softdog)只影响 guest 内核行为,超时后触发的是 guest 内部 panic 或 reboot,宿主机完全无感知 - 真正能联动宿主机的,是 libvirt/QEMU 模拟的硬件 watchdog 设备(如
i6300esb),它在 guest 内表现为一个 PCI 设备,驱动加载后会映射到/dev/watchdog,但其底层 I/O 会透传给宿主机的 QEMU 进程 - 只有当 guest 写入该设备失败(或未按时喂狗),QEMU 才会根据配置的
action执行对应操作,比如reset、poweroff或pause
libvirt XML 中必须配置的 watchdog action 和 device 类型
若用 libvirt 管理虚拟机,watchdog 生效的前提是:XML 定义中明确声明了设备类型和触发动作。漏掉任意一项,/dev/watchdog 在 guest 内打开成功,但超时后宿主机不会响应。
- 设备类型必须为
i6300esb(OpenStack Nova 仅支持此类型;ib700在某些 QEMU 版本中不触发 action) -
action必须显式设为reset或poweroff,不能是none或留空(默认值是none) - 示例片段(需插入
内):
<watchdog model="i6300esb" action="reset"><address type="pci" domain="0x0000" bus="0x00" slot="0x05" function="0x0"></address> </watchdog>
注意:address 部分可省略,libvirt 会自动分配;但 model 和 action 缺一不可。
guest 内喂狗失败的典型表现与验证方式
即使 XML 配置正确,guest 内仍可能因驱动未加载、权限不足或写入逻辑错误导致喂狗失效——此时你看到的是 guest 卡死不动,而不是宿主机执行 reset。
- 确认 guest 是否加载了对应驱动:
lsmod | grep -E 'i6300esb|watchdog';若无输出,需modprobe i6300esb - 检查设备节点是否存在且可写:
ls -l /dev/watchdog(应为c 10, 130,且 root 可写) - 手动测试喂狗是否透传:运行
echo v > /dev/watchdog(合法 magic close)后立刻sleep 30,若配置正确,30 秒后宿主机应执行reset - 常见错误现象:
write: Permission denied(SELinux 限制)、No such device(驱动未加载)、Device or resource busy(已被其他进程 open)
ESXi / VMware 场景下无法复用 Linux watchdog 机制
ESXi 不支持 libvirt 那套 i6300esb 模拟,也没有用户态 watchdog daemon 的透传通道。你在 ESXi guest 里看到的 vmkernel: watchdog timeout on cpu 3 是 ESXi 自身的 hypervisor 级检测,它只反映该 vCPU 被 guest 长期独占,**并不等价于 guest 主动请求宿主机重启自己**。
- ESXi 的 watchdog timeout 是单向诊断信号,用于记录日志和触发 panic dump,不是可编程的控制接口
- VMware Tools 中无 watchdog 相关 API;vSphere API 也未暴露“由 guest 触发宿主机重置本 VM”的能力
- 真实生产中,若需类似效果,只能靠外部监控系统(如 Zabbix + vSphere SDK)定期探测 guest SSH/HTTP 健康状态,异常时调用
vim-cmd vmsvc/power.reset
真正能靠 guest 一侧代码驱动宿主机动作的,只有 KVM+libvirt+i6300esb 这一条路径。其它平台要么不支持,要么需要绕开 guest、依赖外部轮询——这点容易被文档误导,务必在测试环境先验证透传是否生效。











