Arch Linux の NVIDIA Display Driver インストールで詰まった話
記事を書いたきっかけ
Arch Linux の NVIDIA グラボ用 Display Driver のインストールがやや難易度高かったので、共有兼備忘録で記事に残します。
※時間を使って多くを学んだので記録に残したかった。
動作環境
以下の本でまとめた Arch Linux 環境を使用しました。
詰まるまでの設定手順
詳しい 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 の表を参照します。
なお NVIDIA グラボの Code Name がわからない場合は以下も参照してください。
自分の環境では「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を繰り返してる?
ケーブルが良くないこともあるのか...
ということで思い切ってモニタとケーブルを変えました。
これによって正常に画面が映りました。
原因はリフレッシュレートだったようです。
設定側の問題ではなくハード側の問題...というオチでした。
※ モニタを変えたことで 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 の設定をしてあれば、万が一画面が付かなくなってもコマンド操作をすることはできると思います。
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 も試そう
Discussion