Linux 内核热升级(Live Update)技术详解:PCI、VFIO 与 IOMMU 子系统的演进与实战解析引言

在超大规模云计算与高性能计算(HPC)数据中心中,内核热升级(Live Update / KEXEC) 是实现无感维护、无缝补丁修复和降低系统停机时间(Blackout time)的关键技术。传统的 kexec 在热重启过程中通常需要重置 PCIe 设备并重新建立虚拟化与 IOMMU 页表,这不仅会导致长达数百毫秒甚至秒级的业务中断,还会导致直通虚拟机(VFIO)或在途 DMA 任务崩溃。

为了实现设备 DMA 不中断(Hitless / Lossless DMA)的内核无缝升级,Linux 社区基于 KHO(Kexec HandOver) 和 LUO(Live Update Orchestrator) 框架,对 PCI 核心层、VFIO 设备直通框架以及 IOMMU 子系统展开了深度的热升级改造。

第一部分:PCI / VFIO / IOMMU Live Update 社区最新进展概览

截至 2026 年下半年,内核热升级三大核心子系统的上游社区演进已进入关键的合入与验证阶段:

1. PCI Core Live Update 进展

  • 核心补丁集 :由 David Matlack 等主导的 [PATCH v9] PCI: liveupdate: PCI core support for Live Update 补丁集已正式合并上游主线。

  • 主要能力:

    • 拓扑与状态保留 :在 kexec 切换全过程中,保留 PCIe 拓扑关系、总线编号(Bus numbers)、ACS 配置以及 Bus Mastering(DMA 使能位)。

    • 锁定机制 :在新内核启动初期,被保留的 PCIe 设备处于"锁定"状态,防止被未经授权的驱动重绑定(bind),保障状态一致性。

  • 后续规划(Future Work):

    • 避免在升级过程中调整或移动 BAR 空间,以支持升级期间维持 PCIe 点对点(P2P)通信。

    • 完善对物理网卡/设备 SR-IOV 配置的保留,实现热升级后对虚拟功能(VF)的快速重新枚举。

2. VFIO Live Update 进展

  • 核心补丁集 :由 Abhinav 等推行的 VFIO 级热升级机制已迭代至 v6 版本,并合入了 vfio/pci: Preserve the iommufd state of the vfio cdev 等核心提交。

  • 主要能力:

    • 绑定关联保留 :在升级过程中保存 vfio cdev 及与之绑定的 iommufd / HWPT(Hardware Page Table)状态。

    • 测试验证 :社区引入了 iommufd_liveupdate_kexec_test 自测框架,用于验证 vfio0 设备在 kexec 切换前后无中断保留与检索(Retrieve)的全流程。

3. IOMMU / iommufd Live Update 进展

  • 核心补丁集 :由 Samiullah Khawaja 等发起的 IOMMU Live Update 系列(如 phase1-v5 与 phase2-v1-wip 分支),新增了 CONFIG_IOMMU_LIVEUPDATE 内核配置。

  • 分阶段落地:

    • Phase 1:实现硬件页表(HWPT)与 IOMMU 域的持久化保存及安全锁定。

    • Phase 2 :支持在新内核中完整检索(Retrieve)并重建 iommufd 实例与 IOVA 映射关系,防止在 kexec 期间发生 IOMMU Page Fault。

第二部分:LPC 2026 会议核心 Topic 深度解析

结合 Linux Plumbers Conference 2026 (LPC 2026) 研讨会文档(lpc2026_2.docx),以下对各个专题的技术细节、争论焦点及解决方案进行详细剖析:

Topic 1: KEXEC 与内核热升级启动速度优化 (Ming Hao / Google)

目标:将系统热升级过程中的黑屏/停机时间(Blackout Time)压缩至极限。

核心技术点
  1. 设备 Patching 与 KHO 兼容性:

    • 修复了过去某些不兼容的缓存机制,使其与 KHO(Kernel HandOver)安全保存机制完全兼容。
  2. Purgatory 校验和跳过:

    • 在传统 kexec 中,Purgatory 代码会对新内核图像进行哈希校验。对于已在内存缓存且验证安全的内核,跳过该校验过程,直接缩短升级窗口。
  3. 延迟初始化(Lazy Initialization):

    • 优化了内核早期低效的嵌套循环(遍历每个 IOMMU、遍历每个 CPU、遍历每个 Micro-slave)。改为 Lazy 初始化后,既节省了黑屏时间,又节省了内核内存。
  4. 巨页(Huge Pages)与 HBO 适配:

    • 解决了 HBO(Header-Based Optimization)延迟映射栈页面(Stack Pages)与巨页保存机制之间的冲突,确保大页内存跨 KEXEC 快速保留。
  5. PCI 轮询与等待优化:

    • 将传统毫秒(ms)级的设备状态确认休眠逻辑优化为微秒(μs)级轮询,适应现代硬件快速响应的特性。

Topic 2: 跨 Live Update 保留临时文件系统(tmpfs / mounts)(David / PCI Core)

目标 :在无盘服务器(Diskless Hosts)上,如何在热升级期间保留运行在 tmpfs 中的二进制文件、日志与内存镜像。

三大提案对比与讨论
  1. 提案一:Retrieve Into(检索导入 UAPI) ------ 社区推荐方案

    • 机制 :升级前,用户空间将要保存的文件 FD 传递给 KHO。升级后,用户空间挂载新的 tmpfs 并创建同名空文件,通过 retrieve_into() 系统调用由内核将已保存的内存页(PFNs)直接"装填"到新文件的 inode 中。

    • 优势:坚持"内核提供机制,用户空间提供策略"的原则;内核改动最小,原生支持零拷贝(Zero-Copy)。

  2. 提案二:Tmpfs Mount Preservation(内核保存挂载点)

    • 机制 :内核直接保存整个 tmpfs 挂载点和内部目录结构,重启后恢复为匿名分离挂载点(Detached Mount)。

    • 劣势:引入了严重的 VFS 复杂度,需处理重挂载选项(Remount options)、Bind Mount 及命名空间隔离等大量边界情况。

  3. 提案三:Zero-Copy Splice / Move

    • 使用 splice() 将 memfd 零拷贝转移至文件,但目前内核的 splice() 会引发破坏性页缓存拷贝,需对读写两端进行大规模重构。

Topic 3: IOMMU 与 ARM SMMUv3 状态保存与恢复 (Sammy & Baolu)

目标:在 PCIe 设备直通(VFIO)场景下,保证升级期间 DMA 不中断,且 IOMMU 页表和硬件映射状态无缝继承。

1. ARM SMMUv3 保存与恢复流程
  • Outgoing Kernel(升级前保存):

    • 记录 MMIO 寄存器物理地址。

    • 仅保存需要热升级保留的设备的 Stream Table(流表)、Context Descriptors(CD/上下文描述符)。

    • 对于未分配给 VM 或不需保留的设备,将其 Stream Table 条目标记为 Abort(中断),防止非预期访问。

    • 保持 Event Queue 开启:升级期间不关闭硬件事件队列,新内核启动后可捕获并评估升级窗口期内发生的硬件翻译错误(Faults)。

  • Incoming Kernel(升级后恢复):

    • 继承并重用旧内核的 Stream Table 基地址,避免重新分配;保留对应的 Stream ID(SID)和 VMID;重新校准 shared queues 的 Producer/Consumer 索引。
2. 无缝/无打扰替换(Hitless Replacement)

为防止更换 IOMMU 域(Domain)时直接关闭 Present 位引发设备 DMA Fault,设计了三阶段 ASID 切换机制:

  1. 阶段 1 :将 Stream Table 中的 Address Space ID(ASID)更新为临时 ASID。

  2. 阶段 2:在后台安全更新真正的物理页表基地址(Directory/Table Pointer)。

  3. 阶段 3 :将 Stream Table 映射切回目标 ASID。

Topic 4: VFIO Live Update 架构与优化 (Abhinav)

目标 :保持直通给虚拟机的 PCIe 设备在 kexec 升级全过程中处于活跃状态。

核心焦点与结论
  1. No-IOMMU 模式实战验证:

    • 实现了 No-IOMMU 模式下的 VFIO Live Update 验证。利用物理连续内存映射与 Intel DSA 设备,在连续千次 DMA 操作期间触发 kexec 热升级,成功验证了硬件 DMA 传输在升级过程中零丢包、零中断。
  2. PCIe 配置空间(PCI CS)保存:

    • 明确必须保存并恢复配置空间。如果直接 Reset 设备,用户空间或 VM 在运行期修改的 Capability、BAR 映射等关键状态将会丢失。
  3. 清理失败(Finish Fail)处理机制:

    • 采用优雅退出/资源释放机制(Option 2)。若升级后用户空间接管失败,内核应自行触发设备 Reset 并安全清理关联资源,绝不阻塞升级流程或泄漏内存。

Topic 5: RDMA (RoCE/InfiniBand) 与 Direct Buffer (dma-buf) 状态保留 (Yanjun Zhu朱彦军)

目标:实现跨 KEXEC 热升级保留 RDMA(Soft-RoCE / Hardware RoCE)、Netkit 及 dma-buf 的网络数据通路与链路状态。

1. 架构拓扑与验证
  • 网络结构:在 Root Namespace 中使用控制逻辑,将 Hardware Queue / QP 分配给不同的 Network Namespaces,中间通过 Netkit 和 Soft-RoCE (rxe) 建立数据通路。

  • 成果:成功实现了在跨内核热升级时保留 RDMA Queue Pair (QP)、Netkit 虚拟链路及其数据结构,在 KEXEC 重启后成功通过了二层网络数据包收发测试。

2. 核心挑战与应对策略
  • 清理与冻结顺序依赖(Freeze & Cleanup Order):

    • 在 Handover 接管前,必须确保所有在途物理 DMA 传输已完成或被暂停。

    • 清理逻辑必须与 PCI / IOMMU 的冻结顺序保持同步,严禁过早关闭页表或禁用中断。

  • 内存碎片化与 KHO 元数据膨胀:

    • 问题 :RDMA 频繁使用的 dma-buf 散落在物理内存各个 4KB 页中,物理内存极度碎片化。导出给 KHO 保存时,会产生数万个离散描述符(KHO Items),拉长黑屏时间。

    • 解决方案 :引入 CMA(连续内存分配器) 或 HugePages(大页内存) 存储 dma-buf 缓冲区,将散乱的 4KB 页合并为少量的 2MB/1GB 描述符,大幅降低元数据开销,加速升级恢复。

总结

Linux 内核热升级(Live Update)正朝着全链路、零中断、低延迟 的方向演进。通过 PCI Core 建立稳定的拓扑与状态锁定,IOMMU / iommufd 保证物理页表与 IOVA 映射的无缝接续,VFIO 结合 dma-buf / HugePages 实现设备与高吞吐网络通路的平滑过渡,Linux 社区正在彻底解耦"内核更新"与"业务停机",为云原生与高性能数据中心提供高可用的底层基石。

相关推荐
砚凝霜1 小时前
【软考信息安全】第十九章 Unix/Linux安全分析与防护
linux·安全·unix
creator_Li2 小时前
Linux 的 Page Cache
linux·page cache
KING-WU5123 小时前
Linux GDB 调试实战指南:从编译到断点调试
linux·运维·服务器
Lucis__3 小时前
深入理解程序链接与加载—从动静态链接到库加载
linux·elf·链接·程序·动静态库
影视飓风TIM4 小时前
Linux 进程信号原理与剖析
linux·运维·服务器
缘友一世4 小时前
开源 Linux截图工具闪构(SnapForge)
linux·运维·ubuntu·开源·截图
朱包林5 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算
祖力555 小时前
Linux系统移植、烧录与环境的搭建
linux·运维·服务器
张小姐的猫6 小时前
【Linux】网络编程 —— 多路转接:epoll
linux·运维·网络