NVIDIAドライバのLinuxへのインストール・トラブルシューティング総まとめ

はじめに

LinuxNVIDIAGPUの機能をフルに使うためにはNVIDIA公式のドライバを入れる必要があります。ただ、これがなかなか一筋縄ではいかず、設定をいじっているうちに画面がつかなくなって混乱したり、解決策を調べようとしても情報が錯綜していたりしてとても苦労するので、自分なりにまとめてみました。今回の環境はIntel+NVIDIAのデュアルGPUのノートパソコン(Windowsプリインストール、セキュアブート有効)という個人用PCでは考えられる限り最も"過酷な"環境だったので、広範なトラブルが発生しましたが、その分いい経験になったかなとは思います。比較的系統立てた感じにしたつもりですが、試行錯誤の過程でインターネットで得た情報の9割方が役に立たなかったことを考えるとそんなに全員に当てはまるとも思えないので話半分に受け取っていただければ幸いです。あと、長いです。なお環境はUbuntuLinux Mint)ですが他のLinuxでもあんまり変わらない気がします。

予備知識

GUIが起動しないことがあるかもしれないので、テキストモードで一通りの操作(viとか。僕はiと:wqと:q!しか覚えていませんが)はできたほうがいいと思います。grub画面でのカーネルパラメータの編集、grepなども頻出です。自信がない人はそもそもトラブルに巻き込まれないよう、各段階を慎重にやりましょう。

概観

NVIDIAのドライバを正しく動作させるまでの段階をいくつかに分けてみます。

0.NVIDIAのグラフィックボードが搭載されている

1.NVIDIAのドライバーがLinuxが認識できる場所にインストールされている

2.NVIDIAのドライバーが起動している

3.Xorg周りが正しく設定されている

前の段階がうまく行ってないのにあとの方に関する設定をしても当然うまく行きません。うまく行っているかの確認方法などと合わせてそれぞれの段階のやり方を見ていきます。

0.NVIDIAのグラフィックボードが搭載されている

当たり前ですが念のため。デバイスがなければそもそもドライバを入れる必要もありません。確認方法は

lspci | grep VGA

です。今回の環境はIntel+NVIDIAのデュアルGPUなので

00:02.0 VGA compatible controller: Intel Corporation Device 3e9b
01:00.0 VGA compatible controller: NVIDIA Corporation GP107GLM [Quadro P600 Mobile] (rev a1)

と出力されます。自分のPCが実はデュアルGPUだった、ということもあるかと思うので状況の正確な把握のためにも結果は見ておきましょう。最初の数字や細かい型番などはとりあえず気にしなくて大丈夫です。

 1.NVIDIAのドライバーがLinuxが認識できる場所にインストールされている

環境によっては(例えばセキュアブート無しでNVIDIAGPUしか入っていないデスクトップPC)ここの操作をすれば自動的に第3段階まで完了するかもしれませんが、分けて解説していきます。

まずは確認方法からです。modprobe nviあたりまで打ってからTab(補完)キーを押したときに

nvidia-drm nvidia-modeset nvidia-uvm nvidiafb

と4つか5つくらい出てくれば正しくインストールされています。nvidiafbだけしか出てこなかったりしたらダメです。ちなみにこれらは.koというファイルの形で/lib/modules以下に入っています。通常はnvidia-drmなどは/lib/modules/x.xx.x-xx-generic/kernel/drivers/video以下です(が/lib/modules/x.xx.x-xx-generic/update/dkmsに入ってるみたいな情報も見かけました)。

ではインストール方法を見ていきます。大きく分けて①.debパッケージを使うNVIDIA公式サイトのインストーラを使う の2つがあります。基本的には①を推奨します。パッケージが利用できない場合は②しかありません(RHEL系などもこっち?)。

①で、かつセキュアブート無効の場合は一番簡単で、普通にaptでインストールすれば何事もなく終了します。

セキュアブート有効のときはインストール終盤でセキュアブートのためのパスワードの入力を求められます。インストール後に再起動するとPerform MOK Managementというような青い画面(細かいところや色などは違うかもしれませんが)が出てきます。ここでContinue Bootを選択すればそのままブートできるのですがこれだとドライバは動作しません(ここで結構ハマりました)。必ずEnroll MOKを選択し先程入力したパスワードをここで入力します。このパスワードはたしか今後二度と使うことはないはず。

 

