nvidia-smi not work [Error! Bad return status for module build on kernel]

在运行PyTorch GPU程序时遇到nvidia-smi错误,提示模块构建失败。问题源于驱动安装过程中的GCC版本不匹配。通过升级GCC到8.0并重新安装驱动,成功解决了问题,使nvidia-smi和GPU程序恢复正常。

nvidia-smi not work [Error! Bad return status for module build on kernel]

  1. 系统信息:
OS: ubuntu 18.04
Kernal: 5.4.0-48-generic (x86_64)
Nvidia driver: 450.51.06
Nvidia card: 2080Ti
  1. 昨天运行pytorch GPU程序的时候出错,提示:
No CUDA runtime is found, using CUDA_HOME='/usr/local/cuda'

执行$nvidia-smi命令也报错,提示:

NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

运行 $nvcc --version显示正常。程序和系统之前一切都是正常的,突然出现这个问题,感觉可能是安装其软件的时候更新了什么或是系统自动更新了。

  1. 尝试了卸载驱动重新安装:
$ sudo apt purge nvidia-*
$ sudo ppa-purge ppa:graphics-drivers/ppa
$ sudo apt autoremove
$ sudo apt auto-clean

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo ubuntu-drivers autoinstall

$ sudo reboot

一般在这一步就可以解决问题了。但是电脑重启之后运行

<think>我们面对的核心问题是:在安装或更新NVIDIA驱动后,执行`nvidia-smi`时出现`Error! Bad return status for module build on kernel`错误。这通常意味着NVIDIA内核模块未能成功构建,导致驱动无法正常加载。根据引用内容,该问题常发生在内核升级后(如引用[2]),或驱动版本与内核不兼容时(如引用[5])。 ### 🔍 问题根源分析 1. **内核头文件缺失**:构建内核模块需要`linux-headers`匹配当前内核版本。 2. **驱动与内核版本不兼容**:新内核可能尚未被当前驱动版本支持(引用[5])。 3. **GCC编译器版本冲突**:某些旧版驱动需要较低版本的GCC(引用[4])。 4. **Secure Boot阻止模块加载**:未签名的模块在启用Secure Boot时会被阻止(引用[1])。 5. **残留旧驱动冲突**:未彻底清除的旧驱动文件干扰新驱动构建(引用[3])。 --- ### 🛠️ 完整解决方案 #### 步骤1:验证内核头文件 ```bash # 检查当前内核版本 uname -r # 安装匹配的头文件(示例内核:5.15.0-113-generic) sudo apt install linux-headers-$(uname -r) ``` #### 步骤2:彻底清除旧驱动 ```bash sudo apt purge 'nvidia-*' 'libnvidia-*' sudo apt autoremove sudo rm -rf /usr/lib/nvidia* # 清除残留库文件 sudo reboot ``` #### 步骤3:安装兼容驱动 ```bash # 查看推荐驱动版本(优先选择带"recommended"标记的) ubuntu-drivers devices # 安装推荐驱动(示例:535版本) sudo apt install nvidia-driver-535 ``` #### 步骤4:处理构建失败(关键步骤) 若仍出现构建错误: ```bash # 查看详细构建日志(替换实际内核版本) cat /var/lib/dkms/nvidia/535.104.05/build/make.log ``` ##### 场景1:GCC版本过高(常见于Ubuntu 18.04) ```bash # 安装低版本GCC(如gcc-7) sudo apt install gcc-7 # 强制DKMS使用指定GCC版本(需修改dkms.conf) sudo sed -i "s/CC=gcc/CC=gcc-7/" /usr/src/nvidia-535.104.05/dkms.conf ``` ##### 场景2:驱动不支持新内核(引用[5]) - 方案A:降级内核 ```bash # 查看可用内核 apt list linux-image-5.15.0-* # 安装旧内核(如5.15.0-107) sudo apt install linux-image-5.15.0-107-generic sudo reboot ``` - 方案B:升级驱动至支持新内核的版本(需从NVIDIA官网下载.run文件) #### 步骤5:处理Secure Boot ```bash # 生成密钥(重启时需在BIOS界面注册) sudo mokutil --import /var/lib/dkms/mok.key # 或直接禁用Secure Boot(不推荐) sudo mokutil --disable-validation ``` #### 步骤6:重建并加载模块 ```bash sudo dkms remove -m nvidia -v 535.104.05 --all # 移除旧模块 sudo dkms install -m nvidia -v 535.104.05 # 重新构建 sudo modprobe nvidia # 加载模块 sudo update-initramfs -u # 更新启动镜像 sudo reboot ``` --- ### ✅ 验证修复 ```bash # 检查驱动加载 nvidia-smi # 确认内核模块版本 cat /proc/driver/nvidia/version | grep "Kernel Module" ``` --- ### 📊 故障树(决策参考) ```mermaid graph TD A[构建失败] --> B{检查日志} B -->|GCC版本错误| C[安装兼容GCC] B -->|内核API变更| D[降级内核或升级驱动] B -->|头文件缺失| E[安装linux-headers] B -->|签名失败| F[处理Secure Boot] ``` --- ### ❓ 相关问题 1. 如何安全降级Linux内核以避免NVIDIA驱动兼容性问题? 2. 在Ubuntu 22.04上如何为NVIDIA驱动锁定特定GCC版本? 3. Secure Boot导致NVIDIA模块加载失败该如何解决? 4. 如何从NVIDIA官网下载最新驱动并手动安装以解决兼容性问题? 5. `dkms`构建失败后如何解读`make.log`文件中的关键错误信息?[^5]</think>### 🔍 解决 "Error! Bad return status for module build on kernel" 问题 当出现 `Error! Bad return status for module build on kernel` 错误时,表明 NVIDIA 驱动内核模块未能成功构建。以下是系统级解决方案: --- ### 🛠️ 分步解决方案 #### 步骤1:验证内核头文件安装 ```bash # 检查当前内核版本 uname -r # 安装匹配的内核头文件(替换为你的内核版本) sudo apt install linux-headers-5.15.0-113-generic ``` #### 步骤2:完全清除旧驱动 ```bash sudo apt purge 'nvidia-*' 'libnvidia-*' sudo apt autoremove sudo rm -rf /usr/lib/nvidia* # 清除残留库文件 sudo reboot ``` #### 步骤3:安装兼容驱动组合 ```bash # 查看可用驱动版本 ubuntu-drivers devices # 安装推荐驱动(示例) sudo apt install nvidia-driver-535 nvidia-dkms-535 ``` #### 步骤4:修复 GCC 版本冲突(如适用) ```bash # 查看当前 GCC 版本 gcc --version # 安装兼容的 GCC 版本(如 gcc-10) sudo apt install gcc-10 g++-10 # 设置替代版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 ``` #### 步骤5:手动重建内核模块 ```bash # 查看驱动版本号 ls /usr/src | grep nvidia # 手动重建模块(替换实际版本号) sudo dkms remove -m nvidia -v 535.104.05 --all sudo dkms install -m nvidia -v 535.104.05 sudo depmod -a sudo update-initramfs -u sudo reboot ``` #### 步骤6:处理 Secure Boot 问题 ```bash # 检查 Secure Boot 状态 mokutil --sb-state # 若启用则需要签名模块 sudo apt install shim-signed sudo mokutil --import /var/lib/dkms/mok.key # 重启后按提示完成密钥注册 ``` --- ### 🔎 错误诊断与日志分析 ```bash # 查看详细构建日志(替换内核版本) cat /var/lib/dkms/nvidia/535.104.05/build/make.log # 常见错误模式: # 1. "Unable to find the kernel source tree" → 缺少内核头文件 # 2. "implicit declaration of function" → 内核API变更,需升级驱动 # 3. "gcc: error: unrecognized command line option" → GCC版本不兼容 ``` --- ### ⚙️ 备选解决方案 #### 方案A:降级内核版本 ```bash # 查看可用内核 apt list linux-image-5.15.0-* # 安装旧内核(示例) sudo apt install linux-image-5.15.0-100-generic sudo update-grub sudo reboot ``` #### 方案B:从源码安装驱动 ```bash # 禁用 Nouveau sudo nano /etc/modprobe.d/blacklist-nouveau.conf # 添加:blacklist nouveau / options nouveau modeset=0 # 下载官方驱动(替换为实际版本) wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.104.05/NVIDIA-Linux-x86_64-535.104.05.run # 安装 sudo sh NVIDIA-Linux-x86_64-535.104.05.run --dkms ``` --- ### 📌 关键预防措施 1. **内核更新前**:先卸载 NVIDIA 驱动 `sudo apt purge nvidia-*` 2. **使用固定版本**:在关键系统中锁定内核版本 ```bash sudo apt-mark hold linux-image-generic linux-headers-generic ``` 3. **定期维护**:每月检查驱动更新 ```bash sudo ubuntu-drivers autoinstall ``` --- ### ❓ 相关问题 1. 如何安全降级 Linux 内核以解决驱动兼容性问题? 2. 在 Ubuntu 22.04 上如何为 NVIDIA 驱动锁定特定 GCC 版本? 3. Secure Boot 导致 NVIDIA 模块加载失败该如何解决? 4. 如何解读 `dkms` 构建日志中的关键错误信息?[^5] 5. 使用官方 `.run` 安装器与 `apt` 安装驱动有何区别?
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值