この記事を作った動機

 最近元々 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

  • Date generated: 2026-01-17 20:53:19

Hardware Information:

  • Hardware Model: HP HP Z2 Mini G3 Workstation
  • Memory: 16.0 GiB
  • Processor: Intel® Xeon® E3-1225 v5 × 4
  • Graphics: Quadro M620
  • Disk Capacity: 512.1 GB

Software Information:

  • Firmware Version: N53 Ver. 01.91
  • OS Name: Arch Linux
  • OS Build: (null)
  • OS Type: 64-bit
  • GNOME Version: 49
  • Windowing System: Wayland
  • Kernel Version: Linux 6.18.5-arch1-1

内容

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 を取得する(getEDID.py)

 EDIDのバイナリは、/sys/class/drm/内にある各フォルダ内の、edidというファイルに取得されたバイナリデータが保存されているようである。

 私の場合はいちいち手動でコマンドを操作したくなかったので、専用にスクリプトを書いた。以下のスクリプトは、すべてのポートのEDIDバイナリを取得し、各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を見つける

 ターゲットとなるMSTで動作するディスプレイを見つける。私の場合は以下のようになった。(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配下に存在するポート数が異なることが分かった。

 単にEDIDを上書きしたりするだけではうまく行かなさそうなことが分かった。そもそも今回の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

参考にしたサイトとか