この記事を作った動機
最近元々 Windows が入っていたPCに対しても、linux環境に乗り換えるようになった過程で、Nvidia 製の GPU である Quadro M620 に対して、プロプライエタリな Nvidia社が提供しているドライバをインストールしようとしたところ問題が発生したため、具体的に何をしたか記録を取る。
基本的に今回起こった問題としては、aur から Nvidia のプロプライエタリなドライバを導入しただけでは設定不足で、正しく起動できず、カーネルなどを読み込み終わったあとに、画面が切り替わろうとするとき、解像度がおかしくなったり、画面が映らなくなったり、ケーブルを抜き差しすることで突然映るようになったりという挙動になった。
問題が何なのか調べたりLLM(Gemini)に投げつけたりしたところ、initramfsで起動する段階で Nvidiaのドライバを読み込んでないと、その後の起動後にディスプレイの EDID の情報が正しく読み込めないのではないかということが分かった。これは、起動時には画面が映らなかったり解像度がおかしい状態になることと、ケーブルを抜き差しすると映るようになることからも、起動時に Nvidia のモジュールがロードされていなかった場合に、その後の初期化フェーズで Nvidia のドライバが読み込まれても提携できてないということで、説明がつくように思われる。
ちなみに設定不足のときに、dmesgでカーネルのメッセージを見ると以下のようなエラーが出ていた。
dmesg | grep nvidia
...
R* [nvidia-drm] [GPU ID 0x00000100] Failed to add encoder for NvKmsKapiDisplay 0x00000001
...
環境
環境
System Details Report
Report details
Hardware Information:
Software Information:
内容
aur からドライバをインストール
yay -S nvidia
:: There are 12 providers available for nvidia:
:: Repository AUR
1) nvidia-525xx 2) nvidia-525xx-dkms 3) nvidia-535xx-dkms 4) nvidia-550xx-dkms 5) nvidia-575xx-dkms 6) nvidia-580xx-dkms 7) nvidia-beta 8) nvidia-beta-dkms 9) nvidia-tesla-dkms 10) nvidia-vulkan 11) nvidia-vulkan-dkms 12) nvidia-vulkan-open
Enter a number (default=1):
==> 6
...
yay -S lib32-nvidia-580xx-utils
gurb を設定する(/etc/default/grub)
...
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 nvidia-drm.modeset=1"
...
grub-mkconfig -o /path/to/grub.cfg
initramfs を設定する(/etc/mkinitcpio.conf)
...
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
...
initramfs を再生成させる
sudo mkinitcpio -P
nvidia-persistencedを有効にする
sudo systemctl enable --now nvidia-persistenced
再起動する
設定がうまく行っていれば、起動するはずである。うまく行かなかったときは、ディスプレイのケーブルを抜き差しして見たりしてから強制的に電源を切ったりする。起動前の grub の画面で e キーを押して、カーネルパラメータ(nvidia_drm.modeset nvidia_drm.fbdev)などがおかしくないか確認したりする。最悪ライブ環境でUSBなどから起動し、自分で再設定する必要がある。
OpenGLを使ったアプリが軒並み安定しない(2026/1/21追記)
どうも、nvidia-580xx-dkmsが、最後のGTX900番代のアーキテクチャに対応したドライバになるらしいが、Wayland + GNOMEの環境において、OpenGLを使ったアプリをXwayland環境で起動させると、不安定でクラッシュすることが分かった。具体的には、ウィンドウを最大化したり、連続してリサイズしまくると、ある時点で安定性を失ってGPUに対して存在していた描画プロセスが再起動を繰り返したあと、諦めてクラッシュという感じになった。クラッシュする直前には描画が止まって固まるという現象になる。
そこで、他のバージョンのドライバとかを試していたが、結局nvidia-580xx-dkms以上に安定したものはなく、かつ最新のnvidia-bata(590)などでは、サポートがないということで、八方塞がりであった。ただ、blenderでvulkanをバックエンドに指定すると、とりあえず使える程度に、状況が改善し、ウィンドウをリサイズしたり、最大化してもクラッシュしにくくなることが分かった。
そしてその経緯をGeminiに投げつけたり、調べたりしたところMESA_LOADER_DRIVER_OVERRIDE=zinkとして環境変数を指定し、OpenGLの描画にVulkanを使うようにするという方法があることがわかり、試していた。以下は環境変数の例として、/etc/environmentの例を示したものである。ちなみに__GLX_VENDOR_LIBRARY_NAME=mesaは指定すると、OpenGLのアプリがクラッシュしたときOSごと巻き込まれて固まることが分かったためコメントアウトしてある。
試したところ、MESA_LOADER_DRIVER_OVERRIDE=zinkは多少効果がありそうで、体感は緩和にはなっている気がするが、問題の解消にはなっていない印象である。他にはCPUだけで動くようにしてGPUの補助を切ってしまうことも手段としてはあるらしいが、そこまではめんどくさくて試していない。MSTの件でもう疲れてしまった。
# cat environment
#
# This file is parsed by pam_env module
#
# Syntax: simple "KEY=VAL" pairs on separate lines
#
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
XMODIFIERS=@im=fcitx5
MUTTER_DEBUG_KMS_THREAD_TYPE=user
WGPU_BACKEND=GL
GSK_RENDERER=ngl
#__GLX_VENDOR_LIBRARY_NAME=mesa
MESA_LOADER_DRIVER_OVERRIDE=zink
基本的には正直 Radeon や Intel Arcなどに移行したほうがlinuxはたしかに良さそうである。nvidiaに関しては、RTX以降はしばらくサポートあるようだが、個人的な感想としては壊れやすく、それはそれで安定しなさそうな印象が先行し、中古でも変なの掴まされる気がして、あんまり買う気にはならない。
正直あんまりまだマジになってまでローカルで統計的手法のAIを動かす気もVRAMの問題や時代的な問題からないし、CUDAに縛られたくないしって感じで、素直に別の普通のPCIeがあってGPUを自由に差し替えられるデスクトップを引っ張って使ったほうがいいなと思い始めた。
Windows 11を使えば、多少まだNVIDIAの古いGPUは誤魔化しは効くものの、勝手にRecallの件でデスクトップのスクショを取るとかいう愚行がユーザの許可なく行われるなど、正直我慢ならなかったので、もういいかなというか。。。それかWindows 10で古いまま張り付くか、どっかから強引に更新を受け取るパッチをレジストリいじって当てるのか、、、どこまでも深いようである。
他に試したこと
自分の環境では、MSTで4k表示する古いディスプレイを使っていたために、正しくEDIDが取得されずに画面の半分だけをSSTで表示してしまい、ケーブルを別のポートに差し込むまでそのままになってしまうという症状になった。そのため、どのようにしてこの問題に対処したかについて記録をする。
ドライバごと読み込み直す(今のところ機能している)
色々試したところ、ドライバを読み込み直すことで、強引にディスプレイ情報(EDID)を再取得させられることが分かった。以下はLLM(Gemini)がsystemdで実行させるためにシバンを先頭に付け足した以外は、吐き出したスクリプトそのままである。
#!/bin/bash
# 1. 関連サービスを停止(環境に合わせて lightdm, sddm, gdm 等)
sudo systemctl stop gdm
# 2. NVIDIAモジュールを依存関係を含めて全て外す
# (使用中の場合は失敗するので、lsof /dev/nvidia* でプロセスを特定して殺す必要があります)
sudo modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia
# 3. モジュールを再ロード(ここでMSTの再スキャンが走ります)
sudo modprobe nvidia_drm modeset=1
sudo modprobe nvidia
# 4. GUIを再開
sudo systemctl start gdm
ちなみに、いちいち手動で実行したくないので、以下のサービスを/etc/systemd/system/nvidia.serviceとして配置し、有効化して起動時に自動的に実行されるようにした。
systemctl enable nvidia
[Unit]
Description=Rescan Display task for Nvidia GPU to avoid buggy EDID info and MST topology.
#After=graphical.target
[Service]
Type=simple
User=root
ExecStart=/home/username/scripts/common/nvidia.sh
Restart=on-failure
RestartSec=10s
StartLimitInterval=60s
StartLimitBurst=5
[Install]
WantedBy=multi-user.target
EDID を強制する(うまくいかなかった)
EDIDのバイナリは、 私の場合はいちいち手動でコマンドを操作したくなかったので、専用にスクリプトを書いた。以下のスクリプトは、すべてのポートのEDIDバイナリを取得し、各EDIDの情報をテキストファイルとして書き出すスクリプトである。 ターゲットとなるMSTで動作するディスプレイを見つける。私の場合は以下のようになった。( 単にEDIDを上書きしたりするだけではうまく行かなさそうなことが分かった。そもそも今回のうまく行かなかったので途中までしか書いてない
EDID を取得する(
getEDID.py)/sys/class/drm/内にある各フォルダ内の、edidというファイルに取得されたバイナリデータが保存されているようである。edid-decodeコマンドが利用可能である必要がある。# スクリプトを実行した場所に情報が保存されるため、あらかじめ作業ディレクトリを作成するなどして散らからないように注意する。
sudo python getEDID.py
# get all edid bin files and dump it to the current directory
import os,shutil,os.path,subprocess
basepath = "/sys/class/drm/"
cwd = os.getcwd()
folders = os.listdir(basepath)
for folder in folders:
if(not os.path.isdir(basepath + folder)): continue
files = os.listdir(basepath + folder)
if(not "edid" in files): continue
savepath = cwd + "/" + folder + "_edid"
shutil.copy(basepath + folder + "/edid",savepath)
result = subprocess.run(("edid-decode {}".format(savepath)),shell=True,capture_output=True)
with open(savepath + ".txt","wt") as info:
info.write(result.stdout.decode())
EDIDを見つける
card1-DP-6_edid.txt)edid-decode (hex):
00 ff ff ff ff ff ff 00 4d 10 ea 21 00 00 00 00
ff 17 01 04 a5 46 27 78 22 10 f5 a5 58 51 a3 25
12 50 54 bf ef 80 95 00 81 c0 81 40 81 80 a9 40
90 40 b3 00 81 00 04 74 80 18 71 70 5a 80 58 2c
8a 00 5d 89 11 00 00 1e 00 00 00 fd 00 14 4d 18
8c 1e 00 0a 20 89 11 00 00 1e 00 00 00 fc 00 50
4e 2d 4b 33 32 31 0a 20 20 20 20 20 00 00 00 fe
00 0a 20 20 20 20 20 20 20 20 20 20 20 20 02 87
02 03 1c c1 4f 10 05 1f 14 20 04 13 03 02 12 11
06 07 15 16 23 09 07 01 83 01 00 00 04 74 80 d0
72 70 5a 80 10 2c 8a 80 5d 89 11 00 00 1e 02 3a
80 18 71 38 2d 40 58 2c 45 00 ba 89 21 00 00 1e
28 3c 80 a0 70 b0 23 40 30 20 36 00 ba 89 21 00
00 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19
70 12 19 00 00 12 00 16 80 10 00 00 7f 07 6f 08
00 00 00 00 00 53 48 50 ea 21 a8 18 94 04 d2 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
----------------
Block 0, Base EDID:
EDID Structure Version & Revision: 1.4
Vendor & Product Identification:
Manufacturer: SHP
Model: 8682
Model year: 2013
Basic Display Parameters & Features:
Digital display
Bits per primary color channel: 8
DisplayPort interface
Maximum image size: 70 cm x 39 cm
Gamma: 2.20
DPMS levels: Off
Supported color formats: RGB 4:4:4
First detailed timing includes the native pixel format and preferred refresh rate
Color Characteristics:
Red : 0.6445, 0.3447
Green: 0.3164, 0.6367
Blue : 0.1474, 0.0732
White: 0.3134, 0.3291
Established Timings I & II:
IBM : 720x400 70.081663 Hz 9:5 31.467 kHz 28.320000 MHz
DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175000 MHz
Apple : 640x480 66.666667 Hz 4:3 35.000 kHz 30.240000 MHz
DMT 0x05: 640x480 72.808802 Hz 4:3 37.861 kHz 31.500000 MHz
DMT 0x06: 640x480 75.000000 Hz 4:3 37.500 kHz 31.500000 MHz
DMT 0x08: 800x600 56.250000 Hz 4:3 35.156 kHz 36.000000 MHz
DMT 0x09: 800x600 60.316541 Hz 4:3 37.879 kHz 40.000000 MHz
DMT 0x0a: 800x600 72.187572 Hz 4:3 48.077 kHz 50.000000 MHz
DMT 0x0b: 800x600 75.000000 Hz 4:3 46.875 kHz 49.500000 MHz
Apple : 832x624 74.551266 Hz 4:3 49.726 kHz 57.284000 MHz
DMT 0x10: 1024x768 60.003840 Hz 4:3 48.363 kHz 65.000000 MHz
DMT 0x11: 1024x768 70.069359 Hz 4:3 56.476 kHz 75.000000 MHz
DMT 0x12: 1024x768 75.028582 Hz 4:3 60.023 kHz 78.750000 MHz
DMT 0x24: 1280x1024 75.024675 Hz 5:4 79.976 kHz 135.000000 MHz
Apple : 1152x870 75.061550 Hz 192:145 68.681 kHz 100.000000 MHz
Standard Timings:
DMT 0x2f: 1440x900 59.887445 Hz 16:10 55.935 kHz 106.500000 MHz
DMT 0x55: 1280x720 60.000000 Hz 16:9 45.000 kHz 74.250000 MHz
DMT 0x20: 1280x960 60.000000 Hz 4:3 60.000 kHz 108.000000 MHz
DMT 0x23: 1280x1024 60.019740 Hz 5:4 63.981 kHz 108.000000 MHz
DMT 0x33: 1600x1200 60.000000 Hz 4:3 75.000 kHz 162.000000 MHz
DMT 0x2a: 1400x1050 59.978442 Hz 4:3 65.317 kHz 121.750000 MHz
DMT 0x3a: 1680x1050 59.954250 Hz 16:10 65.290 kHz 146.250000 MHz
DMT 0x1c: 1280x800 59.810326 Hz 16:10 49.702 kHz 83.500000 MHz
Detailed Timing Descriptors:
DTD 1: 1920x2160 60.000000 Hz 8:9 135.000 kHz 297.000000 MHz (349 mm x 393 mm)
Hfront 88 Hsync 44 Hback 148 Hpol P
Vfront 8 Vsync 10 Vback 72 Vpol P
Display Range Limits:
Monitor ranges (GTF): 20-77 Hz V, 24-140 kHz H, max dotclock 300 MHz
Display Product Name: 'PN-K321'
Alphanumeric Data String: ''
Extension blocks: 2
Checksum: 0x87
----------------
Block 1, CTA-861 Extension Block:
Revision: 3
Underscans IT Video Formats by default
Basic audio support
Native detailed modes: 1
Video Data Block:
VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz
VIC 5: 1920x1080i 60.000000 Hz 16:9 33.750 kHz 74.250000 MHz
VIC 31: 1920x1080 50.000000 Hz 16:9 56.250 kHz 148.500000 MHz
VIC 20: 1920x1080i 50.000000 Hz 16:9 28.125 kHz 74.250000 MHz
VIC 32: 1920x1080 24.000000 Hz 16:9 27.000 kHz 74.250000 MHz
VIC 4: 1280x720 60.000000 Hz 16:9 45.000 kHz 74.250000 MHz
VIC 19: 1280x720 50.000000 Hz 16:9 37.500 kHz 74.250000 MHz
VIC 3: 720x480 59.940060 Hz 16:9 31.469 kHz 27.000000 MHz
VIC 2: 720x480 59.940060 Hz 4:3 31.469 kHz 27.000000 MHz
VIC 18: 720x576 50.000000 Hz 16:9 31.250 kHz 27.000000 MHz
VIC 17: 720x576 50.000000 Hz 4:3 31.250 kHz 27.000000 MHz
VIC 6: 1440x480i 59.940060 Hz 4:3 15.734 kHz 27.000000 MHz
VIC 7: 1440x480i 59.940060 Hz 16:9 15.734 kHz 27.000000 MHz
VIC 21: 1440x576i 50.000000 Hz 4:3 15.625 kHz 27.000000 MHz
VIC 22: 1440x576i 50.000000 Hz 16:9 15.625 kHz 27.000000 MHz
Audio Data Block:
Linear PCM:
Max channels: 2
Supported sample rates (kHz): 48 44.1 32
Supported sample sizes (bits): 16
Speaker Allocation Data Block:
FL/FR - Front Left/Right
Detailed Timing Descriptors:
DTD 2: 1920x2160 50.000000 Hz 8:9 112.500 kHz 297.000000 MHz (349 mm x 393 mm)
Hfront 528 Hsync 44 Hback 148 Hpol P
Vfront 8 Vsync 10 Vback 72 Vpol P
DTD 3: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz (698 mm x 393 mm)
Hfront 88 Hsync 44 Hback 148 Hpol P
Vfront 4 Vsync 5 Vback 36 Vpol P
DTD 4: 1920x1200 59.950171 Hz 16:10 74.038 kHz 154.000000 MHz (698 mm x 393 mm)
Hfront 48 Hsync 32 Hback 80 Hpol P
Vfront 3 Vsync 6 Vback 26 Vpol N
Checksum: 0x19 Unused space in Extension Block: 45 bytes
----------------
Block 2, DisplayID Extension Block:
Version: 1.2
Extension Count: 0
Display Product Type: Extension Section
Tiled Display Topology Data Block (0x12):
Capabilities:
Behavior if it is the only tile: Undefined
Behavior if more than one tile and fewer than total number of tiles: Undefined
Tiled display consists of a single physical display enclosure
Num horizontal tiles: 2 Num vertical tiles: 1
Tile location: 0, 0
Tile resolution: 1920x2160
Tiled Display Manufacturer/Vendor ID: SHP
Tiled Display Product ID Code: 8682
Tiled Display Serial Number: 76814504
Checksum: 0xd2
Checksum: 0x90 Unused space in Extension Block: 96 bytes
EDIDを反映する
/usr/lib/firmware/配下に、edidというフォルダを作成し、必要なEDIDのバイナリデータをコピーする。sudo mkdir /usr/lib/firmware/edid
sudo cp ./card1-DP-6_edid /usr/lib/firmware/edid/card1-DP-6_edid
/etc/mkinitcpio.confを書き直す...
FILES=(/usr/lib/firmware/edid/card1-DP-6_edid.bin)
...
initramfs を作り直す
sudo mkinitcpio -P
カーネルパラメータを指定する(/etc/grub/grub.cfg)
GRUB_CMDLINE_LINUX_DEFAULT= に対して以下の項目を試したがすべてうまく行かなかった。のあとに分かったこととしては、そもそもMSTのディスプレイが正しく認識されていないときと、認識されているときで、/sys/class/drm配下に存在するポート数が異なることが分かった。DP-6は正しく認識している場合には出現するが、正しく認識していない場合は出現しないことが分かったため、以下の設定では存在しないポートに対してEDIDの設定を試みる結果になっていたようである。# うまく行かなかった
drm.edid_firmware=DP-6:edid/card1-DP-6_edid
# うまく行かなかった
drm.edid_firmware=card1-DP-6:edid/card1-DP-6_edid
# 全部のディスプレイを巻き込んでしまい、うまく行かなかった
drm.edid_firmware=edid/card1-DP-6_edid
ls /sys/class/drm
# ⠀card0@ ⠀card0-DP-1@ ⠀card0-DP-2@ ⠀card0-DP-3@ ⠀card0-DP-4@ ⠀card0-DP-5@ ⠀card0-DP-6@ ⠀renderD128@ ⠀version
ls /sys/class/drm
# ⠀card0@ ⠀card0-DP-1@ ⠀card0-DP-2@ ⠀card0-DP-3@ ⠀card0-DP-4@ ⠀card0-DP-5@ ⠀renderD128@ ⠀version
参考にしたサイトとか
-
Possible Wayland bug introduced with latest nvidia-dkms-575.57.08 / Kernel & Hardware / Arch Linux Forums
https://bbs.archlinux.org/viewtopic.php?id=306081 (2026年1月17日) -
NVIDIA - ArchWiki
https://wiki.archlinux.org/title/NVIDIA (2026年1月17日) -
Google Gemini
https://gemini.google.com/app (2026年1月17日) -
Kernel mode setting - ArchWiki
https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID (2026年1月19日) -
ventureoo/nouveau-reclocking: A small utility to reclocking your GPU with Nouveau
https://github.com/ventureoo/nouveau-reclocking (2026年1月23日) -
polhdez/nouveau-reclocking-guide: How to reclock nvidia cards at boot on Linux using nouveau.
https://github.com/polhdez/nouveau-reclocking-guide (2026年1月23日) -
Nouveau - ArchWiki
https://wiki.archlinux.org/title/Nouveau (2026年1月23日)