今天学校突然断电了一下,导致两台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
经查,这是因为内核自动升级导致与原本的显卡驱动不兼容了
方法一:重装驱动
我的解决办法是重装驱动即可
# opengl是用于图形绘制的库,这里不需要
sudo ./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files
驱动下载地址:https://www.nvidia.cn/Download/index.aspx
如果在重装驱动时提示有显卡占用,但实际没有cuda程序在运行的话(例如桌面程序可能还在运行),可以使用以下命令解除占用:
# step 1: 停止图形用户界面并只保留基本的命令行界面
sudo systemctl isolate multi-user.target
# step 2: 卸载Linux内核模块nvidia-drm,该模块是nvidia显卡驱动的一部分
# 或者使用 rmmod 也能卸载模块
sudo modprobe -r nvidia-drm
# step 3: 安装驱动,如果这里还报上述错误,使用 `lsmod | grep nvidia.drm` 命令查看是否还没卸载,如果没有可以重启试试
# lsmod 命令用于在列出已经加载的所有内核模块
sudo ./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files
# step 4: 开启图形界面
sudo systemctl start graphical.target
方法二:DKMS
简介
DKMS(Dynamic Kernel Module Support)是一个软件,需要手动安装。用来管理和维护一些原本依赖内核的模块,使得它们能够独立出来不再依赖内核版本。例如nvidia驱动就依赖内核版本,假如内核更新了则驱动就需要重新编译安装。但如果将这些模块交予DKMS来管理则会方便许多,他会自动检测系统内核,如果有升级它就会自动重新编译和安装它所管理的内核模块。
它在模块构建过程中的角色优点类似于java中的maven或gradle,负责构建和管理整个模块。这些第三方内核模块如果需要加入DKMS的支持,则也需要遵循其开发规范,例如项目需要一个dkms.conf
文件用来配置该模块如何进行编译、安装和卸载等,类似maven的配置文件这种。当然,maven只负责这个项目的构建运行相关工作,如果要实现根据环境自动重新编译安装则还需要类似devops的东西,比如jinkens。它们合起来的功能就类似于DKMS在内核管理方面的工作。
除了本身就使用DKMS规范进行开发的第三方内核模块可以使用DKMS进行管理外,其他任何第三方内核模块,如果提供了源码(必须要有源码,因为DKMS是基于源码进行构建的),就可以手动为其添加DKMS,具体操作如下:

nvidia驱动
nvidia驱动从开发之初就添加了DKMS支持,故你只需要在安装驱动时指定使用DKMS版本的就行
sudo ./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files --dkms
网上有些教程使用 dkms install -m nvidia -v xxxx
其本质上也是一样的,只不过这种操作可以手动指定本地已经存在的nvidia驱动源码版本。
参考
https://www.likecs.com/show-205014101.html
https://unix.stackexchange.com/questions/440840/how-to-unload-kernel-module-nvidia-drm