GPU
ubuntu16.04

Ubuntu 16.04 でログインループや low graphics mode, 画面ブラックアウトになる原因と対策

OpenGL/Vulkan でグラフィックスアプリ開発しつつ OpenCL/CUDA で機械学習もするとなると, ベンダーのプロプライエタリなドライバをインストールするのが必須ですね.

しかしアップデートしたり GPU 入れ替えしたりするとログインループ(lightdm のウィンドウは出るが, パスワードを入力すると画面が一瞬切り替わるがもとに戻ってしまう)になったり, low graphics モードでうまく画面が出ない, そもそも画面が真っ黒になってしまう時があります.

いろいろ試行錯誤で 1, 2 日修復にかかったり, 結局治らず時間を無駄にしてしまうこともあります.

備忘録として, 原因と対策を記述します.

前提条件

  • lightdm を使っているものとします(Ubuntu のデフォルト)
  • それほど古くない GPU を使っているものとします(2018 年 5 月現在, NVIDIA は Pascal 系, AMD は Polaris/VEGA 系)
  • openssh-server をインストールしておいて, リモートログインできるようにしてある

原因リスト

よくある?例

apt で nvidia ドライバの再インストールなどで治るケースがあります.

Ubuntuでログインループに陥ったときの対処法
https://qiita.com/musaprg/items/58d9dee4ef70e3882a9d

GPU が新しすぎる

Linux のドライバがまだ対応していない場合があります. Linux の場合はあまり最新の GPU を使わないのがよいです(だいたい半年くらい経ってこなれてきたものがよい).

CPU が新しすぎる

Ryzen が発売されたときにいくらか問題がありました.

Ryzen + GeForce 1080 Ti + Ubuntu もしばらく辛抱が必要?(2017 April 02 時点)
https://qiita.com/syoyo/items/c7f8b4724d542db64a92

Ryzen + amdgpu-pro + Ubuntu は 2017 年夏頃まで辛抱が必要(2017/08/03 時点)
https://qiita.com/syoyo/items/37c4eae70595ac1185bd

CPU も発売してから 6 ヶ月くらい時間が経っているものを選ぶのが良いです.

カーネルが新しすぎる or 古すぎる

カスタムでカーネルを入れているなどする場合, dkms でドライバのコンパイルに失敗したりします.

ディスプレイ用に AMD GPU のあとに NVIDIA GPU をマシンに挿した.

amdgpu-pro ドライバや rocm ドライバを消し忘れている

/var/log/Xorg.0.logEE で grep して, nvidia ドライバが GLX 周りでエラーをレポートしている場合, 残っている AMD の GLX ドライバを見に行っているのが原因です.

$ amdgpu-pro-uninstall

で AMD のドライバを消し,

$ sudo service lightdm restart

します.

nomodeset あたりのカーネルパラメータを設定している.

Pascal 以降? の NVIDIA ドライバだと KMS(kernel mode setting) が必須のようなので nomodeset などのカーネルパラメータを grub で指定していたら消して置きます.

nvidia-smi コマンドが出ない.

nvidia ドライバをきちんとインストールしても, nvidia-smi コマンドが /usr/bin/nvidia-smi に存在しなくまたドライバ(GPU)が認識されない.

nvidia-smi などは実際は /etc/alternatives へのシンボリックリンクで, このファイルはさらに各ドライバパッケージ(たとえば /usr/lib/nvidia-390) へのシンボリックリンクになっています.

update-alternatives の設定がなんらかの原因で失敗しています.
(過去の NVIDIA or AMD ドライバがなにか設定を破壊したとか)

この辺りは筆者が Ubuntu の仕組みがよく理解できていないので解決策はわかりません...
(筆者はこの状況になったときは, 結局 ubuntu 再インストールしました)

その他

結局システム一式再インストールしたほうが手っ取りはやいというケースもあります.

NFS/NIS(今だと ActiveDirectory?)で /home や作業データはネットワーク上のサーバーに置いて, ユーザーもサーバで管理, ドライバ周りでおかしくなったらシステム再インストールで作り直ししやすくする, とするのが良さそうです.

TODO

  • Ubuntu の update-alternatives の挙動を理解する
  • OpenStack, Terraform あたりでベアメタル環境をデプロイ&管理できるようにしたい.