用户问题
客户报障磁盘卸载不了,而且是经常出现卸载不了的情况,客户比较着急,同时PDD也是大客户。
排查过程
查看宿主机上虚拟机信息
1、用户虚拟机有14块磁盘,而且这14块都是以legacypci的方式插入虚拟机,我印象中应该是12块盘是modern,其他才是legacypci。先不管legacy和modern,都应该要卸载成功。
pcie 走的 PCIe native hotplug机制,pci走的SHPC热插拔机制, root pci 支持的slot上限为32个
qemu里有三种hotplug实现:
1、ACPI (Advanced Configuration and Power Interface) ( for piix/q35的 cpu/mem 热插拔/ 2. piix的pci设备)
2、SHPC (Standard Hot Plug Controller) (for pci bridge/pcie-pci bridge)
3、PCIe native hotplug (for pcie port)
处理流程:
qemu流程: device_del → handler→request_unplug():
整体流程:
-
click attention button
-
发送 SHPC interrupt
-
guest 内核取消设备配置,关闭设备slot 电源
客户虚机现象:
1、手动调用libvirt 执行挂卸载legacy设备,在虚拟机内部均不能生效
2、手动调用libvirt 执行挂卸载modern设备,都可以成功生效
查看guest内部
1、发现 pci 下没有 slot
2、发现/boot/config 文件里的 CONFIG_HOTPLUG_PCI_SHPC 没有设置
通过上面两个基本可以判断 guest 内部没有开启 shpc 机制。于是我们准备进行接下来的验证测试。
测试验证:
1、编译一个不设置 CONFIG_HOTPLUG_PCI_SHPC 的内核,并安装。结果是不能热插拔pci设备
2、编译一个设置 CONFIG_HOTPLUG_PCI_SHPC =Y 的内核,并安装。结果是能正常挂卸载设备
结论:
guest内核没有使能 shpc,导致卸载pci设备失败。
后续工作:
检查失败时检查下 /boot/config- 文件里的 CONFIG_HOTPLUG_PCI_SHPC 等相关配置项,这个值必须设置成 Y或者m,不能不设置,也不能设置成其他值。
镜像或者ts 检查这些问题的时候,可以查看 /boot/config- 下配置是否正确,参考其他云厂商的配置应该有如下配置项:
CONFIG_HOTPLUG_SMT=y
CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG_SPARSE=y
CONFIG_HOTPLUG_CPU=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_HOTPLUG_MEMORY=y
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_ACPI=y
CONFIG_HOTPLUG_PCI_ACPI_IBM=m
CONFIG_HOTPLUG_PCI_SHPC=y
配置值为y的严格按照y来,配置值为m的 可以是m也可以是y。