🖥

Arch Linux の NVIDIA Display Driver インストールで詰まった話

2024/11/29に公開

記事を書いたきっかけ

Arch Linux の NVIDIA グラボ用 Display Driver のインストールがやや難易度高かったので、共有兼備忘録で記事に残します。
※時間を使って多くを学んだので記録に残したかった。

動作環境

以下の本でまとめた Arch Linux 環境を使用しました。

https://zenn.dev/caunus/books/archlinux-introduction/viewer/environments

詰まるまでの設定手順

詳しい GUI の設定手順は以下で説明しています。

https://zenn.dev/caunus/books/archlinux-introduction/viewer/gui

グラボの認識確認は以下で行います。

# Graphic card の認識確認
lspci -k | grep -A 2 -E "(VGA|3D)"
> 01:00.0 VGA compatible controller: NVIDIA Corporation GM107GL [Quadro K2200] (rev a2)
>         Subsystem: NVIDIA Corporation Device 1097
>         Kernel driver in use: nouveau

確認したグラボに対してどの driver をインストールすればよいかについては Wiki の表を参照します。

https://wiki.archlinux.org/title/Xorg#Driver_installation

なお NVIDIA グラボの Code Name がわからない場合は以下も参照してください。

https://nouveau.freedesktop.org/CodeNames.html

自分の環境では「Quadro K2200 は NV117 (GM107) の Maxwell シリーズである」ため「プロプライエタリでは nvidia, nvidia-utils」を使うことがわかります。
lspci の結果から「今は nvidia は利用されておらず nouveau が使われていることがわかります。

nouveau は FreeDesktop プロジェクトで保守されている OSS ドライバです。
nvidia のソースがクローズのため、nouveau には機能制限があるとされています。

以上でインストールするものがわかったので pacman します。

sudo pacman -S nvidia nvidia-utils nvidia-settings
# 再起動
reboot

画面がつかない...

どうやって解消したか #1

Wiki をよく読むといくらか設定項目が残っていそうです。

DRM kernel mode setting

Direct Rendering Manager (DRM) カーネルモード設定を行います。
nouveau では自動で有効化されていますが nvidia では手動で有効化する必要があります。
カーネルパラメータに設定しておきます。

vim /etc/default/grub
> GRUB_CMDLINE_LINUX="nvidia_drm.modeset=1"
sudo grub-mkconfig -o /boot/grub/grub.cfg

mkinitcpio

mkinitcpio の HOOKS から kms を除いておくことで initramfs で nouveau が含まれないことを確実にしておきます。
また MODULES に nvidia 関連のものたちを入れておきます。

# MODULES に値をいれ、HOOKS から kms を除く
sudo vim /etc/mkinitcpio.conf
> MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
> HOOKS=(base udev autodetect microcode modconf keyboard keymap consolefont block filesystems fsck)

sudo mkinitcpio -P

pacman hook

initramfs で nvidia のアップデートが漏れないように pacman hook を設定しておきます。

sudo mkdir -p /etc/pacman.d/hooks
sudo vim /etc/pacman.d/hooks/nvidia.hook
> [Trigger]
> Operation=Install
> Operation=Upgrade
> Operation=Remove
> Type=Package
> Target=nvidia
> Target=linux
> 
> [Action]
> Description=Updating NVIDIA module in initcpio
> Depends=mkinitcpio
> When=PostTransaction
> NeedsTargets
> Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'

今度こそ終わったので再起動します。

# 再起動
reboot

画面がつかない...(Part2)

どうやって解消したか #2

これ以上は設定項目は見当たりません...
とりあえずログを見ます。

