NVIDIA/トラブルシューティング
メインの記事は NVIDIA です。
目次
- 1 起動に失敗する
- 1.1 ドライバをインストールした後にシステムが起動しない
- 1.2 Xorg がロードに失敗する、またはレッドスクリーンになる
- 1.3 X の起動時に黒画面 / X のシャットダウン時にマシンの電源が切れる
- 1.4 Wayland の起動時に黒画面
- 1.5 '/dev/nvidia0' input/output error
- 1.6 画面は認識されるが、設定が全くできない
- 1.7 "Failing initialization of X screen" により X が起動しない
- 1.8 Xorg がブート時に失敗し、ブート完了後は起動できる
- 1.9 統合 GPU が載っている環境で黒画面
- 1.10 複数の GPU を使うと "no screens found" によって X が起動しない
- 1.11 linux >= 4.8 で Modprobe エラー: "Could not insert 'nvidia': No such device"
- 1.12 システムがサスペンドから復帰しない
- 1.13 サスペンドから復帰すると黒画面
- 2 クラッシュやハング
- 3 視覚的な問題
- 4 パフォーマンスの問題
- 5 その他の問題
起動に失敗する
ドライバをインストールした後にシステムが起動しない
NVIDIA ドライバをインストールした後、ディスプレイマネージャに到達する前にシステムがハングする場合、カーネルモード設定を無効にしてみてください。
Xorg がロードに失敗する、またはレッドスクリーンになる
GRUB を使っていてレッドスクリーンになる場合は、/etc/default/grub
を編集して GRUB_TERMINAL_OUTPUT=console
をアンコメントして GRUB のフレームバッファを無効にしてください。詳しくは GRUB/ヒントとテクニック#フレームバッファの無効化 を参照。
X の起動時に黒画面 / X のシャットダウン時にマシンの電源が切れる
NVIDIA ドライバーを更新した後に、Xorg の起動時に画面が黒くなったり、Xorg をシャットダウンするとマシンの電源がオフになるようになった場合、以下の回避策を試してください:
- xinitrc の先頭に "xrandr --auto" を追加する。
rcutree.gp_init_delay=1
カーネルパラメータを使用する。nvidia
モジュールを直接 mkinitcpio.conf に追加してみることもできます。rcutree.gp_init_delay=1
カーネルパラメータを追加して、かつnvidia
モジュールを直接 mkinitcpio.conf に追加してもなお、スクリーンが依然として黒画面である場合は、nvidia と nvidia-utils をこの順番で再インストールしてみて、最後にドライバをリロードしてください:
# modprobe nvidia
Wayland の起動時に黒画面
- 以下の NVIDIA 固有のオプションを root の環境変数ファイル
/etc/environment
に追加してみてください:
GBM_BACKEND=nvidia-drm __GLX_VENDOR_LIBRARY_NAME=nvidia ENABLE_VKBASALT=1 LIBVA_DRIVER_NAME=nvidia
- NVIDIA カーネルモジュールが
/etc/mkinitcpio.conf
でロードされていることを確認してください:
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm ...)
上記のモジュールがない場合は、(モジュールを追加して) RAM ディスクを再生成してください。
# mkinitcpio -P
'/dev/nvidia0' input/output error
このエラーはいくつかの異なる理由により起こりえます。このエラーに対する最も一般的な解決策はグループ/ファイルのパーミッションを確認することで、ほとんどの場合、これは問題ではありません。NVIDIA のドキュメントには、この問題を解決するために何をすべきかについては詳しく書かれていません。しかし、一部の人にとって役に立った方法がいくつかあります。この問題は他のデバイスとの IRQ 衝突であるか、カーネルか BIOS のどちらか一方による不適切なルーティングである可能性があります。
まずはビデオキャプチャカードなどの他のビデオデバイスを取り外してみて問題が解決しないか確認してください。同一システム上にビデオプロセッサがたくさん存在すると、ビデオコントローラのメモリアロケーションに問題が発生してカーネルがデバイスを使えなくなることがあります。特に、ビデオメモリが極端に少ない環境では、ビデオプロセッサが一つしかないときでも問題が発生します。そのような場合、システムのビデオメモリの量を確認して (例: lspci -v
)、カーネルにアロケーションパラメータを指定してください。例えば32ビットのカーネルの場合:
vmalloc=384M
64ビットのカーネルを使っている場合、ドライバーの問題によって IOMMU がオンになっている場合に NVIDIA モジュールの初期化が失敗している可能性があります。ユーザーによっては BIOS で IOMMU をオフにすることで問題が解決するようです [1]en2:User:Clickthem#nvidia module。
もう一つ試すべきことは BIOS IRQ ルーティングを Operating system controlled
から BIOS controlled
に、またはその逆に変更してみることです。BIOS controlled
に変更する場合はカーネルパラメータとして以下を渡すことで可能です:
PCI=biosirq
noacpi
カーネルパラメータも一つの解決策として提案されてきましたが、これは ACPI を完全に無効化するので注意して使用されるべきです。一部のハードウェアはオーバーヒートにより簡単に損傷します。
画面は認識されるが、設定が全くできない
ときに NVIDIA と X が有効な画面を確認できないことがあります。グラフィックカードに複数の出力端子がある場合、モニターを別の端子に接続してみてください。ノートパソコンの場合、グラフィックカードに VGA/TV 出力が存在することが原因の可能性があります。Xorg.0.log に詳しい情報が出力されます。
誤っている "ConnectedMonitor" Option
をわざと Section "Device"
に追加して、正しく認識させる方法を確認することもできます。ConnectedMonitor の設定については これを参照してください。
X を再起動した後に Xorg.0.log を確認して正しい CRT-x,DFP-x,TV-x の値を見てください。
nvidia-xconfig --query-gpu-info
で役に立つ情報が得られることもあります。
"Failing initialization of X screen" により X が起動しない
もし /var/log/Xorg.0.log
に、X server がスクリーンの初期化に失敗したと書き込まれる場合
(EE) NVIDIA(G0): GPU screens are not yet supported by the NVIDIA driver (EE) NVIDIA(G0): Failing initialization of X screen
そして nvidia-smi が No running processes found
と書き込む場合
解決策は、まず始めに最新の nvidia-utils を再インストールして、/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
を /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
へとコピーします。その後、/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
を編集して Option "PrimaryGPU" "yes"
という行を追加してください。コンピューターを再起動すれば、この問題は解決します。
Xorg がブート時に失敗し、ブート完了後は起動できる
起動時間がとても短いシステムの場合、NVIDIA ドライバーが完全に初期化される前に systemd がディスプレイマネージャを起動してしまうことがあります。起動時に Xorg が実行された時にだけ、ログに以下のようなメッセージが表示されます:
/var/log/Xorg.0.log
[ 1.807] (EE) NVIDIA(0): Failed to initialize the NVIDIA kernel module. Please see the [ 1.807] (EE) NVIDIA(0): system's kernel log for additional error messages and [ 1.808] (EE) NVIDIA(0): consult the NVIDIA README for details. [ 1.808] (EE) NVIDIA(0): *** Aborting ***
このような場合、ディスプレイマネージャから DRI デバイスまでの順番付けをする必要があります。まず、新しい udev ルールファイルを作成して DRI デバイスのデバイスユニットを作成してください:
/etc/udev/rules.d/99-systemd-dri-devices.rules
ACTION=="add", KERNEL=="card*", SUBSYSTEM=="drm", TAG+="systemd"
次にディスプレイマネージャからデバイスまでの依存関係を作成します:
/etc/systemd/system/display-manager.service.d/10-wait-for-dri-devices.conf
[Unit] Wants=dev-dri-card0.device After=dev-dri-card0.device
デスクトップに必要な追加カードが存在する場合は、Wants と After にスペースで区切って記述してください。
統合 GPU が載っている環境で黒画面
内蔵 GPU (例: Intel HD 4000、VIA VX820 Chrome 9、AMD Cezanne) のあるシステムを使用していて nvidia パッケージもインストールしている場合、起動時、仮想ターミナル切り替え時、X セッションの終了時に黒画面が発生する場合があります。これは、グラフィックモジュール間の競合が原因かもしれません。関連する GPU モジュールをブラックリストに入れることで解決できます。/etc/modprobe.d/blacklist.conf
を作成し、起動時に関連するモジュールがロードされないように設定してください:
/etc/modprobe.d/blacklist.conf
install i915 /usr/bin/false install intel_agp /usr/bin/false install viafb /usr/bin/false install radeon /usr/bin/false install amdgpu /usr/bin/false
複数の GPU を使うと "no screens found" によって X が起動しない
複数の GPU が搭載されているようなシステムで X が以下のメッセージによって起動しない場合:
[ 76.633] (EE) No devices detected. [ 76.633] Fatal server error: [ 76.633] no screens found
ディスクリートカードの BusID を X の設定に追加してください。これは、Intel CPU と内蔵 GPU があるシステムや、2つ以上の Nvidia カード が接続されているシステムで起こりえます。BusID を確認するには:
# lspci | grep -E "VGA|3D controller"
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller (rev 09) 01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) 08:00.0 3D controller: NVIDIA Corporation GM108GLM [Quadro K620M / Quadro M500M] (rev a2)
X の設定ファイル内でカードの Device セクションに追加することで修正できます。例:
/etc/X11/xorg.conf.d/10-nvidia.conf
Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "PCI:1:0:0" EndSection
上の例では、01:00.0
が 1:0:0
のように短縮されて記述されています。しかし、BusID の変換はより複雑になることもあります。lspci
の出力は16進法ですが、設定ファイルでは BusID は10進法で記述されるのです! これはつまり、BusID が9よりも大きい場合に16進数から10進数に変換する必要があるということです!
例: lspci での 5e:00.0
は PCI:94:0:0
となります。
linux >= 4.8 で Modprobe エラー: "Could not insert 'nvidia': No such device"
linux 4.8 ではディスクリートカードを使おうとすると次のエラーが発生することがあります:
$ modprobe nvidia -vv
modprobe: INFO: custom logging function 0x409c10 registered modprobe: INFO: Failed to insert module '/lib/modules/4.8.6-1-ARCH/extramodules/nvidia.ko.gz': No such device modprobe: ERROR: could not insert 'nvidia': No such device modprobe: INFO: context 0x24481e0 released insmod /lib/modules/4.8.6-1-ARCH/extramodules/nvidia.ko.gz
# dmesg
... NVRM: The NVIDIA GPU 0000:01:00.0 (PCI ID: 10de:139b) NVRM: installed in this system is not supported by the 370.28 NVRM: NVIDIA Linux driver release. Please see 'Appendix NVRM: A - Supported NVIDIA GPU Products' in this release's NVRM: README, available on the Linux driver download page NVRM: at www.nvidia.com. ...
この問題は Linux カーネルの PCIe 電源管理に関連する不適切なコミットによるものです( この NVIDIA DevTalk スレッド でドキュメント化されています)。
回避策は pcie_port_pm=off
をカーネルパラメータに追加することです。これにより、すべてのデバイスにおける PCIe 電源管理が無効化されることに注意してください。
システムがサスペンドから復帰しない
以下のようなログが発生するとき:
kernel: nvidia-modeset: ERROR: GPU:0: Failed detecting connected display devices kernel: nvidia-modeset: ERROR: GPU:0: Failed detecting connected display devices kernel: nvidia-modeset: WARNING: GPU:0: Failure processing EDID for display device DELL U2412M (DP-0). kernel: nvidia-modeset: WARNING: GPU:0: Unable to read EDID for display device DELL U2412M (DP-0) kernel: nvidia-modeset: ERROR: GPU:0: Failure reading maximum pixel clock value for display device DELL U2412M (DP-0).
[2] から考えられる解決策があります:
以下のコマンドを実行して version
の文字列を取得してください:
# strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort | tail -1
acpi_osi=! "acpi_osi=version"
カーネルパラメータをブートローダーの設定に追加してください。
この問題を引き起こす他の可能性として、nvidia-open パッケージを使用しているというものもあります。以下で説明されています:
- https://bbs.archlinux.org/viewtopic.php?pid=2047692
- https://github.com/NVIDIA/open-gpu-kernel-modules/issues/450
- https://github.com/NVIDIA/open-gpu-kernel-modules/issues/223
- https://github.com/NVIDIA/open-gpu-kernel-modules/issues/94
サスペンドから復帰すると黒画面
黒画面の問題が発生し、以下のようなログに出力がある場合:
archlinux kernel: NVRM: GPU at PCI:0000:08:00: GPU-926ecdb0-adb1-6ee9-2fad-52e7214c5011 archlinux kernel: NVRM: Xid (PCI:0000:08:00): 13, pid='<unknown>', name=<unknown>, Graphi> archlinux kernel: NVRM: Xid (PCI:0000:08:00): 13, pid='<unknown>', name=<unknown>, Graphi> archlinux kernel: NVRM: Xid (PCI:0000:08:00): 13, pid='<unknown>', name=<unknown>, Graphi> archlinux kernel: NVRM: Xid (PCI:0000:08:00): 13, pid='<unknown>', name=<unknown>, Graphi> archlinux kernel: NVRM: Xid (PCI:0000:08:00): 13, pid='<unknown>', name=<unknown>, Graphi>
NVIDIA/ヒントとテクニック#サスペンド後にビデオメモリを保持する で説明されているように NVIDIA のサスペンド、ハイバネート、スリープに関連するサービスを有効化する必要があります。
クラッシュやハング
クラッシュの一般的な対処方法
- xorg.conf で
RenderAccel
を無効にしてみる。 - Xorg が
"conflicting memory type"
や"failed to allocate primary buffer: out of memory"
というエラーを出力する場合、あるいは nvidia-96xx ドライバーを使用しているときに "Signal 11" でクラッシュする場合、カーネルパラメータにnopat
を追加してください。 - NVIDIA のコンパイラが、カーネルをコンパイルしたのに使用した GCC と現在使っている GCC のバージョンが異なるというエラーを出力する場合、
/etc/profile
に以下を追加してください:
export IGNORE_CC_MISMATCH=1
- フルスクリーンのアプリケーションがフリーズ/クラッシュする場合、あなたの使用しているデスクトップ環境の設定で
Display Compositing
とDirect fullscreen rendering
を有効化してみてください。
OpenGL アプリケーションで視覚的な不具合、ハング、エラー
最近の CPU (Intel Sandy Bridge (2011) 以降や AMD Zen (2017) 以降) を使用している場合、その CPU にはマイクロ op キャッシュが搭載されています。マイクロ op キャッシュを使用すると、Cache Aliasing が原因で OpenGL で NVIDIA ドライバとの問題が発生する可能性があります [3]。通常、マイクロ op キャッシュは BIOS で無効化できますが、パフォーマンスが犠牲になってしまいます [4]。マイクロ op キャッシュを無効化すると、Xwayland アプリケーションの最も深刻なグラフィックの不具合にも効果がありますが、問題を完全に解決できるわけではありません [5]。
ノートパソコン: ログイン/ログアウト時に X がフリーズするが、Ctrl+Alt+Backspace で回避できる
もし、レガシーな NVIDIA ドライバーを使っていて、ログインやログアウト時に Xorg がフリーズし (特に画面が黒と白/灰の部分に分かれる)、Ctrl+Alt+Backspace
によるログインはできる場合 (X を終了するキーバインドを実行した時)、/etc/modprobe.d/modprobe.conf
に以下を追加してみてください:
options nvidia NVreg_Mobile=1
NVreg_Mobile
は使用しているノートパソコンにあわせて変更する必要があります:
- 1: Dell のノートパソコンの場合。
- 2: コンパル製でない東芝のノートパソコンの場合。
- 3: その他のノートパソコンの場合。
- 4: コンパル製の東芝のノートパソコンの場合。
- 5: Gateway のノートパソコンの場合。
詳しくは NVIDIA ドライバーの README: Appendix K を見て下さい。
Pacman でのアップデート時やシステムの再起動時にノート PC が頻繁にハードロックしてしまう
これは NVIDIA 550 シリーズのドライバに存在する既知のバグです。今のところ原因は不明ですが、ノート PC でしか起こらないようです。詳細は BBS#293400 を見てください。
この問題の回避策は、nvidia-535xx-dkmsAUR を代わりに使うことです。
視覚的な問題
画面のティアリングを抑える
コンポジタを使用しているかどうかに関わらず、完全なコンポジションパイプラインを強制することでティアリングを回避することができます。この方法がうまく行くかどうかテストするには以下を実行してください:
$ nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"
または、X Server Display Configuration メニューオプションにある Advanced を押してください。Force Composition Pipeline か Force Full Composition Pipeline のどちらか一方を選択して、Apply をクリックしてください。
この変更を永続化させるには、Xorg 設定ファイルの "Screen"
セクションにこの設定を追加してください。そうする場合、ドライバーの設定で TripleBuffering
を有効化して、AllowIndirectGLXProtocol
を無効化するべきです。以下の設定例を見てください:
/etc/X11/xorg.conf.d/20-nvidia.conf
Section "Device" Identifier "NVIDIA Card" Driver "nvidia" VendorName "NVIDIA Corporation" BoardName "GeForce GTX 1050 Ti" EndSection Section "Screen" Identifier "Screen0" Device "Device0" Monitor "Monitor0" Option "ForceFullCompositionPipeline" "on" Option "AllowIndirectGLXProtocol" "off" Option "TripleBuffer" "on" EndSection
Xorg の設定ファイルが存在しない場合、nvidia-xconfig
を使って、現在使用しているハードウェア用の設定ファイルを作成することができます (NVIDIA#自動設定を参照してください)。そして、作成したファイルを /etc/X11/xorg.conf
から適当な場所 (/etc/X11/xorg.conf.d/20-nvidia.conf
) に移動してください。
マルチモニタ
マルチモニタ環境においては、それぞれのディスプレイに対して ForceCompositionPipeline=On
を指定する必要があります。例えば:
$ nvidia-settings --assign CurrentMetaMode="DP-2: nvidia-auto-select +0+0 {ForceCompositionPipeline=On}, DP-4: nvidia-auto-select +3840+0 {ForceCompositionPipeline=On}"
こうしないと、nvidia-settings
コマンドはサブモニタを無効化してしまいます。
--query
を使えば、現在のスクリーン名とオフセットを入手できます:
$ nvidia-settings --query CurrentMetaMode
先のコマンドは、2台の 3840x2160 モニタが DP-2 と DP-4 に接続されている場合です。xorg.conf
をエクスポートして正しい CurrentMetaMode
を手に入れ、使用しているそれぞれのディスプレイに対して ForceCompositionPipeline
を追加する必要があります。ForceCompositionPipeline
の設定は対象にしたディスプレイにのみ影響します。
サスペンドやハイバネートからの復帰後にスクリーンがおかしくなる
NVIDIA/ヒントとテクニック#サスペンド後にビデオメモリを保持する を見てください。
GDM サービスを使用している際にサスペンド後に画面がおかしくなるバグは nvidia 515.43.04 ドライバで解決されました [6]。
画面が崩れる: "Six screens" 問題
GeForce GT 100M を使用している場合、X を起動した後に画面が6つに分割されて解像度が 640x480 になってしまうことがあります。 同じ問題は Quadro 2000 や高解像度ディスプレイでも最近報告されています。
この問題を解決するには、Device
セクションで Validation Mode NoTotalSizeCheck
を有効にしてください:
Section "Device" ... Option "ModeValidation" "NoTotalSizeCheck" ... EndSection
パフォーマンスの問題
新しいバージョンのドライバーをインストールした後にパフォーマンスが悪くなる
古いドライバーと比べて FPS が落ちている場合、まずダイレクトレンダリングがオンになっているか確認してください (glxinfo
は mesa-demos に含まれています):
$ glxinfo | grep direct
上のコマンドで以下のように表示されるなら:
direct rendering: No
前にインストールしたバージョンのドライバーに戻して再起動すれば解決することがあります。
Xorg が極端にラグい
Mutter の一般的な問題は、アニメーション、動画再生、ゲーミングが Xorg 上でデスクトップの極端なラグを生じさせることです。
NVIDIA/ヒントとテクニック#サスペンド後にビデオメモリを保持する を参照してください。
これでこの問題を解決できるはずですが、できない場合、おそらく運がないのでしょう。この問題を軽減する1つの方法は、以下のオプションを追加することです:
/etc/environment
CLUTTER_DEFAULT_FPS=メインディスプレイのリフレッシュレート __GL_SYNC_DISPLAY_DEVICE=メインディスプレイの出力名
そして、NVIDIA Settings で Sync to VBlank
と Allow flipping
をオフにし、NVIDIA Settings を起動時に --load-config-only
フラグを使って起動するようにしてください。
これでもデスクトップの挙動がラグいでしょうが (特に最後の2番目 (または3番目) のモニタ)、遥かにマシになっているはずです。
400 シリーズのカードで CPU 使用率のスパイクが発生する
400 シリーズのカードで時々 CPU の使用率が急上昇するような場合、PowerMizer が GPU のクロック周波数を断続的に変更しているのが原因です。以下を Xorg 設定の Device
セクションに追加して、PowerMizer の設定を Adaptive から Performance にしてください:
Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x3322; PowerMizerDefaultAC=0x1"
その他の問題
アプリケーション開始時に Vulkan のエラーが発生する
Vulkan アクセラレーションを必要とするアプリケーションの実行時に、以下のエラーが発生する場合
Vulkan call failed: -4
~/.nv
か ~/.cache/nvidia
ディレクトリを削除してみてください。
HDMI で音が出ない
時々 nvidia の HDMI オーディオデバイスが以下のコマンドで表示されないことがあります:
$ aplay -l
何かしらの理由により一部の新しいマシンでは NVIDIA GPU のオーディオチップがブート時に無効化されます。詳しくは、NVIDIA のウェブサイトやフォーラムの投稿を読んでください。
オーディオを有効化して NVIDIA デバイスを再読み込みする必要があります。そうするためには、(ノート PC/Bumblebee の場合) GPU がオンになっていることや、GPU がリセットされるので GPU 上で X を実行していないことを確認してください:
# setpci -s 01:00.0 0x488.l=0x2000000:0x2000000 # rmmod nvidia-drm nvidia-modeset nvidia # echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove # echo 1 > /sys/bus/pci/devices/0000:00:01.0/rescan # modprobe nvidia-drm # xinit -- -retro
NVIDIA 上で TTY を実行している場合、スクリーンが表示されなくなってしまわないように上記のコマンドを1つのスクリプトに記述してください。
バックライトがオフにならないことがある
デフォルトでは、タイムアウトを設定したり xset を実行すると DPMS はバックライトをオフにします。しかしながら、プロプライエタリの Nvidia ドライバーのバグによって、黒画面になるだけで節電ができないことがあります。バグが修正されるまで、対応策として root で vbetool
を使う方法があります。
vbetool パッケージをインストールしてください。
画面をオフにして、何かキーを押したときにバックライトを再度オンにするには:
vbetool dpms off && read -n1; vbetool dpms on
もしくは、xrandr でモニターの出力を有効化・無効化できます (root 権限は不要です):
xrandr --output DP-1 --off; read -n1; xrandr --output DP-1 --auto
415 ドライバー: HardDPMS
プロプライエタリの 415 ドライバには HardDPMS という新機能が含まれています。これは DisplayPort で接続されたモニターのサスペンドに関する問題を解決することが一部のユーザによって報告されています。
これは将来のバージョンではデフォルトになると報告されていますが、今の所、HardDPMS
オプションは Device
か Screen
セクション内で設定することができます。例:
/etc/X11/xorg.conf.d/20-nvidia.conf
Section "Device" ... Option "HardDPMS" "true" ... EndSection Section "Screen" ... Option "HardDPMS" "true" ... EndSection
HardDPMS
は BlankTime
のようなスクリーンセーバーの設定にトリガーされます。以下の ServerFlags
は何も操作せずに 10 分経つとモニターをサスペンドします。
/etc/X11/xorg.conf.d/20-nvidia.conf
Section "ServerFlags" Option "BlankTime" "10" EndSection
xrandr BadMatch
xrandr を使って DELL U2515H のような WQHD モニターを設定しようとしたときに、xrandr --addmode
が X Error of failed request: BadMatch
というエラーを吐く場合、プロプライエタリの NVIDIA ドライバーが HDMI 出力のピクセルクロック最大周波数を 225 MHz 以下に制限しているのが原因かもしれません。モニターを最大解像度に設定するには nouveau ドライバーをインストールする必要があります。カーネルパラメータで nouveau.hdmimhz=297
(あるいは 330
) を設定することで強制的に特定のピクセルクロック周波数を使うことができます。
もしくは、モニターの EDID が誤っている可能性があります。#EDID を上書きするを参照してください。
他に考えられる理由としては、デフォルトで現在の NVIDIA ドライバは EDID によって明示的に報告されたモードのみを許可しますが、モニタによって報告されていないリフレッシュレートや解像度のほうが望ましい場合もあります (とは言え、EDID 情報は正しいです。現在の NVIDIA ドライバの制限が厳しすぎるだけなのです)。
そのような場合、非 EDID モードを許可するオプションを xorg.conf
に追加すると良いかもしれません:
Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" ... Option "ModeValidation" "AllowNonEdidModes" ... EndSection
これは出力毎に設定できます。詳細は NVIDIA ドライバの readme (Appendix B. X Config Options) を参照してください。
EDID を上書きする
カーネルモード設定#モードと EDID を強制する、Xrandr#トラブルシューティング、en:Qnix QX2710#Fixing X11 with Nvidia を参照してください。
nvidia-settings GUI によるオーバークロックが機能しない
NVIDIA/ヒントとテクニック#オーバークロックを有効にするに書かれているように、オーバークロックを有効にした後、nvidia-settings の CLI を使って変数を設定することでオーバークロックできます。詳しくは nvidia-settings(1) を参照。
全ての変数を確認する例:
nvidia-settings -q all
パフォーマンスモードを優先するように PowerMizerMode を設定する例:
nvidia-settings -a [gpu:0]/GPUPowerMizerMode=1
ファンスピードを 21% 固定に設定する例:
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=21
複数の変数を同時に設定する例 (50MHz だけ GPU をオーバークロック、50MHz だけビデオメモリをオーバークロック、100mV だけ GPU 電圧を上昇):
nvidia-settings -a GPUGraphicsClockOffsetAllPerformanceLevels=50 -a GPUMemoryTransferRateOffsetGPUGraphicsClockOffsetAllPerformanceLevels=50 -a GPUOverVoltageOffset=100
Unknown Error によりオーバークロックが動作しない
Xorg を非 root ユーザとして実行していて NVIDIA GPU をオーバークロックしようとした場合、以下と似たようなエラーが発生します:
$ nvidia-settings -a "[gpu:0]/GPUGraphicsClockOffset[3]=10"
ERROR: Error assigning value 10 to attribute 'GPUGraphicsClockOffset' (trinity-zero:1[gpu:0]) as specified in assignment '[gpu:0]/GPUGraphicsClockOffset[3]=10' (Unknown Error).
この問題を避けるためには、Xorg を root ユーザとして実行しなければなりません。詳しくは Xorg#Rootless Xorg をご覧ください。
電力消費
ドライバの使用状況を確認するには:
# lsof /dev/nvidia*
kwin_wayl 867 user 17u CHR 195,0 0t0 418 /dev/nvidia kwin_wayl 867 user 18u CHR 195,0 0t0 418 /dev/nvidiactl
NVIDIA のカーネルモジュールで省電力が設定されている場合:
$ grep . /sys/bus/pci/devices/0000:01:00.0/power/*
/sys/bus/pci/devices/0000:01:00.0/power/control:auto /sys/bus/pci/devices/0000:01:00.0/power/runtime_active_time:445933 /sys/bus/pci/devices/0000:01:00.0/power/runtime_status:active /sys/bus/pci/devices/0000:01:00.0/power/runtime_suspended_time:1266 /sys/bus/pci/devices/0000:01:00.0/power/wakeup:disabled
# rmmod nvidia_drm
$ grep . /sys/bus/pci/devices/0000:01:00.0/power/*
/sys/bus/pci/devices/0000:01:00.0/power/control:auto /sys/bus/pci/devices/0000:01:00.0/power/runtime_active_time:461023 /sys/bus/pci/devices/0000:01:00.0/power/runtime_status:suspended /sys/bus/pci/devices/0000:01:00.0/power/runtime_suspended_time:1064192 /sys/bus/pci/devices/0000:01:00.0/power/wakeup:disabled
ソフトウェア GL をテストする
バイナリの NVIDIA ドライバは Mesa の LIBGL_ALWAYS_SOFTWARE=1
環境変数を尊重しませんが、以下の環境変数を設定することで libglvnd と EGL に Mesa を使うように指定することができます:
__GLX_VENDOR_LIBRARY_NAME=mesa __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
これらを設定することにより、GLX と EGL に Mesa の libgm が使用され、ソフトウェア GL になります。これで、現在遭遇しているバグが NVIDIA の GL ライブラリに関連するものであるかを検証するのに役立ちます。