问题现象
在部分高版本内核的ECS实例中热拔virtio设备(例如磁盘、网卡)时,操作系统会发生如下Oops异常:
在配置了kernel.panic_on_oops = 1的实例中,会发生内核Panic异常。
在配置了kernel.panic_on_oops = 0的实例中,会出现hung错误。
说明
在Linux内核中,kernel.panic_on_oops是一个内核参数,用于控制当内核遇到Oops(一种内核错误,通常包括访问无效内存地址时发生的情况)时的行为。
如果内核出现Panic异常,系统会立即停止运行当前的所有任务,保存一些调试信息,然后重启或者关机,有助于快速响应问题并减少潜在的损害。
如果内核出现hung错误,内核可能会尝试继续运行,在生产环境中不推荐该配置,因为可能会进一步导致数据损坏或其他严重损害。
问题原因
Linux上游社区在内核社区中添加了对virtio设备Admin Virtqueue的支持:commit详情。
在该commit中:
对virtio_pci_device的定义中添加了一个is_avq的函数指针,用于判断是否存在Admin Virtqueue。
在modern virtio设备的初始化函数virtio_pci_modern_probe中添加了对is_avq函数指针的赋值。
在热拔virtio设备时,代码会检查当前队列是否为Admin Virtqueue。
但是上游社区忽略了一个问题:如果该virtio设备不是一个modern virtio设备,而是一个legacy virtio设备时,并没有对is_avq函数指针进行赋值,导致legacy virtio设备中的virtio_pci_device结构体中的函数指针is_avq是一个空指针(NULL Pointer)。此时如果热拔virtio设备,调用到if (vp_dev->is_avq(vdev, vq->index)) 代码时,CPU的RIP寄存器执行了一个空指针地址,从而触发了空指针异常,也就是尝试执行一个无效的内存地址,这是操作系统不允许的,会导致程序崩溃或系统错误。
影响范围
Linux上游社区
上游社区已经针对该问题进行了修复:commit详情。在该commit中,对is_avq函数指针是否为空的情况进行了判断,修复了该问题。
操作系统
Ubuntu 24
其他内核版本在6.8左右的操作系统,且这些操作系统合入了Admin Virtqueue能力(virtio-pci: Introduce admin virtqueue),但是内核没有修复is_avq函数指针判断问题(virtio-pci: Check if is_avq is NULL)。
说明
您可以通过uname -r命令查询内核版本。
virtio设备
实例使用了legacy virtio设备,并在进行热拔操作。
解决方案
方案一:更换modern virtio设备的实例规格族。具体操作,请参见修改实例规格。
建议使用以下实例规格族,以下规格族是modern virtio设备,不受该问题影响。
ecs.c8i、ecs.g8i、ecs.r8i、ecs.hfg8i、ecs.hfc8i、ecs.hfr8i、ecs.g8ise、ecs.c8ae、ecs.g8ae、ecs.r8ae、ecs.c8a、ecs.g8a、ecs.r8a。更多信息,请参见实例规格族。
方案二
升级最新内核软件包,并确认最新软件包是否已合入is_avq函数指针判断的补丁包:virtio-pci: Check if is_avq is NULL。
(条件必选)如果最新的内核中没有合入is_avq函数指针判断的补丁包,请自行合入。
附录:名词解释
关于文档中涉及的virtio设备、Admin Virtqueue、virtio_pci_device等名词解释说明如下:
名词 说明
virtio设备 virtio是一种标准化的虚拟化设备通信框架,允许虚拟机高效地与宿主机上的虚拟硬件设备交互。virtio设备是在虚拟化环境中模拟出来的硬件设备(如磁盘、网卡),分为传统legacy virtio和现代modern virtio两类,主要区别在于使用的配置接口不同。
Admin Virtqueue 是一个特殊的virtio队列,用于执行设备的管理操作,比如获取设备状态、配置设备等。并非所有virtio设备都支持Admin Virtqueue。
virtio_pci_device 是在内核中表示一个virtio PCI设备的数据结构,包含了指向各种功能函数的指针,其中之一就是新添加的is_avq函数指针,用于判断给定的队列是否为Admin Virtqueue。
is_avq 该函数用于判断给定的virtio队列是否为Admin Virtqueue。
阿里云数据解决方案[39] 阿里云是什么[38] 阿里云产品报价[36] 阿里云产品介绍[35] 阿里云解决方案[35] 阿里公有云介绍[35] 云规划设计与实施服务[34] 阿里公有云产品[34] 云与计算培训服务[30] 阿里云优势[30] 阿里云官网登陆[30] 阿里云服务器配置[30] 阿里私有云搭建方案[30] 云与计算咨询服务[28] 阿里云服务器[28] 阿里云服务器成功案例[28] 公有云私有云混合云[27] 阿里云官网[27] 阿里公有云提供哪些计算服务[27] 阿里弹性云服务器[27] 阿里云智慧教育解决方案[26] 阿里公有云官网[26] 阿里公有云服务[26] 阿里私有云方案[26] 大数据使能服务[25] 阿里云园区解决方案[25] 阿里私有云平台[25] 阿里云服务器试用[24] 云迁移与运营支撑服务[21] 阿里私有云架构[20] 阿里私有云解决方案[20] 阿里云提供的服务[18] 阿里云智慧制造解决方案[18] 阿里云服务总代理[18] 阿里云云主机[17] 阿里云安全[17] 阿里私有云[17] 阿里云服务服务中心[16] 阿里云服务核心分销商[16] 阿里公有云架构解决方案[16] 阿里私有云搭建[16] 阿里云备份[15] 阿里云服务器ECS[15] 阿里云软件开发服务[15] 阿里公有云行业解决方案[15] 阿里私有云服务[15] 阿里私有云的搭建方案[15] 阿里私有云网格结构[15] 阿里私有云部署架构[15] 阿里云智慧校园解决方案[14] 阿里云漏洞扫描[14] 阿里云网站建设服务器[14] 阿里云邮箱[14] 阿里云块存储[13] 阿里云弹性云服务器应用[13] 阿里云数据库[13] 阿里云服务器应用[13] 阿里云桌面系统集成商[13] 阿里云迁移解决方案[13] 云与计算客户支持与运维使能服务[12] 阿里云桌面总代理商[12] 阿里云速建站[12] 阿里云产品服务[11] 智慧教育云平台解决方案[10] 阿里云场景化解决方案[10] 阿里云域名注册[10] 阿里云速智能客服[10] 阿里公有云架构[10] 阿里智慧云课堂解决方案[10] 阿里公有云视讯解决方案[9] 阿里私有云产品有哪些[9] 智慧教育云计算解决方案[8] 阿里公有云平台[8] 阿里公有云解决方案[8] 阿里公有云通用解决方案[8] 阿里私有云服务器[8] 阿里云智慧***解决方案[6] 阿里公有云和私有云区别[6] [5] 云与计算客户支持服务[5] 云盘基础操作[5] 阿里公有云是什么[5] 阿里公有云解决方案服务定制领导者[5] 阿里私有云解决方案服务定制领导者[5] 阿里虚拟私有云vpc[5] 扩容云盘[4] 阿里云HTTPS加密访问[4] 阿里云共建智能世界云底座[4] 阿里云域名解析[4] 阿里云应用镜像(13款)[4] 阿里公有云[4] 大数据使能服务[3] 阿里云园区解决方案[3] 阿里公有云产品[3] 加密云盘[3] 阿里云代理公司有哪些[3] 阿里云官网网站[3] 阿里云手机代理加盟[3] 阿里云经销商[3] 阿里公有云专属云主机DeH服务[3] 阿里云官网[2] 阿里云解决方案[2] 阿里公有云架构[2] 阿里私有云搭建[2] 云规划设计与实施服[2] 阿里云企业邮箱服务[2] 阿里云企业邮箱服务 (SAAS,云邮箱)[2] 阿里云数据解决方案 [2] 智慧教育云计算解决方案[1] 阿里云产品服务[1] 阿里云域名注册[1] 云与计算咨询服务[1] 阿里云云主机[1] 阿里云产品报价[1] 阿里云产品服务[1] 阿里云优势[1] 阿里云智慧制造解决方案[1] 阿里云智慧校园解决方案[1] 阿里云服务器ECS[1] 阿里云服务器应用[1] 阿里云服务器成功案例[1] 阿里云服务器试用[1] 阿里云服务器配置[1] 阿里云服务核心分销商 [1] 阿里云速智能客服[1] 阿里公有云平台[1] 阿里私有云搭建方案[1] HTTPS加密访问(CA证书)[1] 专属块存储集群[1] 专属块存储集群概述[1] 主机新用户使用指南[1] 云盘加密概述[1] 云盘扩容指引[1] 修改云盘标签[1] 加密数据盘[1] 加密系统盘[1] 单实例[1] 卸载或挂载系统盘[1] 卸载数据盘[1] 基础环境配置[1] 如何选购云虚拟主机[1] 快照灵活易用[1] 扩容云盘容量[1] 扩容分区和文件系统(Windows)[1] 提供DDoS防护[1] 撒[1] 最新一代CIPU网络[1] 查看磁盘序列号[1] 网站开通要素[1] 腾讯云园区解决方案[1] 腾讯云数据解决方案[1] 腾讯云解决方案[1] 转换MBR分区为GPT分区[1] 释放云盘[1] 镜像跨地域无缝迁移[1] 阿里云[1] 阿里云主备架构[1] 阿里云产品报价 云规划设计与实施服务[1] 阿里云企业级能力[1] 阿里云原生MySQL生态[1] 阿里云原生数据库 PolarDB[1] 阿里云备份恢复[1] 阿里云官方网站,网络安全隔离[1] 阿里云客户端[1] 阿里云故障切换[1] 阿里云数据传输服务 DTS[1] 阿里云数据库 MongoDB 版[1] 阿里云数据库 RDS MySQL 版[1] 阿里云数据库自治服务 DAS[1] 阿里云数据管理 DMS[1] 阿里云智慧解决方案[1] 阿里云智慧***解决方案[1] 阿里云服务器ECS[1] 阿里云自动分区[1] 阿里云解决方案 [1] 阿里云速智能客服 阿里私有云 阿里私有云解决方案[1] 阿里公有云架[1] 阿里私有云产品有什么[1] 阿里私有云搭建 [1] 高级环境配置(Linux操作系统)[1] 高级环境配置(Windows操作系统)[1]