sudo cat /var/log/Xorg.0.log
[     6.643]
X.Org X Server 1.21.1.14
X Protocol Version 11, Revision 0
[     6.643] Current Operating System: Linux DESKTOP-ARCH0001 6.11.6-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 01 Nov 2024 03:30:41 +0000 x86_64
[     6.643] Kernel command line: BOOT_IMAGE=/vmlinuz-linux root=UUID=276b8167-fae3-4c13-9c4c-324282750c72 rw nvidia_drm.modeset=1 loglevel=3 quiet
...
[     6.651] (**) OutputClass "nvidia" ModulePath extended to "/usr/lib/nvidia/xorg,/usr/lib/xorg/modules,/usr/lib/xorg/modules"
...
[     6.662] (II) Applying OutputClass "nvidia" to /dev/dri/card0
[     6.662]    loading driver: nvidia
[     6.662] (==) Matched nvidia as autoconfigured driver 0
[     6.662] (==) Matched nouveau as autoconfigured driver 1
[     6.662] (==) Matched nv as autoconfigured driver 2
[     6.662] (==) Matched modesetting as autoconfigured driver 3
[     6.662] (==) Matched fbdev as autoconfigured driver 4
[     6.662] (==) Matched vesa as autoconfigured driver 5
[     6.662] (==) Assigned the driver to the xf86ConfigLayout
[     6.662] (II) LoadModule: "nvidia"
[     6.663] (II) Loading /usr/lib/xorg/modules/drivers/nvidia_drv.so
[     6.670] (II) Module nvidia: vendor="NVIDIA Corporation"
[     6.670]    compiled for 1.6.99.901, module version = 1.0.0
[     6.670]    Module class: X.Org Video Driver
[     6.670] (II) LoadModule: "nouveau"
[     6.670] (WW) Warning, couldn't open module nouveau
[     6.670] (EE) Failed to load module "nouveau" (module does not exist, 0)
...
[     7.119] (II) NVIDIA(0): NVIDIA GPU Quadro K2200 (GM107GL-A) at PCI:1:0:0 (GPU-0)
[     7.119] (--) NVIDIA(0): Memory: 4194304 kBytes
[     7.119] (--) NVIDIA(0): VideoBIOS: 82.07.79.00.15
[     7.119] (II) NVIDIA(0): Detected PCI Express Link width: 16X
[     7.171] (--) NVIDIA(GPU-0): CRT-0: disconnected
[     7.171] (--) NVIDIA(GPU-0): CRT-0: 400.0 MHz maximum pixel clock
[     7.171] (--) NVIDIA(GPU-0):
[     7.213] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): connected
[     7.213] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): Internal TMDS
[     7.213] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): 340.0 MHz maximum pixel clock
...
[    20.799] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): connected
[    20.799] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): Internal TMDS
[    20.799] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): 340.0 MHz maximum pixel clock
[    20.799] (--) NVIDIA(GPU-0):
[    20.842] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): connected
[    20.842] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): Internal TMDS
[    20.842] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): 340.0 MHz maximum pixel clock
[    20.842] (--) NVIDIA(GPU-0):
[    21.437] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): connected
[    21.437] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): Internal TMDS
[    21.437] (--) NVIDIA(GPU-0): Ancor Communications Inc ASUS VN248 (DFP-0): 340.0 MHz maximum pixel clock
[    21.437] (--) NVIDIA(GPU-0):
...

問題なさそうだが...sleepを繰り返してる?
ケーブルが良くないこともあるのか...

https://forums.developer.nvidia.com/t/xorg-log-flooded-with-dfp-0-connected-messages/44976/13

ということで思い切ってモニタとケーブルを変えました。

  • ASUS VN248H[1] → ASUS VG249QM1A[2]
  • DVI-HDMI → DP-DP

これによって正常に画面が映りました。
原因はリフレッシュレートだったようです。
設定側の問題ではなくハード側の問題...というオチでした。

※ モニタを変えたことで HDMI コンバータを使った Wii も映るようになったのも地味にうれしい。

ということで正しい手順は...

sudo pacman -S nvidia nvidia-utils nvidia-settings

# DRM kernel mode setting
vim /etc/default/grub
> GRUB_CMDLINE_LINUX="nvidia_drm.modeset=1"
sudo grub-mkconfig -o /boot/grub/grub.cfg

# mkinitcpio
# MODULES に値をいれ、HOOKS から kms を除く
sudo vim /etc/mkinitcpio.conf
> MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
> HOOKS=(base udev autodetect microcode modconf keyboard keymap consolefont block filesystems fsck)

sudo mkinitcpio -P

# pacman hook
sudo mkdir -p /etc/pacman.d/hooks
sudo vim /etc/pacman.d/hooks/nvidia.hook
> [Trigger]
> Operation=Install
> Operation=Upgrade
> Operation=Remove
> Type=Package
> Target=nvidia
> Target=linux
> 
> [Action]
> Description=Updating NVIDIA module in initcpio
> Depends=mkinitcpio
> When=PostTransaction
> NeedsTargets
> Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'

# 再起動
reboot

学んだこと

  • ドキュメントを細かく読む。
  • 同事象を検索する。
  • ログを確認する。
  • 事象を切り分けて問題を特定する。

新人の時に指導された手順を辿れたゆえに解決できたのかなと思っています。

画面が映らなくても SSH できる

先に SSH の設定をしてあれば、万が一画面が付かなくなってもコマンド操作をすることはできると思います。

https://zenn.dev/caunus/books/archlinux-introduction/viewer/ssh

Display driver の設定をする前に SSH 設定は確かめておこうと思いました。

grub 画面からログを確認できる

最初に画面が付かなかったとき、実は SSH 設定もしておらずできることは grub での操作のみでした。
おかげで grub での操作を学べました。

# grub 画面で e を押してカーネルパラメータを確認。

# grub 画面で c を押してコマンドライン上で Xorg のログを確認。※USキーボードになっていると思うので注意
grub> set pager=1
grub> ls (hd0,gpt3)/var/log/
grub> cat (hd0,gpt3)/var/log/Xorg.0.log

それでも困ったときは Disabling_modesetting も試そう

https://wiki.archlinux.org/title/Kernel_mode_setting#Disabling_modesetting

脚注
  1. https://www.asus.com/commercial-monitors/vn248h/specifications/ ↩︎

  2. https://www.asus.com/jp/displays-desktops/monitors/tuf-gaming/tuf-gaming-vg249qm1a/techspec/ ↩︎

Discussion