一、panic device元素介绍
虚机可以通过Libvirt xml来定义创建,在xml的配置中可以配置CPU,内存,磁盘,网卡及其他外设。我们这里主要讨论devices元素下panic device子元素。
panic device可以允许libvirt从qemu guest端接收panic通知。这个功能对于以下guest类型总是激活的:
- pSeries guests,因为是由guest固件实现的。
- S390 guests,因为是S390架构的一个组成部分。
对于上面列出的guest 类型,libvirt自动添加一个panic元素到xml里。
panic配置用法示例:
... <devices> <panic model='hyperv'/> <panic model='isa'> <address type='isa' iobase='0x505'/> </panic> </devices> ... |
model:
model属性:可选,用于指定panic设备类型。当该属性未配置,使用的panic类型取决于hypervisor和guest arch。
mode取值 |
含义 |
isa |
用于ISA pvpanic设备 |
pseries |
默认值,仅对pseries guest有效 |
hyperv |
用于hyper-V crash CPU特性。从libvirt 1.3.0开始,只支持QEMU和KVM |
s390 |
s390 guest的默认值。从libvirt 1.3.5开始支持。 |
pvpanic |
用于PCI pvpanic设备。从libvirt 9.1.0开始支持,仅支持QEMU。 |
address:
panic设备地址。默认ioport是0x505。绝大多数用户不需要指定地址,对于s390,pseries,hyperv类型,是禁止指定地址的。
二、实战:
在我们的ctyunos系统宿主机上进行如下配置实战。
1、类型支持情况
pseries和s390只支持相应guest类型,所以这种配置在修改xml后保存就会有相应提示报错:
因我们使用的Libvirt6.9,还不支持pvpanic,所以配置为pvpanic也不行:
配置为hyperv可行,虚机能够正常启动:
配置为isa可行,虚机能够正常启动:
2、构造panic,libvirt接收通知
下面以配置为isa类型为例来展开。
step1:配置xml
<panic model='isa'>
<address type='isa' iobase='0x505'/>
</panic>
step2: 修改虚机/etc/default/grub,增加crash_kexec_post_notifiers配置,如:
systemctl disable kdump
systemctl stop kdump
然后重启虚机
step3:宿主机上监听虚机panic事件:virsh event vm_h37_001 --all
step4:虚机内部触发crash:
echo c > /proc/sysrq-trigger
之后虚机状态为shutoff
step5:宿主机上监听到panic事件,且查询到虚机状态为shut off(crashed)
3、同时配置kdump和 isa panic
guest内部同时激活kdump和isa panic时,当发生crash事件,kdump会捕获并处理crash,但是host主机的libvirtd就无法获得这个触发信息,则日志不能记录。只有guest内部关闭了kdump之后,host主机才能获得pvpanic信号。
当同时激活了kdump和 isa panic设备时,libvirt不能够获得panic信息,监听到的信息如下:
而虚机内部能够查到生成的kdump文件: