NVIDIA DKMS 驱动构建失败修复笔记

文章目录

  • 问题描述
  • 环境信息
  • 问题根因分析
  • 解决方案
    • [步骤 1:清理残留文件](#步骤 1:清理残留文件)
    • [步骤 2:修改 DKMS 配置排除 peermem 模块](#步骤 2:修改 DKMS 配置排除 peermem 模块)
    • [步骤 3:修改 Kbuild 文件彻底排除 peermem](#步骤 3:修改 Kbuild 文件彻底排除 peermem)
    • [步骤 4:重新构建 DKMS 模块](#步骤 4:重新构建 DKMS 模块)
  • 修复结果
  • 替代解决方案
    • [方案 1:安装 OFA 内核模块(推荐用于 InfiniBand 环境)](#方案 1:安装 OFA 内核模块(推荐用于 InfiniBand 环境))
    • [方案 2:升级到更新的 NVIDIA 驱动](#方案 2:升级到更新的 NVIDIA 驱动)
  • 总结
  • 参考链接

问题描述

在 Ubuntu 22.04 系统上安装 NVIDIA 580 驱动时遇到 DKMS 构建失败:

bash 复制代码
Building module(s)............(bad exit status: 2)
Failed command:
unset ARCH; [ ! -h /usr/bin/cc ] && export CC=/usr/bin/gcc; env NV_VERBOSE=1 'make' -j16 ...
Error! Bad return status for module build on kernel: 6.8.0-47-generic (x86_64)

同时伴随的错误:

复制代码
ERROR: modpost: "ib_register_peer_memory_client" [/var/lib/dkms/nvidia/580.126.09/build/nvidia-peermem.ko] undefined!
ERROR: modpost: "ib_unregister_peer_memory_client" [/var/lib/dkms/nvidia/580.126.09/build/nvidia-peermem.ko] undefined!

环境信息

  • 操作系统:Ubuntu 22.04
  • 内核版本:6.2.0-26-generic 和 6.8.0-47-generic
  • NVIDIA 驱动版本:580.126.09
  • GPU:NVIDIA H100 80GB x 2

问题根因分析

  1. 直接原因nvidia-peermem 模块在 Linux 6.8 内核上构建失败
  2. 深层原因
    • nvidia-peermem 是 NVIDIA 的 InfiniBand Peer Memory 驱动
    • 它依赖 OFA (Open Fabrics Alliance) 内核模块中的 ib_register_peer_memory_clientib_unregister_peer_memory_client 符号
    • OFA 内核模块 (/usr/src/ofa_kernel/x86_64/6.8.0-47-generic/Module.symvers) 未正确安装,导致符号未导出
  3. 影响范围:该模块主要用于 InfiniBand GPU Direct RDMA,大多数普通用户不需要

解决方案

步骤 1:清理残留文件

bash 复制代码
# 删除崩溃报告
sudo rm -rf /var/crash/nvidia-dkms-580.0.crash

# 清除 DKMS 缓存
sudo rm -rf /var/lib/dkms/nvidia/580.126.09

步骤 2:修改 DKMS 配置排除 peermem 模块

编辑 /usr/src/nvidia-580.126.09/dkms.conf,删除 nvidia-peermem 的模块条目:

bash 复制代码
sudo cp /usr/src/nvidia-580.126.09/dkms.conf /usr/src/nvidia-580.126.09/dkms.conf.bak

新的 dkms.conf 内容:

conf 复制代码
PACKAGE_NAME="nvidia"
PACKAGE_VERSION="580.126.09"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="nvidia"
DEST_MODULE_LOCATION[0]="/kernel/drivers/char/drm"
PROCS_NUM=`nproc`
[ $PROCS_NUM -gt 16 ] && PROCS_NUM=16
MAKE[0]="unset ARCH; [ ! -h /usr/bin/cc ] && export CC=/usr/bin/gcc; env NV_VERBOSE=1 \
    'make' -j$PROCS_NUM NV_EXCLUDE_BUILD_MODULES='nvidia-peermem' KERNEL_UNAME=${kernelver} IGNORE_XEN_PRESENCE=1 IGNORE_CC_MISMATCH=1 SYSSRC=$kernel_source_dir LD=/usr/bin/ld.bfd CONFIG_X86_KERNEL_IBT= modules"
BUILT_MODULE_NAME[1]="nvidia-modeset"
DEST_MODULE_LOCATION[1]="/kernel/drivers/char/drm"
BUILT_MODULE_NAME[2]="nvidia-drm"
DEST_MODULE_LOCATION[2]="/kernel/drivers/char/drm"
AUTOINSTALL="yes"
PATCH[0]="disable_fstack-clash-protection_fcf-protection.patch"
PATCH_MATCH[0]='^(4\.[0-9]*)|(5\.[0-9]\.0)|(5\.1[0-2]\.0)'
BUILT_MODULE_NAME[3]="nvidia-uvm"
DEST_MODULE_LOCATION[3]="/kernel/drivers/char/drm"

步骤 3:修改 Kbuild 文件彻底排除 peermem

编辑 /usr/src/nvidia-580.126.09/nvidia-peermem/nvidia-peermem.Kbuild

bash 复制代码
sudo sed -i 's/^obj-m += nvidia-peermem.o$/# obj-m += nvidia-peermem.o/' \
    /usr/src/nvidia-580.126.09/nvidia-peermem/nvidia-peermem.Kbuild

步骤 4:重新构建 DKMS 模块

bash 复制代码
# 清除旧缓存并重新构建
sudo rm -rf /var/lib/dkms/nvidia/580.126.09
sudo dkms autoinstall

# 配置包
sudo dpkg --configure -a

修复结果

修复后成功构建的模块:

  • nvidia.ko - 核心驱动
  • nvidia-modeset.ko - 显示模式设置
  • nvidia-drm.ko - DRM 集成
  • nvidia-uvm.ko - CUDA 内存管理

驱动状态验证:

bash 复制代码
$ nvidia-sMI
NVIDIA-SMI 580.126.09             Driver Version: 580.126.09     CUDA Version: 13.0
+-----------------------------------------------------------------------------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
|   0  NVIDIA H100 80GB HBM3          Off |   00000000:08:00.0 Off |                    0 |
|   1  NVIDIA H100 80GB HBM3          Off |   00000000:0A:00.0 Off |                    0 |
+-----------------------------------------------------------------------------------------+

替代解决方案

方案 1:安装 OFA 内核模块(推荐用于 InfiniBand 环境)

如果需要 nvidia-peermem 功能(用于 GPU Direct RDMA):

bash 复制代码
# 安装 MOFED (Mellanox OpenFabrics Enterprise Distribution)
sudo apt update
sudo apt install mlnx-ofed-kernel-dkms

方案 2:升级到更新的 NVIDIA 驱动

较新版本的 NVIDIA 驱动可能已修复此兼容性问题。

总结

本次修复的关键点:

  1. 问题定位 :通过查看 /var/lib/dkms/nvidia/580.126.09/build/make.log 找到 modpost 阶段的符号缺失错误
  2. 解决方案 :通过修改 dkms.confnvidia-peermem.Kbuild 文件排除问题模块
  3. 验证方法 :使用 nvidia-smi 确认驱动正常工作

nvidia-peermem 模块主要用于 InfiniBand 环境下的 GPU Direct RDMA 功能,对于大多数不使用 InfiniBand 的用户来说,排除该模块不会影响正常的 GPU 使用。

参考链接


相关推荐
半壶清水9 小时前
[软考网规考点笔记]-OSI参考模型与TCP/IP体系结构
网络·笔记·tcp/ip
浅念-13 小时前
C++ :类和对象(4)
c语言·开发语言·c++·经验分享·笔记·学习·算法
时代的凡人14 小时前
0213晨间笔记
笔记
AI视觉网奇14 小时前
ue 推送直播流 推流 linux 实战
笔记·学习·ue5
kkkkkkkkk_120114 小时前
【强化学习】09周博磊强化学习纲要学习笔记——第五课上
笔记·深度学习·学习·强化学习
玩c#的小杜同学15 小时前
工业级稳定性:如何利用生产者-消费者模型(BlockingCollection)解决串口/网口高频丢包问题?
笔记·学习·性能优化·c#·软件工程
laplace012315 小时前
deque+yield+next语法
人工智能·笔记·python·agent·rag
瑶光守护者15 小时前
【学习笔记】3GPP NR-NTN 移动性IRAT分析
笔记·学习·卫星通信·nr-ntn
杂鱼Tong16 小时前
29. Revit API:扩展存储(ExtensibleStorage)
笔记