环境: Ubuntu 22.04

很恶心的一个问题, 经常掉驱动

# 看到这个就恶心
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.

目前可能的一个原因是服务器重启之后自动更新了内核版本, 导致驱动与内核版本不匹配, 很抽象

这里主要记录禁止内核自动升级, 和已经升级了的解决尝试

禁止内核自动升级

# 关闭内核自动升级
sudo apt-mark hold linux-image-generic linux-headers-generic
# 以后如果要恢复
# sudo apt-mark unhold linux-image-generic linux-headers-generic
# 先看看现在的 Linux 内核版本
uname -r
# 6.5.0-18-generic

#  上面这样好像无效,还在测试中,现在新加了
# 这台服务器的内核版本是 6.5.0-28-generic
# 先查查
dpkg -l | grep linux-image
dpkg -l | grep linux-headers
sudo apt-mark hold linux-image-6.5.0-28-generic
sudo apt-mark hold linux-headers-6.5.0-28-generic
sudo apt-mark hold linux-image-generic-hwe-22.04

sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
# 设置黑名单
Unattended-Upgrade::Package-Blacklist {
    "linux-image-6.5.0-28-generic";
    "linux-headers-6.5.0-28-generic";
    "linux-image-generic-hwe-22.04";
};

# 查看锁定状态
sudo apt-mark showhold

尝试解决

原来都是直接下新的驱动就OK了, 这次安装新的驱动不行可能是因为要求的 gcc 版本更高了, 但是电脑里没有新版的 gcc

看了别人很多解决方案, 这里还是选择不重启的方法

两种选择:

  1. 用新的驱动, 更新 gcc
  2. 不更新驱动, 降低 Linux 内核版本

不敢降低 Linux 内核, 因此我选择第一种方案.

# 因为新的显卡驱动需要 gcc 版本为 12, 所以下载
sudo apt install gcc-12
sudo apt install g++-12

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 1 --slave /usr/bin/g++ g++ /usr/bin/g++-12
# 然后之后可以用这个切换
sudo update-alternatives --config gcc
# 比如突然要切换回老的 gcc,这个切换了gcc,g++也会变

这条命令是在Ubuntu和其他基于Debian的Linux发行版中用来管理默认程序版本的。具体来说,它用于更新gcc(GNU C编译器)和g++(GNU C++编译器)的默认版本。

下面是这条命令各部分的解释:

  • sudo: 以超级用户(root)权限运行命令。
  • update-alternatives: 是一个用于管理可替换命令的工具。它允许系统管理员为系统上的多个版本的同一个程序选择一个默认版本。
  • --install: 指示 update-alternatives 要安装一个新的替代项。
  • /usr/bin/gcc: 这是 gcc 命令的默认路径。
  • gcc: 这是要更新的替代项的名称。
  • /usr/bin/gcc-12: 这是 gcc 版本12的实际路径。
  • 1: 这是这个替代项的优先级。数字越高,优先级越高。如果有多个版本,系统将选择优先级最高的版本作为默认版本。
  • --slave: 指示 update-alternatives 要同时更新另一个与主替代项相关的替代项。
  • /usr/bin/g++: 这是 g++ 命令的默认路径。
  • g++: 这是要更新的替代项的名称。
  • /usr/bin/g++-12: 这是 g++ 版本12的实际路径。

简而言之,这条命令的目的是将 /usr/bin/gcc/usr/bin/g++ 的默认版本设置为 gcc-12g++-12, 并为这两个命令设置优先级为1. 这样, 当你在终端中输入 gccg++ 时, 系统将默认使用版本12.

然后再安装新的驱动就OK了

sudo ./NVIDIA-Linux-x86_64-550.54.14.run 
nvidia-smi

Wed Feb 28 16:36:58 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14              Driver Version: 550.54.14      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA TITAN X (Pascal)        Off |   00000000:03:00.0 Off |                  N/A |
| 33%   49C    P0             57W /  250W |       0MiB /  12288MiB |      1%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA TITAN X (Pascal)        Off |   00000000:04:00.0 Off |                  N/A |
| 26%   41C    P0             55W /  250W |       0MiB /  12288MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+