以前使っていた Radeon のグラフィックボードが壊れかけで画面が点滅するようになってしまった。 さっそく買い替え……と言いたいところだが、世界では半導体不足と仮想通貨マイニングの流行が続きグラフィックボードの価格が過激なほどに値上りしているようで、今はとても買えたタイミングでは無い。とはいえ点滅する画面を見つめていると気が散って仕方が無い。背に腹は変えられないということで、深層学習用のサーバーで使っていた GeForce を急遽、メインの PC に配置替えした。

メインの PC の OS は Fedora34 Workstation だ。これに GeForce を差してみると、どうも今度はソフト的な問題があるようで、スリープに高確率で失敗するとか、一部の動画を VLC で再生すると黒画面になるとか、微妙な不具合が発生するようになってしまった。スリープは何度か試行すれば通るのでまだ良いとして、動画が見られないのは耐え難い。

そこで今回は切り分けも兼ね、デフォルトで使用されるオープンソースの Nouveau ドライバに代わって NVIDIA のプロプライエタリドライバを入れてみることにした。

この記事は Fedora OS が動くメイン PC に NVIDIA ドライバをインストールした作業メモである。 基本的には下記のページに従いコマンドを実行しただけのため新しい情報は無いが、それではあまりに興が無いため少し勉強しながら解説を加えている。

Fedora 34/33/32 NVIDIA Drivers Install Guide – If Not True Then False

1. 環境

交換前のグラフィックボード: 電源供給が不要でマザーボードに立てるだけで動く可愛いやつである。

  • PowerColor Red Dragon Radeon RX 460 2GB GDDR5
  • TUL-AXRX 460 2GBD5-DH/OC

交換後のグラフィックボード: 4年前の秋葉原にて 30,000 円ちょっとで購入。今は中古でも 45,000 円近くするらしい。そんな馬鹿な。

  • ASUSTek STRIX NVIDIA GeForce GTX1060 6GB GDDR5
  • STRIX-GTX1060-DC206G
# lspci | grep VGA
06:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)

OS は Fedora34、CPU は AMD:

# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: Fedora
Description:    Fedora release 34 (Thirty Four)
Release:        34
Codename:       ThirtyFour
# uname -a
Linux fg-ryz 5.11.20-300.fc34.x86_64 #1 SMP Wed May 12 12:45:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Fedora といえば Wayland がディスプレイサーバーのデフォルトになっているが、私は X11 に戻している。サブディスプレイの明るさを調整できないからだ。X11 では xrandr を使えば調整できる。

# echo $XDG_SESSION_TYPE
x11

2. カーネルの最新化

念のため。

$ sudo dnf update
$ sudo shutdown -r now

3. NVIDIA ドライバのダウンロード

ドライバは Advanced Driver Search | NVIDIA よりダウンロードできる。以下のように条件を選択して、最新っぽいものを取得した。

  • Product Type: GeForce
  • Product Series: GeForce 10 Series
  • Product: GeForce GTX 1060
  • Operating System: Linux 64-bit
  • Language: English (US)
  • Recommended/Beta: All

最新っぽいもの:

Linux x64 (AMD64/EM64T) Display Driver NFB 465.31 May 18, 2021

Release Highlights:

Added support for the following GPUs:

  • GeForce RTX 3050 Ti Laptop GPU
  • GeForce RTX 3050 Laptop

Fixed a bug that could cause AddressSanitizer to report a heap-buffer-overflow during initialization of the OpenGL and Vulkan libraries.

ダウンロードしたファイルはどこに置いても構わないが root ユーザのホームディレクトリにあると、あとの作業が若干すっきりするだろう。

$ sudo mv NVIDIA-Linux-x86_64-460.80.run /root

4. Nouveau ドライバの無効化

Nouveau は NVIDIA 互換なオープンソースのドライバである 1。ドライバが複数居ると競合してしまうから、まずこれを無効化する必要がある。

udev が Nouveau のカーネルモジュールを読み込まないようにするため、modprobe の設定で blacklistnouveau を設定する 2

$ su -
# nvim /etc/modprobe.d/blacklist.conf
# cat /etc/modprobe.d/blacklist.conf
blacklist nouveau

さらにカーネルの起動パラメーターにも rd.blacklist を追加し、nouveau を無効化する。

/etc/default/grub を直接編集して、GRUB_CMDLINE_LINUX の末尾に rd.driver.blacklist=nouveau を加える。 こういうときは grubby 使うんじゃなかったっけ? まあいいか。

# nvim /etc/default/grub
# grep GRUB_CMDLINE_LINUX /etc/default/grub
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet rd.driver.blacklist=nouveau"

せっかくなので全文:

# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet rd.driver.blacklist=nouveau"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

そして GRUB 2 の設定ファイルを生成して置き換える。 ここで grub2-mkconfig -o で指定するファイルパス、すなわち GRUB 2 設定の書き込み先は、Fedora34 ならば UEFI ブートでも BIOS ブートでも同じく /boot/grub2/grub.cfg となる 3。一方 Fedora33 以前では UEFI と BIOS の時で異なりややこしい。

# cp -p /boot/grub2/grub.cfg{,.20210518}
# grub2-mkconfig -o /boot/grub2/grub.cfg

grub.cfg で設定する kerneloptsrd.driver.blacklist=nouveau が加わったことが確認できる。

# grep kernelopts= /boot/grub2/grub.cfg
  set kernelopts="root=/dev/mapper/fedora_localhost--live-root ro resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet rd.driver.blacklist=nouveau "

5. X11 Nouveau ドライバの削除

X11 の Nouveau ドライバを削除する。これを実行すると突然画面が消える…ということは無いので安心して実行してよい。

# dnf search xorg-x11-drv-nouveau
xorg-x11-drv-nouveau.x86_64 : Xorg X11 nouveau video driver for NVIDIA graphics chipsets
# dnf remove xorg-x11-drv-nouveau

6. initramfs の生成

initramfs を作り直して置き換える。initramfs はカーネル起動時に最初に必要となるドライバ等が一式詰められたディスクイメージである。nouveau は initramfs の時点で読み込まれるため、ここで dracut コマンドを使い、nouveau が無効なイメージを作成する。

## Backup old initramfs nouveau image ##
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
 
## Create new initramfs image ##
dracut /boot/initramfs-$(uname -r).img $(uname -r)

試しに生成された initramfs.img を開けてみると、さっき作った blacklist.conf が入っていることがわかる。

# mkdir ./initramfs
# zcat /boot/initramfs-$(uname -r).img | cpio -idmv -D ./initramfs
# cat ./initramfs/etc/modprobe.d/blacklist.conf
blacklist nouveau

7. NVIDIA ドライバのインストール

いよいよ NVIDIA ドライバのインストールに入っていく。しかし、ここまでの作業で Nouveau を無効化してしまったので、再起動後に GUI を表示できない。そこで Runlevel を 3 すなわち GUI 無しのマルチユーザーモードに設定しておく。

# systemctl set-default multi-user.target

そして再起動する。

# shutdown -r now

マズいことになっていなければ、白黒の画面で普通にログインシェルが立ち上がる。自分で GUI 無効にしたのだから当然だ。何も恐れることは無い。

ログインできたら、やっと初めにダウンロードしたインストーラの出番になる。 先に必要なパッケージを DNF でインストールして、NVIDIA ドライバのインストーラを実行する。インストール中、いくつか対話的に質問を受けるが基本的に “YES” を選んでおけば問題無い。

$ su - 
# dnf install libglvnd-glx libglvnd-opengl libglvnd-devel
# chmod u+x NVIDIA-Linux-x86_64-460.80.run
# ./NVIDIA-Linux-x86_64-460.80.run

しばしの間、プログレスバーが伸びていくのを眺める。最後に “Completed” 的なメッセージが表示されたら成功だ。やった!!

最後に Runlevel を 5 すなわち GUI 有りに戻して再起動する。 無事にデスクトップの画面が表示されればインストール作業完了である。

# systemctl set-default graphical.target
# shutdown -r now

起動後、コンソールでは nvidia-installer が使えるようになっている。今回インストールしたのは version 460.80 である。

# nvidia-installer -v

nvidia-installer:  version 460.80
  The NVIDIA Software Installer for Unix/Linux.

  This program is used to install, upgrade and uninstall The NVIDIA Accelerated Graphics Driver Set for
  Linux-x86_64.

カーネルモジュールを見てみると、nvidia が読み込まれていることが確認できた。

# lsmod | grep -i nvidia
nvidia_drm             65536  5
nvidia_modeset       1232896  7 nvidia_drm
nvidia              34177024  361 nvidia_modeset
drm_kms_helper        278528  1 nvidia_drm
drm                   618496  8 drm_kms_helper,nvidia_drm

8. ビデオアクセラレーションの有効化

ビデオアクセラレーションを有効化するために、いくつか追加でインストールする。

# dnf install vdpauinfo libva-vdpau-driver libva-utils
...
インストール済み:
  libva-utils-2.11.1-1.fc34.x86_64 libva-vdpau-driver-0.7.4-109.fc34.x86_64 vdpauinfo-1.0-17.fc34.x86_64

完了しました!

