GPU搭載ゲーミングノートへのUbuntu18.04デュアルブート時のグラフィックドライバの処理

**注意**
ここに書いてあることは、あくまで私の環境で上手く行ったというケースレポートです。
ご自身の環境で上手く行く保証はできません。また、試される場合もあくまで自己責任でお願い致します。
 
***

## TL;DR

要点です。

* Win10 GPUラップトップにUbuntu18.04を導入しようとしたが、Nvidiaドライバ周りの不具合によりデフォルトの導入に失敗した。
* 既存の方法のうち、試したがうまく行かなかったもの
    * カーネルパラメータに`nomodeset`を追加する方法
        * Ubuntuを導入できるが、ディスプレイが正しく認識されなくなってしまう。
    * カーネルパラメータに`nouveau.modeset=0`を追加する方法
        * 起動プロセスが途中で止まり、フリーズしてしまう。
* 解決できた方法：カーネルパラメータに`nouveau.runpm=0`を追加する。
    * Nvidiaの純正ドライバが正しく認識され、サブディスプレイも使用可能

## 補足

2019/04/18にUbuntu19.04がリリースされました。[リリースノート](https://wiki.ubuntu.com/DiscoDingo/ReleaseNotes)によると、

>Safe Graphics Mode. A new option is added to the Grub menu which will boot with "NOMODESET" on. This may help you resolve issues on certain graphics cards and allow you to boot and install any propriatary drivers needed by your system.

とあります。([参照箇所](https://wiki.ubuntu.com/DiscoDingo/ReleaseNotes#Desktop_Updates))
19.04以降をインストールする場合は、Grub時にこのオプションを選択することでトラブルを回避できる可能性があります。通常インストールで失敗した場合は、本記事で紹介する方法を試す前に、このオプションを試すことをおすすめいたします。

***
以下、詳しい背景などを説明します。

## 環境

* マシン：`G-GEAR note N1586Jシリーズ N1586J-710/T`(TsukumoのBTOです）
* GPU:`Nvidia 1070 MaxQ`
* チップ：`Core i7-8750H`
* Default OS: Windows10 Pro
* Additional OS: Ubuntu 18.04 Japanese Remix

## Background

開発やらちょっとGPGPUで遊ぶ分にはLinuxのほうが何かと便利です。これはデュアルブートするしかない[^1]ですね。
[^1]: 2018年10月現在、WSLはGPUに対応していません。またVBoxからGPUを動かすのもなかなか大変なようです。計算用途に用いるのであれば、LinuxOSで使うのが最も現実的な気がします。

## やり方

ココらへんは、他のWebページによく纏まっていますので、簡単に流れだけ書きます。

1. インストールメディアは[Unetbootin](https://unetbootin.github.io/)を用いてUSBに焼きました。
2. UEFI高速スタートアップを無効にします
3. セキュアブートを無効にします。
4. PCを再起動し、起動中に所定のキー[^2]を連打し、BIOS画面に入ります。
5. USBの起動順を最初に持っていき、「保存して起動」
6. GRUB画面が表示されたら、Try UbuntuかInstall Ubuntuを選択（矢印キーを使用して、目的とする行がハイライトされるようにハイライト部位を動かす）
7. `e`を押して、起動オプションの画面を開きます。
8. 矢印キーでカーソルを動かし、`linux`から始まる行の`quiet splash`を削除
9. 代わりに`nouveau.runpm=0`を書き加えます。
10. Boot（おそらくF10です）

ここで行った変更は、一回のみしか反映されず、次回の起動からはもとのパラメーター（`quiet splash`）が適用されてしまいます。変更を保存するためには、インストールが終了後・再起動したあとに、以下の編集が必要になります。

```bash
sudo vi[←ここはお好きなエディターで] /etc/default/grub
```

ファイルを開き、先程同様`linux`で始まる行の`quiet splash`を`nouveau.runpm=0`に書き換えます。
書き換え後、変更を適用します。

```
sudo update-grub
```

インストール完了後、CUDAのインストールを行います。このときにCUDAとグラフィックボードの両方に合ったネイティブドライバがインストールされます。（2018年10月時点で、CUDA10だと、ドライバは410でした）

[^2]: マシンによって異なり、F2, F12, ESCなどのものが多いようです。


## なぜ`nomodeset`や`nouveau.modeset=0`ではだめなのか

UbuntuにはNouveau（ヌーヴォー：仏、新しい）というサードパーティ製のNvidiaグラフィックドライバが入っています。NouveauはGPUデスクトップにネイティブドライバをインストールする際に干渉し、ネイティブドライバのインストールに失敗するケースがあるようです。そこで、戦略としてはNouveauをオフにした状態でUbuntuをインストールし、続けざまにネイティブドライバをインストールするという方針になります。[^3]上に書いた`nomodeset`も`nouveau.modeset=0`もNouveauをオフにするための方法です。

[^3]: Nouveauをアンインストールできれば良いのですが、探してもやり方が見つかりませんでした。

### `nomodeset`がだめな理由

`nomodeset`は、全てのグラフィックドライバの起動を停止します。このためビデオカード用のドライバはおろか、オンボードのドライバ（IntelGraphicsとかです）さえも動きません。ディスプレイはUbuntuOSに付属している最小レベルのドライバで駆動されます。このため、ディスプレイが正しく認識されませんでした。本来ならばBuild in Displayとして認識されるはずですが、Unknown Displayと認識されてしまい、解像度の変更やリフレッシュレートの変更ができませんでした。

### `nouveau.modeset=0`がだめな理由

`nouveau.modeset=0`が駄目で、`nouveau.runpm=0`がうまくいく理由はよくわかっていません。[このページ](https://nouveau.freedesktop.org/wiki/KernelModuleParameters/)によると、これらのパラメータはそれぞれ

> **runpm**
> Force enable 1 or disable 0, runtime power-managment. The default only for Optimus systems is -1.

> **modeset**
> Whether the driver should be enabled. 0 for disabled, 1 for enabled, 2 for headless

という内容ですが、power-managementを0にすることと、ドライバを無効化することがどう違うのかよくわかりません。ご存知の方がいらっしゃいましたらご教授下さい。

## 参考ページ

### Dualbootのやり方に関して

* [MSI製ゲーミングノートに機械学習環境を構築する時の罠と対策 【GS65 GTX1070】](https://qiita.com/delete/items/2ee2a19f0e75d83313ac)
    * デュアルブートそのものやり方やCUDAのインストール方法が書かれています。
    * グラフィックドライバまわりの処理については、本記事と異なるやり方が紹介されています。
* [nVidiaのGPU搭載PCにUbuntuを入れようとしてハマった](https://qiita.com/bohemian916/items/8c7f0c4b3d3ea0958559)
    * カーネルパラメータの設定方法が写真付きでわかりやすく紹介されています。
* [Windows10のデュアルブートUbuntu16.04LTS(GTX1080)でTensorFlow-gpu==0.12.1(python3版）使えるまでの道のり](https://qiita.com/teratera/items/2f85219d3f282ad40f93)
    * CUDAあるいはTensorflowのインストール方法まで書かれています。

### カーネルパラメータに関して

* [Nouveauドライバのカーネルパラメータ一覧](https://nouveau.freedesktop.org/wiki/KernelModuleParameters/)

### その他諸々

トラブルシューティングにあたって、参考にしたページを載せておきます。AskUbuntuやら、Nvidiaのフォーラムなどです。

* https://askubuntu.com/questions/921580/ubuntu-freezes-on-login-after-prime-select-intel/923216#923216
* https://askubuntu.com/questions/1059778/selecting-intel-graphics-makes-my-system-crash-at-boot
* https://devtalk.nvidia.com/default/topic/1024318/linux/-solved-nvidia-prime-on-dual-gpu-configuration-giving-a-blank-screen/post/5210971/#5210971
* https://askubuntu.com/questions/1050672/gdm3-does-not-start-in-ubuntu-18-04
* https://askubuntu.com/questions/1048274/ubuntu-18-04-stopped-working-with-nvidia-drivers/1048488#1048488



***

## 編集履歴

* 2019/04/22 補足：ubuntu19.04リリースに伴うGrubOption追加