前言:
在虚拟化场景下,我们尽量会尝试使用带外监控的方式,来发现虚拟机的异常。pvpanic就是一种常见的方式,虚拟化场景的windows蓝屏检查也是基于如此。
有了检查的能力,可以快速处理,回复业务执行,或者启用HA等。
分析:
1,isa device
由QEMU虚拟化出来设备,接在ISA总线上,默认使用IO port 0x505。
2,guest
加载pvpanic driver的时候,向kernel注册一个notifier到panic_notifier_list上。
Guest中发生kernel panic的时候,会通知panic_notifier_list上的所有notifier。
pvpanic的notifier写IO port 0x505。
3,qemu
QEMU截获到IO port 0x505写操作,感知到Guest发生了kernel panic。
把消息发给libvirt。这样,libvirt就可以处理对应的事件,其他用户进程也可以通过长连接,监控guest的panic。
4,how to
config libvirt xml : <panic model='isa'> <address type='isa' iobase='0x505'/> </panic> config guest boot arguments and reboot guest : append “crash_kexec_post_notifiers” after linux boot arguments listen guest panic event on host : #virsh event INSTANCEID –all trigger kernel panic on guest : #echo 1 > /proc/sys/kernel/sysrq #echo c > /proc/sysrq-trigger
5,about “crash_kexec_post_notifiers”
代码选自linux-4.4,如果没有配置“crash_kexec_post_notifiers”,那么,配置了kdump的情况下,会发生kdump,不会再继续执行到panic_notifier_list里面注册的notifier。
确认upstream,目前逻辑也是如此。
所以,需要在guest的boot args里面配置“crash_kexec_post_notifiers”确保带外可以监控到。