vdpauinfo を使い 4 VDPAU の状態を確認すると、何やらライブラリが読まれたことや、諸々の機能が使えるようになっていることがわかる。

# vdpauinfo 
display: :0   screen: 0
API version: 1
Information string: NVIDIA VDPAU Driver Shared Library  460.80  Fri May  7 06:47:34 UTC 2021

Video surface:

name   width height types
-------------------------------------------
420     8192  8192  NV12 YV12
422     8192  8192  UYVY YUYV
444     8192  8192  NV24 YV24

Decoder capabilities:

name                        level macbs width height
----------------------------------------------------
MPEG1                           0 65536  4096  4096
MPEG2_SIMPLE                    3 65536  4096  4096
MPEG2_MAIN                      3 65536  4096  4096
H264_BASELINE                  51 65536  4096  4096
H264_MAIN                      51 65536  4096  4096
H264_HIGH                      51 65536  4096  4096
VC1_SIMPLE                      1  8190  2048  2048
VC1_MAIN                        2  8190  2048  2048
VC1_ADVANCED                    4  8190  2048  2048
MPEG4_PART2_SP                  3  8192  2048  2048
MPEG4_PART2_ASP                 5  8192  2048  2048
DIVX4_QMOBILE                   0  8192  2048  2048
DIVX4_MOBILE                    0  8192  2048  2048
DIVX4_HOME_THEATER              0  8192  2048  2048
DIVX4_HD_1080P                  0  8192  2048  2048
DIVX5_QMOBILE                   0  8192  2048  2048
DIVX5_MOBILE                    0  8192  2048  2048
DIVX5_HOME_THEATER              0  8192  2048  2048
DIVX5_HD_1080P                  0  8192  2048  2048
H264_CONSTRAINED_BASELINE      51 65536  4096  4096
H264_EXTENDED                  51 65536  4096  4096
H264_PROGRESSIVE_HIGH          51 65536  4096  4096
H264_CONSTRAINED_HIGH          51 65536  4096  4096
H264_HIGH_444_PREDICTIVE       51 65536  4096  4096
VP9_PROFILE_0                   1 262144  8192  8192
VP9_PROFILE_1                  --- not supported ---
VP9_PROFILE_2                  --- not supported ---
VP9_PROFILE_3                  --- not supported ---
HEVC_MAIN                      153 262144  8192  8192
HEVC_MAIN_10                   153 262144  8192  8192
HEVC_MAIN_STILL                --- not supported ---
HEVC_MAIN_12                   153 262144  8192  8192
HEVC_MAIN_444                  --- not supported ---

Output surface:

name              width height nat types
----------------------------------------------------
B8G8R8A8         32768 32768    y  Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8
R10G10B10A2      32768 32768    y  Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8

Bitmap surface:

name              width height
------------------------------
B8G8R8A8         32768 32768
R8G8B8A8         32768 32768
R10G10B10A2      32768 32768
B10G10R10A2      32768 32768
A8               32768 32768

Video mixer:

feature name                    sup
------------------------------------
DEINTERLACE_TEMPORAL             y
DEINTERLACE_TEMPORAL_SPATIAL     y
INVERSE_TELECINE                 y
NOISE_REDUCTION                  y
SHARPNESS                        y
LUMA_KEY                         y
HIGH QUALITY SCALING - L1        y
HIGH QUALITY SCALING - L2        -
HIGH QUALITY SCALING - L3        -
HIGH QUALITY SCALING - L4        -
HIGH QUALITY SCALING - L5        -
HIGH QUALITY SCALING - L6        -
HIGH QUALITY SCALING - L7        -
HIGH QUALITY SCALING - L8        -
HIGH QUALITY SCALING - L9        -

parameter name                  sup      min      max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH              y         1     8192
VIDEO_SURFACE_HEIGHT             y         1     8192
CHROMA_TYPE                      y
LAYERS                           y         0        4

attribute name                  sup      min      max
-----------------------------------------------------
BACKGROUND_COLOR                 y
CSC_MATRIX                       y
NOISE_REDUCTION_LEVEL            y      0.00     1.00
SHARPNESS_LEVEL                  y     -1.00     1.00
LUMA_KEY_MIN_LUMA                y
LUMA_KEY_MAX_LUMA                y

9. まとめ

VLC で見られなかった動画は見られるようになったし、スリープは 100% 成功するようになったので、やはりドライバの問題だったようだ。

しかし、

  • スリープ時/復帰時に毎回マザーボードのスプラッシュが表示されるのが少しうざいとか、
  • xrandr でサブディスプレイの明るさを変更すると1回目だけ全画面が暗転するとか

よくわからない問題も残った。これはまたゆっくり調べていくことにする。