用户问题
客户报障磁盘卸载不了,而且是经常出现卸载不了的情况,客户比较着急,同时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。
解决虚拟机磁盘卸载失败问题:内核SHPC机制
客户报告虚拟机的磁盘卸载经常失败,尤其是legacy磁盘。调查发现,由于guest内核未启用SHPC机制,导致PCI设备无法热插拔。通过编译不同配置的内核进行测试,确认CONFIG_HOTPLUG_PCI_SHPC需设为Y才能正常卸载设备。建议检查和确保相关内核配置正确,特别是对于云服务提供商的镜像。
1万+

被折叠的 条评论
为什么被折叠?



