Fedora34にNVIDIAドライバをインストールした
以前使っていた 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
の設定で blacklist
に nouveau
を設定する 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
で設定する kernelopts
に rd.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回目だけ全画面が暗転するとか
よくわからない問題も残った。これはまたゆっくり調べていくことにする。