文章目录
- 问题描述
- 环境信息
- 问题根因分析
- 解决方案
-
- [步骤 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
问题根因分析
- 直接原因 :
nvidia-peermem模块在 Linux 6.8 内核上构建失败 - 深层原因 :
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) 未正确安装,导致符号未导出
- 影响范围:该模块主要用于 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 驱动可能已修复此兼容性问题。
总结
本次修复的关键点:
- 问题定位 :通过查看
/var/lib/dkms/nvidia/580.126.09/build/make.log找到modpost阶段的符号缺失错误 - 解决方案 :通过修改
dkms.conf和nvidia-peermem.Kbuild文件排除问题模块 - 验证方法 :使用
nvidia-smi确认驱动正常工作
nvidia-peermem 模块主要用于 InfiniBand 环境下的 GPU Direct RDMA 功能,对于大多数不使用 InfiniBand 的用户来说,排除该模块不会影响正常的 GPU 使用。