Ubuntuの更新ついでにNVIDIAのドライバを更新しようとしたらハマった話

This image is generated with ChatGPT-4, and edited by the author.
作成日:2023年09月08日(金) 00:00
最終更新日:2024年10月07日(月) 10:02
カテゴリ:その他
タグ:  環境構築 Tips トラブル解決

Ubuntuを20.04に更新したついでにNVIDIAのドライバを更新しようとしたら色々とハマりました.

こんにちは.高山です.
Ubuntuの18.04の標準サポートが終了したので20.04に更新しました.
これ自体はスムーズに進んだのですが,ついでにNVIDIAのGPUドライバを更新したところ,ドライバが認識されなくなってしまって色々とハマりました(^^;).
今後同じようなことが起きたときのためのメモとしてやったことを書き残しておこうと思います.

更新履歴 (大きな変更のみ記載しています)

  • 2024/09/17: タグと節構成を更新しました

復旧手順まとめ

試行錯誤の過程は次節以降にグダグダと書いてます.
デバッグ手順と復旧に使用したコマンドを下記にまとめます.

NVIDIAドライバ更新の手順を,処理コマンドとその応答によるフローチャートで示しています.詳細は第1節以降で説明しています.
NVIDIAドライバ更新のデバッグ手順
# NVIDIA関連のアンインストール
sudo apt --purge remove nvidia-*
sudo apt --purge remove cuda-*

# Linuxヘッダのインストール
sudo apt install linux-headers-$(uname -r)

# CUDAのインストール
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

# Docker経由でCUDAを使っている場合は必要
sudo apt install nvidia-container-toolkit

# noveauの無効化
sudo vi /etc/modprobe.d/blacklist-nouveau.conf
# 下2行はviで開いた画面上で記入しています
blacklist nouveau
options nouveau modeset=0

sudo update-initramfs -u
sudo shutdown -r now

1. 起きた現象

まずどのような現象が起こったかというと,SSHでログインした際に再起動を促されていたので指示通りに行ったところ,下記のようにドライバが認識されなくなりました.

$ 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.

2. 再インストール (だけ) では上手くいかなかった

まず,下記のようにドライバ (とCUDA) の再インストールを試みました.

NVIDIA関連のアンインストール

$ sudo apt --purge remove nvidia-*
$ sudo apt --purge remove cuda-*

CUDAのインストール

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
$ sudo apt-get update
$ sudo apt-get -y install cuda

Docker経由でCUDAを使っている場合は下記の操作も必要

$ sudo apt install nvidia-container-toolkit

再起動して動作を確認したところ,この操作だけでは上手くいきませんでした.
さらっと書きましたが,色々なドライバのバージョンを試してみても症状は変わりませんでした.
また,Xの設定を疑ったりと色々迷走してました(^^;).

3. ドライバのインストール状況を確認

あれこれ試した末,ドライバが上手くインストールされていないんじゃないかと思い至りました.
そこで,下記のコマンドで状態を確認しました.

$ uname -r
5.4.0-162-generic

unameはLinuxのカーネル (OSのコア部分) 情報を表示するコマンドです.ここではuname -rでバージョンを表示しています.

$ dkms status
nvidia, 535.104.05: added

dkmsはLinuxのカーネルモジュールを生成するためのツールで,NVIDIAのドライバはこのツールを使って作成されています.dkms statusでモジュールの状態を表示しています.

dkms statusの結果addedと表示されています.これはモジュールのソースコードがあるけどインストールはされていない状態のようです.
これはモジュールのビルドに必要な依存パッケージが入ってないときに起きる挙動らしく,下記のようにしてカーネルのヘッダをインストールしました.

$ sudo apt install linux-headers-$(uname -r)
$ dkms status
nvidia, 535.104.05, 5.4.0-162-generic, x86_64: installed

カーネルのヘッダをインストールするとDKMSのモジュールは自動的にビルドされるようで,installedと表示されるようになりました.
Ubuntuをアップグレードした際にカーネルヘッダのアップデート等が上手くいってなかったのかもしれません.

4. ドライバのロード状況を確認して修正

ここまででドライバのインストールに問題があることが分かって,修正も上手くできているはずなのですが,
再起動して動作を確認したところ,まだ上手くいきませんでした(^^;).

ドライバのロードが上手くされていないのでは?と考え,まずドライバの再設定を行いました.

$ sudo prime-select nvidia

prime-selectはデフォルトで使用するグラフィックスカードを設定するコマンドです.

$ sudo dpkg-reconfigure nvidia-dkms-535

dkpg-reconfigureはインストール済みパッケージを再設定するコマンドです.

次に,下記のコマンドでモジュールのロード状況を調べました.

$ lsmod | grep nouveau
nouveau              1949696  3
ttm                   106496  1 nouveau
mxm_wmi                16384  1 nouveau
drm_kms_helper        184320  1 nouveau
drm                   495616  7 drm_kms_helper,nvidia,ttm,nouveau
i2c_algo_bit           16384  2 igb,nouveau
wmi                    32768  4 intel_wmi_thunderbolt,wmi_bmof,mxm_wmi,nouveau
video                  57344  1 nouveau

lsmodはロード済みのカーネルモジュールを表示するコマンドです.
ここでは出力結果をgrepに渡してnouveauが存在する行だけ表示するようにしています.

nouveauはNVIDIAカードを動かすためのオープンソースのドライバで,これがロードされているため純正ドライバがロードできていないようです.

そこで,下記のようにしてnouveauがロードされないように設定しました.

$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf

vi上で下2行を記述して保存します.

1
2
blacklist nouveau
options nouveau modeset=0

blacklistでモジュールの自動読み込みを停止して,options nouveau modeset=0でカーネルによるモード設定を無効にしています.

この設定は過去にやった気がするのですが...今回のトラブル修正をしている過程でアレコレいじっている内に元に戻ってしまったようです.

ここまで行ったあとに,下記のコマンドでブート処理を再構成します.

$ sudo update-initramfs -u
$ sudo shutdown -r now

ここまでの作業後,再起動したところ無事認識されました(^^).

$ nvidia-smi
Sat Sep  9 08:06:16 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05             Driver Version: 535.104.05   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 GeForce RTX 2080 Ti     On  | 00000000:01:00.0  On |                  N/A |
| 30%   40C    P8               3W / 250W |     46MiB / 11264MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce RTX 2080 Ti     On  | 00000000:02:00.0 Off |                  N/A |
| 28%   35C    P8              17W / 250W |      6MiB / 11264MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1568      G   /usr/lib/xorg/Xorg                           36MiB |
|    0   N/A  N/A      1742      G   /usr/bin/gnome-shell                          7MiB |
|    1   N/A  N/A      1568      G   /usr/lib/xorg/Xorg                            4MiB |
+---------------------------------------------------------------------------------------+

如何でしたでしょうか?
NVIDIA関連のインストールは色々とハマる場合が多いです.
同じような現象でお困りの方が,少しでも参考になれば幸いです.