次に②です。まずdkmsパッケージがなければsudo apt install dkmsでインストールしておきます。入れないでも動いたという記事もありますが、dkms使ったほうがカーネルアップデート時に自動で反映されるかなんかで、インストール手順も短くなるので便利だと思います。実際に前述のパッケージによるインストールでもdkmsは使われています(nvidia-dkms-xxxというパッケージがインストールされ、これがセキュアブート時のパスワード入力画面をトリガしている模様)。そして、このタイミングで公式サイトからインストーラをダウンロードしておきます。chmod +xも今のうちにやっておきましょう。実行するのはまだです。

次にnouveauを無効化します。このあたりは調べると結構情報が出てきますがここでも一通り解説します。

lsmod | grep nouveau

を実行し、出力が一行でもあった場合は、

echo 'blacklist nouveau' >> /etc/modprobe.d/nouveau_blacklist.conf

として一旦再起動します(再起動の前にupdate-initramfs -u -k allを実行する必要があるという情報もありましたが少なくとも僕の環境では不要でした。/lib/modprobe.d/*.confに書き込んだ場合は必要なのかも)。もう一度lsmod | grep nouveauを実行して出力がなければ大丈夫です。なお再起動後に画面の解像度が低かったりそもそもGUIが起動しなかったりするかもしれませんが、それはnouveauが正しく無効化できているということなので、焦らずCtrl+Alt+F1とかで仮想コンソールに移動しましょう。どうせこのあとでGUIを無効化することになります。ちなみに今述べた過程を飛ばしてインストールしようとすると、インストーラが代わりに上記の作業をやってあげますよと提案してきます。

さて、ここまで来たらドライバのインストールです。GUIからログアウトしてXを終了し、Ctrl+Alt+F1(F1~F6、どれでもいいです)で仮想コンソールに移動します。そしてインストーラを実行します。注意点がいくつかあるので順番に紹介します。

●The distribution-provided pre-install script failed!と出ても全く気にせず続けましょう。インストールするかどうかの確認として表示されているだけでエラーではないという意見をどっかで見ましたが本当にそんな気がします。だとしたら随分誤解を与える文面です。

●32bit関連のやつは、入れていい?って聞かれたら入れていいと思います。依存関係がダメで32bitのは入れられないけどいい?って聞かれたら入れなくていいと思います。あまり調べていません。

●libglvndが不完全なのでインストールし直しますか?みたいなのはInstall and overwrite existing filesを選んで上書きインストールしてもらいましょう。Ubuntuなら、インストーラ起動前に予めlibglvnd-devパッケージを入れておけばこの表示は出ないのでそれでもいいです。

●dkmsのエラーで止まることがあります。

ERROR: Failed to run `/usr/sbin/dkms build -m nvidia -v xxx.xx -kx.xx.x-xx-generic`:

的なやつです。nvidia-installer.logを見ると、make.logを見ろと書いてあり、それを見るとgccのバージョンのエラーだと書いてあると思うので、インストーラに--no-cc-version-checkオプションをつけて最初からやり直してください。このオプションをつけたことによるバグはほぼ起きないんだろうと思いますが、ヘルプに書いてあるとおりもし起きたらめっちゃ見つけにくいものになるだろうってのはマジだと思います。どうしても怖い人はgccのバージョンを頑張って合わせればいいと思いますが僕は一回やろうとして依存関係がごちゃごちゃになったので二度とやりません。

●最後に、Xの設定をいい感じにしますか?というようなことを聞かれます。具体的には以下のような文面です。

Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X? Any pre-existing X configuration file will be backed up.

こういうのはたいていYesにしておけばいいものなのですがこれに関してはNoのほうが良さそうです。ここでいうXの設定とは/etc/X11/xorg.confのことなのですが、最近はxorg.confは非推奨でXが各デバイスを自動検出して動作するほうが望ましいとされているようで、実際にマルチディスプレイにしようと思ったときもこのインストーラーが書き込んだxorg.confがあると動作せず、消したら動きました。これはおそらくIntel+NVIDIAという構成にも原因があり(その証拠にノートPCの本体ディスプレイはつかず外部ディスプレイだけがつきました)、NVIDIAしか入っていないPCではYesでも問題ない気がするのですが、あってもなくてもいい設定ファイルはない方がいいでしょう。もしYesを選択してしまってもあとから/etc/X11/xorg.confを消せば問題ありません。

Intel+NVIDIAの場合、インストール終了後(前でもいいですが)にnvidia-primeパッケージを入れてください。ここも結構ハマりました。ちなみにnvidia-driver-xxxパッケージによるインストールなら自動で入ります。また、NVIDIAをアンインストールするときはnvidia-primeも一緒にアンインストールするか、prime-select intelを実行してください。じゃないとXがnvidiaをロードしようとしてGUIが起動しなかったりします。

●以下は、セキュアブートを有効にしている場合の注意点です。

●パッケージによるインストールと同様、セキュアブート設定のためのパスワード入力画面が出ます。再起動後は必ずEnroll MOKを選んでそのパスワードを入力してください。

●Building module (This may take a moment)が5%のままいつまで経っても終わらずエラーも出ない、ということがありました。これは調べても全く症例がなく苦労しましたが、straceを使って調べた結果、インストール自体は正常に行われていて画面表示だけがバグっているようでした。結論から言えば、この状態から、バグっていない場合の操作

Tab→Enter→(パスワード入力(8文字以上))→Tab→Enter→(パスワード再入力)→Tab→Enter

をそのままやると先に進むことができます。タイミングは1分くらい待てば十分だと思います(不安な人はps -aでプロセス番号調べてstrace -p xxxxで様子を見てください。module, signみたいな文字列が見えたらそこです)。これはびっくりしました。

●ここまでうまく行ったのに最後にUnable to load the 'nvidia-drm' kernel moduleと出てインストールに失敗してしまうことがあります、というか多分必ずそうなります。これは考えてみれば当然で、再起動時にパスワードを入力するのはセキュアブート有効の状態でもドライバをロードできるようにするためですから、再起動の前にロードしようとしてもできるはずがありません。おそらく実際にはインストールの主要な行程(少なくとも今述べている「第一段階」)はこのエラーが出るまでには完了しており、残るは先程Noを選んだほうがいいと述べたXの設定だけなので、インストールは成功したと思って構いません。そのままインストーラを閉じて再起動後にパスワードを入力しましょう。

 -----

以上、長々と解説してきましたがこれが第一段階になります。しかるべき再起動をしたあと、画面がついてもつかなくても、とりあえずmodprobeの候補に出てくるかの確認をしてください。第一段階とはいえここが終わればインストールは終わったということですからあとはもうすぐです。というかここまでにミスがなければこのあとの段階は要らないはずです。これ以降は主にトラブルシューティング用に書いています。

2.NVIDIAのドライバーが起動している

ドライバーが正しくインストールされてシステムに認識されていても、インストールのどこかで失敗していたり設定が間違っていたりすると起動しないことがあります。さっそく確認方法を見ていきます。

lsmod | grep nvidia

これで何行か出力があればnvidiaは正常にロードされて(起動して)います。ロードされていなければ一行も出力されません。

起動しない原因は様々なものが考えられます。いくつか状況判断に有用なコマンドを挙げておくと

lsmod | grep nouveau

cat /var/log/Xorg.0.log | grep EE

cat /var/log/Xorg.0.log | grep WW

cat /var/log/Xorg.0.log | grep -i NVIDIA

cat /var/log/gpu-manager.log

などでしょうか。nouveauがロードされているとnvidiaが起動しない場合があるのでblacklistに入れましょう(前述)。grepは適宜"-5"などのオプションをつけると前後の状況がつかみやすいです。また、modprobe nvidia_drm などとして直接nvidiaをロードしようとしてみてエラーを見てみるという方法もあります。これでmodprobe: ERROR: could not insert 'nvidia_drm': Required key not availableと出ればセキュアブートまわりのエラーだと思います。このエラーが出たあとにdmesgを実行して一番下が PKCS#7 signature not signed with a trusted keyとなっていれば間違いないです。このときは、公式の.runファイルならもう一度インストールし直し、パッケージを使っていた場合はnvidia-dkms-xxxを再インストールしましょう。こんどは忘れずに再起動後にEnroll MOKを選択しましょう。modprobe: ERROR: could not insert 'nvidia': No such deviceと出た場合、これはIntel+NVIDIAなのが原因だと思います。僕の場合はnvidia-primeを入れると解決しました。

ちなみに試しにprime-select intelにして再起動し(nvidiaはロードされない)、modprobe nvidiaとしてみると

modprobe: ERROR: ../libkmod/libkmod-module.c:832 kmod_module_insert_module() could not find module by name='off'

modprobe: ERROR: could not insert 'off': Unknown symbol in module, or unknown parameter (see dmesg)

などというエラーが出ました。これが出たらprime-select nvidiaを実行すると治るかもしれません。

また、nvidia-primeを入れていない場合、GUIは起動せず、Xorg.0.logにもエラー(EE)は出ていないということがありました。とりあえずIntel+NVIDIAの場合はnvidia-primeを入れるのを忘れないようにしてください。

あとは、テキストモードで起動したときだけnvidiaがロードされる、ということもありました。このままでは使い物になりませんが、セキュアブート周りが上手く行っていることの確認にはなりますので試してみてください。ちなみにカーネルパラメータの設定をすると上手くいくと書いてあるサイトは結構ありますが、nouveau.modeset=0とかはblacklistに書いておけば十分ですし、ほかのいろんなオプションも試しましたがいずれもあってもなくても変わらない(NVIDIAが動いている状態で変えても影響がない)ものがほとんどです。ただ一つ、nomodesetだけは入れるとNVIDIAドライバが動かなくなりますので/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTに入っていれば外してください。ちなみにnomodesetというオプションはNVIDIAGPUが載っているのに公式ドライバを入れていない状態のLinux(特にLinux自体のインストール時など)でGUIが出ないときにつけるとご利益があることで有名です。が、それではだめでnouveau.modeset=0なら動いたとか、さらにそれでもだめでnouveau.runpm=0なら動いたなどの情報もありました(GPU搭載ゲーミングノートへのUbuntu18.04デュアルブート時のグラフィックドライバの処理 - Qiita)。

3.Xorg周りが正しく設定されている

以上まででとりあえずnvidiaが動作する状態まではこぎつけたのですが、その後もXorgの設定や状態によっては何か不都合がある場合があります。

cat /var/log/Xorg.0.log | grep EE

で一行も出ない状態にはしたいところです。これに関しては本当に環境によるのでなんとも言えませんが、個人的に遭遇したエラーを適当に書いておきます。他のエラーでも、検索すればけっこう色んなサイトがヒットするんじゃないかと思います。

 Failed to load module "glx" (loader failed, 7)

NVIDIAのバージョン違いでした。パッケージで390、公式インストーラで430が入ってたのでパッケージの方を消したら治りました。

modeset: Failed to load module “glamoregl” (module does not exist, 0)

→xserver-xorg-core(rhelならxorg-x11-server-Xorg?)を再インストールしたら治りました。

マルチディスプレイがつかない

→とにかくnvidiaが自動生成したxorg.confは消しましょう。IDとかそれっぽいことが書いてありますが、足かせになることはあれ助けにはならないというイメージを個人的には持ちました。

余談:カーネルアップデートについて

今回あまりここではハマらなかったので詳しくは書けないのですが、カーネルアップデートに伴ってNVIDIAドライバが正常に動作しなくなった(GUIが表示されないなど)時は起動時のGRUBメニューからアップデート以前のカーネルを選択するとうまくいくことが多いです。そうなれば原因はNVIDIAで間違いないので、正常に起動しないほうのカーネルからCUIを使って新しいドライバを入れましょう。(あるいは古いほうのカーネルから新しいカーネルをreinstallしてdkmsにモジュールを再生成されることもできる?)

まとめ

長々と書いてしまいましたが、他サイトにそれほど頻繁には書いてないところだと

・.runファイルは色々とめんどくさいのでできるだけdeb等のパッケージを使う

・やむを得ず.runを使う場合、

 ・複数のGPUが入っているときはnvidia-primeを入れる

 ・あらかじめdkmsを入れておく

 ・xorg.confを自動設定させない

・セキュアブートが有効(≒ノートPC)のときは、再起動時の青い画面で"Enroll MOK"を選ぶ

カーネルパラメータにnomodesetを入れない

あたりでしょうか。

たぶんもっと様々なエラーに直面したとは思うのですがそのときは解決するのに必死でいちいちメモをすることもなかったので、そうやってここからあぶれたエラーはまた別の人を苦しめるのでしょう。一応、コメントなどしてもらえれば解決に向けて努力はしてみようと思っています。その際は

ディストリビューションの種類

lspci | grep VGA

lsmod | grep nouveau

lsmod | grep nvidia

/var/log/gpu-manager.log

grep EE /var/log/Xorg.0.log

grep -i NVIDIA /var/log/Xorg.0.log

セキュアブートの有効/無効

あたりの内容が(長いものは要約でいいので)あると助かります。きっといつかNVIDIAは動くようになるので諦めずに頑張りましょう。