guest内核不响应导致磁盘卸载问题排查

客户报告虚拟机的磁盘卸载经常失败,尤其是legacy磁盘。调查发现,由于guest内核未启用SHPC机制,导致PCI设备无法热插拔。通过编译不同配置的内核进行测试,确认CONFIG_HOTPLUG_PCI_SHPC需设为Y才能正常卸载设备。建议检查和确保相关内核配置正确,特别是对于云服务提供商的镜像。

用户问题

客户报障磁盘卸载不了,而且是经常出现卸载不了的情况,客户比较着急,同时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。

### VirtualBox 中 Ubuntu 出现内核恐慌的解决方案 当在 Oracle VM VirtualBox 上运行的 Ubuntu 虚拟机发生内核恐慌时,通常是因为系统遇到了严重的错误无法继续正常操作。以下是可能的原因及其对应的解决方案: #### 可能原因及解决方法 1. **内存足** 如果分配给虚拟机的内存过低或者过高,可能会导致内核恐慌。建议调整虚拟机的内存大小至合理范围(例如 2GB 至 4GB),具体取决于宿主机的可用资源。 此外,在启用 `kdump` 功能的情况下,需确保预留了足够的内存用于捕获崩溃转储。修改 `/etc/default/grub` 文件,添加 `crashkernel=256M` 参数到 `GRUB_CMDLINE_LINUX` 并更新 GRUB 配置[^1]。 ```bash sudo nano /etc/default/grub ``` 将以下内容加入 `GRUB_CMDLINE_LINUX`: ```plaintext crashkernel=256M ``` 更新 GRUB 配置并重启系统: ```bash sudo update-grub sudo reboot ``` 2. **磁盘空间足** 当根分区或交换分区的空间耗尽时,可能导致内核恐慌。检查磁盘使用情况,并清理必要的文件以释放空间。 使用命令查看磁盘占用情况: ```bash df -h du -sh / ``` 3. **兼容的内核模块** 安装了与当前内核版本兼容的第三方驱动程序或模块也可能引发内核恐慌。卸载最近安装的可疑模块,并重新编译或加载合适的驱动程序。 查看已加载的模块列表: ```bash lsmod modinfo <module_name> ``` 卸载问题的模块: ```bash rmmod <module_name> ``` 4. **硬件加速未开启** 若虚拟化技术支持(如 VT-x/AMD-V 和 Nested Paging)被禁用,则会降低性能甚至触发异常行为。确认 BIOS 设置中启用了相关功能,并验证 VirtualBox 是否正确配置了处理器扩展特性[^3]。 启动 VirtualBox GUI 或者编辑 `.vbox` 文件手动指定 CPU 特性: ```xml <Hardware version="2"> ... <CPU count="2" hotplug="false"> <HardwareVirtEx enabled="true"/> <PAE enabled="true"/> <LongMode enabled="true"/> </CPU> ... </Hardware> ``` 5. **日志分析** 深入调查问题根源需要收集详细的诊断信息。利用 dmesg 工具读取实时消息缓冲区的内容,定位具体的失败位置。 获取最新的 kernel panic 日志片段: ```bash dmesg | tail -n 50 journalctl -xe ``` 6. **升级 VirtualBox 和 Guest Additions** 确认使用的 VirtualBox 版本是最新的稳定发布版,同时保持 guest additions 的同步更新以便获得最佳兼容性和修复潜在缺陷。 下载最新版本并按照官方文档指引完成迁移过程[^3]: ```bash sudo apt-get install virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11 ``` --- ### 示例代码:自动检测和处理部分常见问题 下面是一段简单的脚本用来辅助排查基本环境变量设置是否恰当: ```bash #!/bin/bash echo "Checking system resources..." free -m && df -hT / if [[ $(grep -c 'vmx\|svm' /proc/cpuinfo) -eq 0 ]]; then echo "[WARNING] Hardware acceleration (VT-x or AMD-V) is not available!" fi echo "Verifying kdump configuration..." cat /boot/grub/grub.cfg | grep crashkernel || echo "[ERROR] Crashkernel parameter missing from grub config." systemctl status kdump.service --no-pager ``` 保存上述脚本为 `check_vbox.sh` ,赋予执行权限后运行它即可快速获取初步状态概览。 --- ### 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值