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_client 和 ib_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.conf 和 nvidia-peermem.Kbuild 文件排除问题模块
  3. 验证方法 :使用 nvidia-smi 确认驱动正常工作

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

参考链接


相关推荐
职豚求职小程序刷题2 小时前
易方达基金2027秋招笔试|考什么+场次提醒
笔记
无锡银洲自动化2 小时前
煤粉测点频繁堵管?FD 防堵风压取样器现场调试小结
笔记·产品运营
ACP广源盛139246256733 小时前
Type-C 扩展坞选型笔记:DP1.4a 转 HDMI2.0 桥接方案 GSV2201E @ACP评估
笔记·硬件架构·硬件工程·视频·hdmi·国产芯片
xian_wwq3 小时前
【学习笔记-一文读懂系列】读懂GBZ-195-2026《人工智能 工业智能体参考架构》
笔记·学习
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 19 PostgreSQL逻辑备份:pg_dump与pg_dumpall
数据库·笔记·postgresql
flytalei5 小时前
逐浪笔记 GitOps 实战:Jenkins 构建、Argo CD 同步与 Git 回滚
笔记·git·jenkins
叼烟扛炮6 小时前
Linux 学习笔记(八):GCC 编译器的四大阶段与链接原理
linux·笔记·学习
Z21-X6 小时前
云原生运维学习笔记:从云计算概念到服务器硬件的入门之旅
运维·笔记·学习·云原生
滴啦嘟啦哒6 小时前
【具身笔记】【Piper+PI0.5】一、基于键盘实现数据采集
笔记·vla·具身