Ubuntu16.04にRTX2080Tiが対応するNvidia Driverのインストール


# はじめに

我が家のUbuntuPCに念願のGTX2080Tiが搭載された．それ伴って対応するNvidia Driverのインストールを行ったが結構詰まったのでその時のメモ．

# 環境
OS : Ubuntu 16.04
CPU : Intel(R) Core(TM) i9-7980XE CPU @ 2.60GHz
GPU : GEFORCE RTX 2080Ti


# インストール

## Nvidia Driverのダウンロード

インストールはこちらのリンクから環境を指定してインストールを行う．GTX2080Tiはバージョン410系からサポートされているので410系をダウンロードする．最新版は現在(2018/11/19)で410.75まであるが，私の環境では410.66でしかうまく動作しなかった．
[Drivers | GeForce](https://www.geforce.com/drivers)

もし古いバージョンのドライバが入っていたら削除する．

```sh:
$ sudo apt-get purge nvidia*
$ sudo apt-get purge cuda*
$ sudo apt autoremove
```

準備とお約束のGUIの停止．

```sh:
$ sudo service lightdm stop
$ sudo service gdm stop
$ sudo apt-get install build-essential
```

ダウンロードしたドライバに実行権限を与えて実行する．

```sh:
$ cd {ダウンロードしたディレクトリ}
$ sudo chmod +x NVIDIA-Linux-x86_64-410.66.run 
$ sudo ./NVIDIA-Linux-x86_64-410.66.run 
```

## カーネルの変更

Ubuntu16.04の最新カーネルにNvidiaが対応していないようで，このままだと`nvidia-smi`を入力してもエラーを返される．そこでUbuntuの利用可能なカーネルを確認し，動作が保証されている`Ubuntu, with Linux 4.10.0-28-generic`を利用するように設定を変更する．以下のリンクを参考にさせていただいた．

[Ubuntuでnvidiaドライバーが動作しない - Qiita](https://qiita.com/bohemian916/items/7637b9b0b3494f447c03)

```sh:
$ grep menuentry /boot/grub/grub.cfg
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
	menuentry 'Ubuntu, with Linux 4.15.0-39-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-39-generic-advanced-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
	menuentry 'Ubuntu, with Linux 4.15.0-39-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-39-generic-init-upstart-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
	menuentry 'Ubuntu, with Linux 4.15.0-39-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-39-generic-recovery-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
	menuentry 'Ubuntu, with Linux 4.10.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-advanced-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
	menuentry 'Ubuntu, with Linux 4.10.0-28-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-init-upstart-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
	menuentry 'Ubuntu, with Linux 4.10.0-28-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-recovery-7207aa24-4507-4c74-9c7d-f888905d2ba9' {
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {

```

これを元に`/etc/default/grub`を編集する．

```sh:
$ vi /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

# GRUB_DEFAULT=0 
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.10.0-28-generic"
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

```

`GRUB_DEFAULT=0 `をコメントアウトして`GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.10.0-28-generic"`を追記する．リンク先では`GRUB_DEFAULT=3`のようにしても切り替えられるとなっていたが，私の環境ではできなかった．

設定を反映させるために以下のコマンドを実行し，端末を再起動．

```sh:
$ sudo update-grub
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Linux イメージを見つけました: /boot/vmlinuz-4.15.0-39-generic
Found initrd image: /boot/initrd.img-4.15.0-39-generic
Linux イメージを見つけました: /boot/vmlinuz-4.10.0-28-generic
Found initrd image: /boot/initrd.img-4.10.0-28-generic
Adding boot menu entry for EFI firmware configuration
完了
$ sudo reboot
```

## 実行確認

カーネルのバージョンが変わり`nvidia-smi`コマンドが実行できれば完了．

```
$ uname -r
4.10.0-28-generic
$ nvidia-smi 
Mon Nov 19 20:23:19 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.66       Driver Version: 410.66       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:65:00.0  On |                  N/A |
| 35%   28C    P8     2W / 260W |    288MiB / 10986MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1346      G   /usr/lib/xorg/Xorg                            50MiB |
|    0      2716      G   unity-control-center                           6MiB |
|    0      3049      G   /usr/lib/xorg/Xorg                            47MiB |
|    0      3908      G   /usr/lib/xorg/Xorg                            59MiB |
+-----------------------------------------------------------------------------+
```

# 失敗したこと

aptにnvidia driverとcudaがあったのでそのままインストールを行ったが，cudaとのバージョンが噛み合わない違うようでエラーが出た．

```sh:
$ sudo apt-get install cuda
$ sudo apt-get install nvidia-410
```

# 終わりに
nvidia toolkitのインストールしんどい．