在配置了libvirt pvpanic虚拟设备之后,QEMU的虚拟机内部会增加一个ISA设备。结合适当的驱动,就可以实现vm内部crash通知到host主机,以便采取相应的处理措施。
在测试Windows系统Crash是否能够触发pvpanic事件的关键点是模拟触发Windows crash,其余的环境设置和CentOS pvpanic实现和测试相似。
对于Windows物理服务器,人工触发Crash来获取memory dump:
- 设置
NMICrashDump
,通过使用一个硬件级别的远程管理接口来触发 - 设置
CrashOnCtrlScroll
,通过特定组合键来触发 - 使用NotMyFault
- 使用Bang! -- Crash on Demand Utility
- 使用WinDbg
详细请参考触发Windows Crash(获取memory dump)
在虚拟化环境中,主要采用软件方法来触发。
微软提供了一个用于触发crash,hang以及引发内核内存泄露的工具
QEMU的底层协议 QENU Machine Protocol (QMP)可以通过 libvirt 的 qemu-monitor-command
命令访问。QMP指令inject-nmi
可以触发Windows虚拟机出现一个蓝屏core dump
触发命令如下:
virsh qemu-monitor-command win2016 --pretty '{"execute":"inject-nmi"}'
这里
execute
表示执行inject-nmi
指令(完全是JSON格式),此时就会在Windows虚拟机的VNC桌面看到触发了一个蓝屏。
BANG! -- Crash on Demand Utility 是一个非常简单实用的工具,可以根据不同的Windows版本触发crash。
- 在Windows 2012(x86_64)可以选择
vlh\AMD64\osrbang.exe
运行程序后点击Crash Now
按钮,此时即发生Windows Crash。并且可以在host物理服务器的/var/log/libvirt/libvirtd.log
日志中观察到对应的虚拟机emit panic
日志。
Windows Debugger (WinDbg)可以用于debug内核和用户模式代码,分析crash dump以及检查代码执行时CPU寄存器。
Fedora Windows Virtio Drivers提供了。
从 virtio-win-0.1.103-2 开始支持 QEMU pvpanic
在Windows guest虚拟机内部可以看到如下ISA设备,但是此时因为操作系统没有安装驱动,所以暂时无法时别。同时,由于没有安装pvpanic设备驱动,Windows CRASH时候也不能传递信息给host主机的libvirtd。
参考Windows虚拟机virtio驱动版本下载当前已经安装的virtio-win
的相同版本的iso文件,然后通过 7-zip
工具解压缩,然后更新该ISA设备的驱动。
这里案例下载了
virtio-win-0.1.118.iso
,通过7-zip
解压缩成virtio-win-0.1.118
目录,其中包含了所有virtio-win
驱动。
- 在
Device Manager
中找到这个ISA未知设备,双击显示设备属性
- 点击
update driver
按钮,然后选择Browse my computer for driver software
- 选择已经解压缩的驱动文件目录,然后确认后并且进入下一步驱动搜索
- Windows会自动找到匹配的驱动并提示安装,直接确认进行安装
- 正确安装了驱动之后,则Windows会正确识别出设备
QEMU PVPanic Device
如下: