问题小记1:服务器更新内核后,nvidia-smi 失败
前言:服务器断电重启后,nvidia-smi报错,此篇文章记录解决过程与分析。
问题描述
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.
nvidia-smi 无法通信 NVIDIA 驱动,通常是驱动未正确加载、驱动与内核版本不匹配或驱动文件损坏导致。
问题排查与解决办法
通过 Ubuntu 官方包管理器(apt)安装的
先确认核心问题:驱动是否安装 & 内核是否匹配
首先执行基础命令,判断驱动状态和系统环境:
# 1. 检查系统是否识别 NVIDIA 显卡(排除硬件问题)
lspci | grep -i nvidia # 若输出类似 "NVIDIA Corporation ...",说明显卡被识别;无输出则可能是硬件/插槽问题
# 2. 检查是否安装 NVIDIA 驱动(查看已安装的驱动版本)
dpkg -l | grep nvidia-driver # Ubuntu/Debian 系统
# 或
rpm -qa | grep nvidia-driver # CentOS/RHEL 系统
# 若输出为空,说明驱动未安装;若有版本号(如 nvidia-driver-550),则驱动已安装但未加载
# 3. 检查驱动与内核版本是否匹配(关键!内核更新后驱动可能失效)
uname -r # 查看当前内核版本(如 5.15.0-91-generic)
dkms status | grep nvidia # 查看 DKMS 管理的驱动是否匹配当前内核
# 若输出 "nvidia, 550.90.07, 5.15.0-91-generic, x86_64: installed",说明匹配;
# 若输出 "mismatched kernel" 或无对应内核版本,说明不匹配
驱动未安装(dpkg/rpm 无输出)
直接安装对应显卡的官方驱动(推荐通过 NVIDIA 官网或系统包管理器安装,避免版本不兼容):
# 方法1:Ubuntu 系统通过包管理器安装(简单,推荐新手)
# 1. 查看系统推荐的驱动版本
ubuntu-drivers devices # 输出中 "recommended" 标注的是推荐版本(如 nvidia-driver-550)
# 2. 自动安装推荐驱动
sudo ubuntu-drivers autoinstall
# 3. 重启系统(驱动需重启加载)
sudo reboot
# 方法2:手动下载官网驱动(适合需要特定版本的场景)
# 1. 从 NVIDIA 官网下载对应显卡的驱动(https://www.nvidia.com/Download/index.aspx)
# 2. 关闭图形界面(避免安装时冲突)
sudo systemctl set-default multi-user.target
sudo reboot # 重启后进入命令行模式
# 3. 卸载旧驱动(若有残留)
sudo apt purge nvidia-*
# 4. 安装依赖
sudo apt install gcc make dkms
# 5. 执行驱动安装包(替换为下载的文件名)
chmod +x NVIDIA-Linux-x86_64-550.90.07.run
sudo ./NVIDIA-Linux-x86_64-550.90.07.run
# 6. 安装过程中选择 "Install NVIDIA's 32-bit compatibility libraries"(可选)、"DKMS"(推荐)
# 7. 恢复图形界面并重启
sudo systemctl set-default graphical.target
sudo reboot
驱动已安装,但未加载(lspci 识别显卡,nvidia-smi 报错)
驱动文件存在,但未被内核加载,可能是重启后驱动未自动加载或加载失败:
# 1. 尝试手动加载 NVIDIA 内核模块
sudo modprobe nvidia # 若执行无报错,说明加载成功;若报错,查看错误原因(如版本不匹配)
# 2. 若加载成功,验证 `nvidia-smi` 是否恢复
nvidia-smi
# 3. 设置驱动开机自动加载(避免下次重启失效)
echo "nvidia" | sudo tee /etc/modules-load.d/nvidia.conf
通过.run脚本安装的
重新安装 NVIDIA 驱动
直接用 NVIDIA 官网的 .run 脚本重新安装驱动,过程会自动为当前新内核编译模块,步骤如下:
- 查看当前需要的驱动版本
先确认你的显卡型号对应的最新驱动版本(避免版本不兼容)
方法 1:通过显卡型号查询(如 RTX 4090 对应驱动 550+),可访问NVIDIA 驱动下载页选择型号查询;
方法 2:通过系统自动检测(需联网):sudo apt install -y nvidia-detect nvidia-detect # 输出推荐的驱动版本,如 "nvidia-driver-550" - 下载对应版本的 .run 驱动文件
从 NVIDIA 官网下载驱动(示例:驱动版本 550.90.07,文件名 NVIDIA-Linux-x86_64-550.90.07.run),并上传到服务器(或用 wget 直接下载,需替换下载链接):# 示例:下载 550.90.07 版本(需替换为你的显卡对应的链接) wget https://us.download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run - 关闭图形界面(避免安装冲突)
驱动安装过程需关闭 X 服务器(图形界面),执行:# 切换到多用户命令行模式 sudo systemctl set-default multi-user.target # 重启生效(重启后直接进入命令行,需重新登录) sudo reboot - 卸载旧驱动残留(关键!避免文件冲突)
# 若之前通过 .run 安装,执行以下命令卸载(替换为旧驱动文件名,或用通用卸载命令) sudo /usr/bin/nvidia-uninstall # 若卸载命令不存在,直接删除驱动文件(谨慎执行) sudo rm -rf /usr/lib/nvidia* /usr/bin/nvidia* /lib/modules/$(uname -r)/kernel/drivers/video/nvidia/ - 安装依赖并执行驱动安装
# 安装编译依赖(gcc、make、内核头文件,必须与当前内核匹配) sudo apt install -y gcc make linux-headers-$(uname -r) # 给驱动文件添加执行权限 chmod +x NVIDIA-Linux-x86_64-550.90.07.run # 执行安装(关键:添加 --dkms 参数,让驱动通过 DKMS 管理,后续内核更新自动适配) sudo ./NVIDIA-Linux-x86_64-550.90.07.run --dkms - 恢复图形界面并验证
# 切换回图形界面模式 sudo systemctl set-default graphical.target # 重启(让驱动模块加载) sudo reboot # 重启后验证 nvidia-smi # 应正常输出显卡、驱动版本、CUDA 版本 uname -r # 确认当前内核是 5.15.0-140-generic
手动为新内核编译驱动模块(适合不想重新安装的场景)
如果不想重新下载驱动,可找到之前安装驱动时的编译文件,为新内核手动编译模块(前提是知道之前的驱动版本,且保留了驱动源码或编译目录):
-
找到驱动编译目录
非 apt 安装的驱动,编译目录通常在 /usr/src/nvidia-xxx.xx.xx(xxx.xx.xx 是驱动版本,如 550.90.07):ls /usr/src/ | grep nvidia # 查看是否有 nvidia-xxx.xx.xx 目录 # 示例输出:nvidia-550.90.07 -
为新内核编译模块
替换以下命令中的 550.90.07 为你的驱动版本:# 1. 进入驱动编译目录 cd /usr/src/nvidia-550.90.07 # 2. 生成 Makefile(适配当前内核) sudo make clean # 清理旧编译文件 sudo make modules -j$(nproc) # 编译模块(-j$(nproc) 用多核加速) # 3. 安装模块到新内核目录 sudo make modules_install # 4. 更新模块依赖 sudo depmod -a # 5. 加载驱动模块 sudo modprobe nvidia sudo modprobe nvidia_modeset # 依赖 nvidia 主模块 sudo modprobe nvidia_drm # 依赖 nvidia_modeset 模块 sudo modprobe nvidia_uvm # 依赖 nvidia 主模块(CUDA 计算需要) # 6. 验证所有模块加载状态 lsmod | grep nvidia # 7. 验证 nvidia-smi若执行
make modules报错,说明驱动版本与新内核不兼容,需改用 重新安装 NVIDIA 驱动 适配新内核的驱动。 -
nvidia-smi执行耗时长解决
lsmod | grep nvidia nvidia_drm 98304 0 nvidia_modeset 1540096 1 nvidia_drm nvidia_uvm 4677632 0 nvidia 9617408 2 nvidia_uvm,nvidia_modeset drm_kms_helper 315392 5 mgag200,nvidia_drm,nouveau drm 622592 8 drm_kms_helper,nvidia,mgag200,drm_ttm_helper,nvidia_drm,ttm,nouveau time nvidia-smi real 0m24.601s user 0m0.012s sys 0m4.974s虽然所有 NVIDIA 模块都已加载,但nvidia-smi执行耗时长达 24 秒,明显异常(正常应在 1 秒)。我的解决方案:禁用 GPU 节能模式
节能模式下,GPU 会默认进入低功耗休眠状态(如降低核心频率、关闭部分硬件单元),nvidia-smi 检测时需要等待 GPU 从休眠状态 “唤醒” 并重新初始化硬件,这一过程会产生明显延迟。
禁用节能模式后,GPU 会维持在 “活跃就绪” 状态,nvidia-smi 无需等待唤醒过程,检测速度自然大幅提升。# 禁用GPU自动降频(持久化模式) sudo nvidia-smi -pm 1 # 验证:Power Management Mode 显示 "Persistent-M=On" nvidia-smi | grep -i "persistence"
总结
综上已经解决了服务器更新内核后,nvidia-smi失败的问题。











