UbuntuにCUDAをNVIDIA提供のパッケージからインストールすると、ディスプレイドライバも同時にインストールされる。それで正常に動作している場合はよいが、時として画面がまったく表示されなかったり、表示はされるがログイン時にウィンドウマネージャも何も表示されないなどの症状が出ることがあるので、そういうときのチェック項目をメモしておく。
まず、前提としてsshで別の端末からログインする方法は確保されているものとする。
ウィンドウが全く表示されず、コンソール画面も使用できない場合は、リモートログインして、/var/log/Xorg.0.logをチェックする。ファイル末尾まで飛んでから(EE)を後から検索してちょっと溯り、nvidiaがらみのエラーをチェックする。
(EE) Failed to load module "nvidia" (module does not exist, 0)
のような行があったら、Xサーバがnvidiaモジュールの読み込みに失敗している。 /usr/lib/xorg/modules/drivers をチェックして、ここにnvidia_drv.soというモジュールがあるかどうか見てみる。なければ、ディスプレイドライバのディレクトリ/usr/lib/nvidia-ドライババージョン/xorgの中にあるnvidia_drv.soをここにコピーしてくる。
これでnvidia_drv.soは読み込めるようになるはずだ。まだ表示が出ない場合、カーネルモジュールの方もチェックしてみる。/var/log/kern.logを見て、nvidiaモジュールが読み込まれているかどうか調べる。module verification failedとかmodule license 'NVIDIA' taints kernelとかのメッセージはプロプライエタリドライバであるせいなので気にする必要はない。前のバージョンのドライバのアンインストールが不完全であったりすると、上記のxorgの方のモジュールとのバージョンミスマッチでの初期化失敗メッセージがあるので、そのような場合は古いカーネルモジュールを手動で削除する必要があるかもしれない。カーネルモジュールの場所は、/lib/modules/カーネルバージョン/updates/dkmsである。ここにnvidia.koとnvidia-uvm.koがあればよい。インストールした方法によって、ドライバのバージョン番号が入ったファイル名になっている場合、あるいはバージョン番号ありとなしのファイルが混在している場合などがあり、最後のケースなどは両者でバージョンが矛盾している可能性が高いので、
modinfo モジュール名
などで確認したのち、古いバージョンを確実に削除する。
これで通常はログイン画面は表示されるようになる。しかしこの後、ログインするとウィンドウマネージャが起動せず実際の操作が何もできない状態になる場合がある。これは、compizウィンドウマネージャが必要とするxorgのGLX拡張機能が正常に動作していないせいだ。/var/log/Xorg.0.logを見てglxモジュールが読み込めているかどうかをチェックし、読み込めているように見える場合は/usr/lib/xorg/modules/extensionsディレクトリの内容を確認する。ここにlibglx.soというファイルがあれば、それがGLXモジュールなのだが、問題はこれがnvidiaのものではなく、Mesa由来のものである可能性があることだ。
dpkg -S /usr/lib/xorg/modules/extensions/ligblx.so
で所属パッケージ名がxserver-xorg-coreと表示されたらnvidiaのものではないので、
sudo mv libglx.so libglx.so.xorg
などと名前を変更して、nvidiaのglxモジュールを
sudo cp /usr/lib/nvidia-ドライババージョン/xorg/libglx.so.バージョン番号 libglx.so
のようにしてコピーしてくる。これで再起動すればGLXも使用可能になるはずである。しかしさらに稀にインストールがうまく行っていない場合、libglx.soからさらに参照されている下位のライブラリ(libnvidia-tls.so等)がうまく参照できずlibglx.soが初期化に失敗するケースがある。これらの下位ライブラリは/usr/lib/nvidia-ドライババージョン 以下にあるのだが、正常に読み込めているかどうかは
ldconfig -p | grep nvidia
としてみれば分かる。これが3行くらいしか出てこなければライブラリが読み込めていない。うまく行っていれば50行くらいの出力がある。
もしうまく行っていない場合は、/etc/ld.so.conf.d/以下のnvidia_settings.conf、あるいは類似のファイル名の設定ファイルをチェックする。おそらくシンボリックリンクになっているが、これが(途中何段階かシンボリックリンクを経由していても良い)最終的に正しく
/usr/lib/nvidia-ドライババージョン/ld.so.conf
を指し示すように適宜リンクを修正し、ldconfigを一度実行する。先のldconfig -pの出力が正常になればよい。これで再起動すればよい。
なお、GLXモジュールはnvidiaのものでなくxserver-xorg-coreのものが読み込まれてもとりあえず一見正常に動作するケースもある。しかしパフォーマンスや、シェーダーの互換性の問題でOpenGLを用いたプログラム等が正しく動作しないケースも出てくるので、
glxinfo | grep vendor
で表示されるGLX機能の提供元がNVIDIAになっていることを確認しておく必要がある。NVIDIAでないGLXモジュールが読み込まれているなら、上記の方法で修正する。
およそ以上がドライバインストールがうまくいっていない場合のチェック項目である。