跳转到内容

NVIDIA/故障排除

来自 Arch Linux 中文维基

启动失败

安装驱动后系统无法启动

如果安装 NVIDIA 驱动后,系统在进入显示管理器之前卡住,请尝试内核级显示模式设置#禁用 KMS。

Xorg 无法加载或出现红屏死机

如果出现红屏且使用 GRUB,请编辑 /etc/default/grub,取消 GRUB_TERMINAL_OUTPUT=console 的注释,以禁用 GRUB 帧缓冲。详情参见 GRUB/技巧和窍门#禁用 framebuffer。

启动 X 时黑屏/关闭 X 时计算机断电

如果更新 NVIDIA 驱动后启动 Xorg 时屏幕保持黑屏,或者关闭 Xorg 会导致计算机断电,请尝试以下解决方法:

检测到屏幕,但没有可用的配置

有时 NVIDIA 驱动和 X 无法正确找到正在使用的屏幕。如果显卡具有多个输出端口,请尝试将显示器连接到其他端口。对于笔记本电脑,这可能是因为显卡还具有 VGA/TV 输出。Xorg.0.log 中会提供更多信息。

还可以尝试在 Section "Device" 中添加一个无效的 Option "ConnectedMonitor",使 Xorg 报错并提示正确配置方式。有关 ConnectedMonitor 选项的更多信息,请参阅官方文档。

重新运行 X 后,查看 Xorg.0.log,获取有效的 CRT-x、DFP-x 和 TV-x 值。

nvidia-xconfig --query-gpu-info 可能有所帮助。

X 启动失败并显示“Failing initialization of X screen”

如果 /var/log/Xorg.0.log 显示 X 服务器未能初始化屏幕:

(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/。编辑复制后的文件,添加 Option "PrimaryGPU" "yes",最后重启计算机。此时问题应该已经解决。

Xorg 在启动过程中失败,但手动启动正常

在启动速度非常快的系统上,systemd 可能会在 NVIDIA 驱动完全初始化之前尝试启动显示管理器。只有在开机阶段运行 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-580xx-dkmsAUR 或更早版本的软件包,那么在开机、切换虚拟终端或退出 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 系统中 X 启动失败并显示“no screens found”

当系统中存在多块 GPU 时,X 可能启动失败,并显示:

[ 76.633] (EE) No devices detected.
[ 76.633] Fatal server error:
[ 76.633] no screens found

此时需要在 X 配置中添加独立显卡的 BusID。拥有 Intel CPU 和集成 GPU 的系统,或安装了多块 NVIDIA 显卡的系统,都可能遇到这种情况。首先查找 BusID:

# lspci -d ::03xx
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 段添加 BusID。下面展示了配置段的示例(请替换为适合自己系统的值):

/etc/X11/xorg.conf.d/10-nvidia.conf
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:1:0:0"
EndSection
注意:BusID 的格式非常重要!

在上例中,01:00.0 要写成 1:0:0。不过,有时转换更为复杂。lspci 输出中的数字是十六进制,而配置文件中的 BusID 使用十进制!因此,BusID 大于 9 时需要转换成十进制。例如,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).

根据此讨论,一种可能的解决方法是:

运行以下命令获取 version 字符串:

# strings /sys/firmware/acpi/tables/DSDT | grep -i 'windows ' | sort | tail -1

在引导加载程序配置中添加 acpi_osi=! "acpi_osi=version" 内核参数。

另一个可能的原因是使用了 nvidia-open包 软件包,参见:

从挂起状态恢复后黑屏

如果遇到黑屏问题,并且日志包含:

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 多显示器配置中一个或多个显示器无法工作

如果一个或多个显示器在 Xorg 中没有任何输出,并且在 nvidia-settings 控制面板中显示为“Disabled”,则当前 Xorg 配置可能不兼容。 NVIDIA 专有驱动在正常工作时不应强制要求 X 配置文件。参见 NVIDIA#Xorg 配置。

只需移动或重命名 /etc/X11/xorg.conf 以及 xorg.conf.d 中与 NVIDIA 驱动有关的配置文件。Xorg 只会读取扩展名为 .conf 的文件。

$ mv /etc/X11/xorg.conf /etc/X11/xorg.conf.old

禁用旧的 NVIDIA Xorg 配置后,可以使用 nvidia-xconfig 生成适合当前硬件的新配置。不过,通常无需这样做,驱动也应当能够工作。

$ nvidia-xconfig
注意:nvidia-xconfig 会生成名为 /etc/X11/xorg.conf.backup 的备份文件,但多次运行 nvidia-xconfig 可能覆盖该文件。

崩溃与卡死

一般性崩溃

  • 尝试禁用 GSP 固件。
  • 尝试在 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 选项。

网格着色器支持不佳

此问题只出现在依赖网格着色器的新游戏中,例如《最终幻想 VII 重生》。即使使用最新的 NVIDIA 测试版驱动,游戏环境仍可能无法显示。[1]

不过,在等待 NVIDIA 修复期间,可以借助 pyroveil,通过 SPIR-V 绕过该问题。

按照 GitHub 上的教程编译并安装该工具,然后设置 PYROVEIL=1 和 PYROVEIL_CONFIG=/path/to/pyroveil/hacks/ffvii-rebirth-nvidia/pyroveil.json 环境变量启动游戏。

OpenGL 应用程序中的图形异常、卡死和错误

较新的 CPU(Intel Sandy Bridge〔2011 年〕及更新型号,或 AMD Zen〔2017 年〕及更新型号)具有微操作缓存。由于缓存别名(Cache Aliasing)问题,微操作缓存可能与 NVIDIA 驱动的 OpenGL 功能发生冲突[2]。通常可以在 BIOS 中禁用微操作缓存,但这会损失性能[3]。禁用微操作缓存也有助于缓解 Xwayland 应用程序中最严重的图形异常,但无法完全解决问题[4]。

更新或重启系统时发生内核恐慌

这是 NVIDIA 550 系列驱动中的一个已知错误。[5] 目前原因尚不明确,但似乎只影响笔记本电脑。详情参见 BBS#293400。

解决方法是:如果硬件支持,切换到 nvidia-open-dkms包;否则改用 nvidia-535xx-dkmsAUR。

GSP 固件

GSP 固件从 2024 年 6 月发布的 NVIDIA 555 版驱动开始默认启用,已知可能引起各种问题,包括 Vulkan 故障和系统崩溃。

要禁用 GSP 固件,请为 nvidia 内核模块设置 NVreg_EnableGpuFirmware=0 模块参数。此方法仅适用于 NVIDIA 专有驱动;如需从开源驱动切换,请参见 NVIDIA#安装。

如有必要,不要忘记重新生成 initramfs。重启后新的内核模块选项才会生效。

与 VRR 和 TTY 切换有关的崩溃

如果在桌面环境与 TTY 之间切换时驱动崩溃,且 journal 日志包含:

archlinux kernel: [drm:nv_drm_atomic_commit [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID [...]] Flip event timeout
archlinux kernel: nvidia-modeset: ERROR: GPU:0: Idling display engine timed out: [...]

尝试通过显示器的 OSD 菜单禁用可变刷新率(VRR)功能。

另一种解决方法是对显示子系统隐藏驱动的 VRR(G-Sync / FreeSync)能力,以阻止应用程序或合成器启用 VRR:在内核参数中设置 nvidia_modeset.conceal_vrr_caps=1,以强制使用固定刷新率。

Xid 79:GPU 已从总线上掉线

如果在 journal 中发现此类崩溃,可能有多种原因,包括电源故障、线缆问题或 PCI 连接问题。

不过,也有人将其报告为 NVIDIA 驱动问题,其中提到一种通过限制显存时钟频率来解决问题的方法。

首先运行以下命令,获取可用的显存时钟频率:

$ nvidia-smi -q -d SUPPORTED_CLOCKS | grep Memory
        Memory                                         : 9501 MHz
        Memory                                         : 9251 MHz
        Memory                                         : 5001 MHz
        Memory                                         : 810 MHz
        Memory                                         : 405 MHz

然后使用 --lock-memory-clocks(或 -lmc)选项,将最低频率设为支持的最小值,最高频率设为低于最大值的下一档,并按 min,max 的格式指定。例如:

# nvidia-smi --lock-memory-clocks 405,9251

这会设定允许的时钟频率范围,避免设备始终被强制运行在最高频率。也可以将范围上限设置为最大值,但即使显卡未使用,也会增加耗电量。

注意:根据官方文档,--lock-memory-clocks 不适用于采用 NVIDIA Hopper 架构的设备。如果使用的是该架构,请改用 --lock-memory-clocks-deferred(或 -lmcd),该选项只接受一个目标值,而不是一个范围。

显示问题

避免 Xorg 画面撕裂

注意:
  • 据报告,这可能降低部分 OpenGL 应用程序的性能,并导致 WebGL 问题。它还会显著延长驱动在负载结束后降低时钟频率所需的时间(NVIDIA 支持讨论)。
  • 已知 ForceFullCompositionPipeline 会导致一些使用 NVIDIA 535 驱动、通过 Proton 运行的 Vulkan 游戏无法正常工作。
  • 已知 ForceCompositionPipeline 可能导致部分全屏应用立即冻结,使系统无响应,直到切换到其他窗口。一个解决方法是在 Gamescope 中以无边框窗口模式(-b)运行程序,并保持屏幕上至少还有一个其他元素(可以是任务栏或其他图形应用程序)。

NVIDIA 驱动会根据情况使用合成管线,为图像显示做准备。不要将其与合成管理器混淆:后者负责窗口呈现,也可以通过 VSync 缓解画面撕裂。默认情况下,只有当前屏幕变换需要时,才会启用合成管线。该管线会优先使用 GPU 的专用显示引擎,无法使用时则采用通用图形引擎。可以使用以下选项进行控制:

  • ForceCompositionPipeline 强制使用合成管线(详见#多显示器)。
  • ForceFullCompositionPipeline 强制使用合成管线,并强制由图形引擎完成全部处理。

设置 ForceFullCompositionPipeline=On 可以避免 Xorg 中的画面撕裂。要测试此选项是否有效,请运行:

$ 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。

注意:nvidia-xconfig 在 20-nvidia.conf 中生成的许多选项会由驱动自动设置,并非必需。如果仅希望启用合成管线,只需要保留包含 Identifier 和 Option 的 "Screen" 段,其他段可以删除。

多显示器

在多显示器配置中,需要为每个显示器单独指定 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 命令将禁用第二台显示器。

以上命令适用于连接到 DP-2 和 DP-4 的两台 3840x2160 显示器。需要通过导出 xorg.conf 读取正确的 CurrentMetaMode,并为每个显示器附加 ForceCompositionPipeline。设置 ForceCompositionPipeline 只会影响目标显示器。

可以使用 --query 查询当前显示器名称及其偏移量:

$ nvidia-settings --query CurrentMetaMode
提示:在使用不同型号显示器的多显示器配置中,显示器的刷新率可能略有差异。如果驱动启用了 V-Sync,它只会同步到其中一个刷新率,从而可能导致其他显示器出现画面撕裂。因此最好同步到主要使用的显示器。可以在 ~/.nvidia-settings-rc 中通过 0/XVideoSyncToDisplayID= 配置,或者安装 nvidia-settings包 并使用图形界面进行设置。

从挂起或休眠恢复后屏幕显示异常

如果外部显示器在挂起或休眠后无法唤醒,也适用本节。

参见 NVIDIA/提示和技巧#保留挂起后的显存。

使用 GDM 服务时从挂起恢复后屏幕损坏的问题,已于 515.43.04 版驱动中修复[6]。

屏幕显示异常:“六屏”问题

部分使用 GeForce GT 100M 系列显卡的用户发现,启动 X 后画面被分成六块,且分辨率被限制为 640x480。Quadro 2000 和高分辨率显示器上也有人报告过同样的问题。

要解决此问题,请在 Device 段中启用 NoTotalSizeCheck 模式验证选项:

Section "Device"
 ...
 Option "ModeValidation" "NoTotalSizeCheck"
 ...
EndSection

使用 nvidia-470 时文本和图标不可见

GTK4 的一次更新给依赖 nvidia-470 旧显卡驱动的用户带来了问题:更新后文本和图标会随机消失,只有鼠标悬停到窗口上时才会重新出现。[7]

解决方法是指定渲染器:

/etc/environment
GSK_RENDERER=vulkan

修复 GNOME Shell 从睡眠恢复后的图形异常

如果从睡眠恢复后 GNOME Shell 中出现异常字体或奇怪的图形故障,请尝试设置以下内核参数以启用电源管理:

nvidia.NVreg_DynamicPowerManagement=0x02

更多信息:https://download.nvidia.com/XFree86/Linux-x86_64/575.64/README/dynamicpowermanagement.html

显示器关闭或恢复时系统卡死

如果桌面环境通过 DPMS 关闭显示器后,或者系统从挂起恢复时立即卡死或崩溃,并且 dmesg/journal 中出现类似以下 GSP 超时记录:

NVRM: _kgspLogXid119: ********************************* GSP Timeout **********************************
NVRM: Xid (PCI:0000:01:00): 119, Timeout after 6s of waiting for RPC response from GPU0 GSP! Expected function 76 (GSP_RM_CONTROL) sequence 1321 

在这些电源状态切换过程中,GPU 可能会降至不稳定的低时钟频率状态。

解决方法:使用 nvidia-smi 锁定更高的 GPU/显存最低时钟频率。

前提条件:

启用并启动 nvidia-persistenced.service。

查询支持的时钟频率(根据结果选择有效的最小值/最大值组合):

nvidia-smi -q -d SUPPORTED_CLOCKS
nvidia-smi -q -d CLOCK

设置最低时钟频率(以下为示例值,请根据 GPU 支持的最高频率调整):

nvidia-smi -lgc 800,2100
nvidia-smi -lmc 800,10000

测试 DPMS 和挂起/恢复,检查问题是否得到解决。若要还原设置:

nvidia-smi -rgc
nvidia-smi -rmc

如需通过 systemd 永久配置,可创建 nvidia-clocks.service 之类的单元:

/etc/systemd/system/nvidia-clocks.service
[Unit]
Description=Set NVIDIA GPU minimum clocks to avoid  GSP timeouts
Requires=nvidia-persistenced.service
After=nvidia-persistenced.service 

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -lgc 500,2100
ExecStart=/usr/bin/nvidia-smi -lmc 500,10000
RemainAfterExit=yes 

[Install]
WantedBy=multi-user.target

可以将最低时钟频率设置得比上面提到的 800 更低,以减少空闲功耗;但要注意,设置得太低可能导致问题再次出现。

然后启用并启动 nvidia-clocks.service。

性能问题

安装新版驱动后性能下降

本文或本章节的事实准确性存在争议。

原因: 应尝试找到根本原因(检查 dmesg、dkms 日志等),而不是盲目降级驱动。(在 Talk:NVIDIA/故障排除 中讨论)


如果 FPS 比旧版驱动低,请检查是否启用了直接渲染(glxinfo 包含在 mesa-utils包 软件包中):

$ glxinfo | grep direct

如果命令输出:

direct rendering: No

一种可能的解决方法是退回到先前安装的驱动版本,然后重新启动。

Xorg 严重卡顿

本文或本章节的事实准确性存在争议。

原因: 根据一位 NVIDIA 开发者的说法,该问题并非 GNOME 独有,而相关讨论中的其他评论也没有提到多显示器配置。(在 Talk:NVIDIA/故障排除 中讨论)


Mutter 的一个常见问题是:动画、视频播放和游戏可能导致 Xorg 桌面严重卡顿。

参见 NVIDIA/提示和技巧#保留挂起后的显存。

这应该能够解决问题。如果仍未解决,可能没有完善的解决办法。可以尝试添加以下选项来缓解问题:

/etc/environment
CLUTTER_DEFAULT_FPS=YOUR_MAIN_DISPLAY_REFRESHRATE
__GL_SYNC_DISPLAY_DEVICE=YOUR_MAIN_DISPLAY_OUTPUT_NAME

在 NVIDIA Settings 中关闭 Sync to VBlank 和 Allow flipping,并使用 --load-config-only 参数配置 NVIDIA Settings 在启动时自动运行。 即使这样,桌面仍可能存在卡顿,尤其是第二台(或第三台)显示器,但表现应当明显改善。

400 系列显卡出现 CPU 使用率峰值

如果使用 400 系列显卡时 CPU 使用率间歇性飙升,可能是由于 PowerMizer 不断切换 GPU 时钟频率。将 PowerMizer 设置从 Adaptive 切换到 Performance,并在 Xorg 配置的 Device 段中添加以下内容:

如果使用台式机:

 Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x2222; PowerMizerDefaultAC=0x1"

如果使用笔记本电脑:

 Option "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x3322; PowerMizerDefaultAC=0x1"

其他问题

应用程序启动时出现 Vulkan 错误

本文或本章节的事实准确性存在争议。

原因: 需要其他用户确认(在 Talk:NVIDIA/故障排除 中讨论)


运行需要 Vulkan 加速的应用程序时,如果出现以下错误:

Vulkan call failed: -4

请尝试删除 ~/.nv 或 ~/.cache/nvidia 目录。

HDMI 没有音频

有时运行以下命令时,无法看到 NVIDIA HDMI 音频设备:

$ aplay -l

在一些新设备上,NVIDIA GPU 的音频芯片在启动时处于禁用状态。更多信息参见 NVIDIA 网站及论坛帖子。

需要重新加载 NVIDIA 设备并启用音频。首先确保 GPU 已开启(笔记本电脑/Bumblebee 用户尤其应注意),且 X 没有运行在该 GPU 上,因为下面的操作会重置显卡:

# 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

如果 TTY 运行在 NVIDIA 显卡上,请将这些命令写入脚本,以免操作过程中失去画面输出。

某些情况下背光无法关闭

默认情况下,DPMS 应根据超时设置或通过 xset 关闭背光。然而,可能由于 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

HardDPMS

这篇文章的某些内容需要扩充。

原因:补充有关“用户报告”的参考资料。 (在 Talk:NVIDIA/故障排除 中讨论)

专有驱动 415 引入了一个名为 HardDPMS 的新功能。据部分用户报告,它解决了通过 DisplayPort 连接的显示器无法进入挂起状态的问题。 自 440.26 版起,此功能默认启用。如果使用更早的驱动,可以在 Device 或 Screen 段中设置 HardDPMS 选项。例如:

/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),强制 nouveau 使用指定的像素时钟频率。

另一种可能是显示器的 EDID 信息有误。参见 #覆盖 EDID。

还有一种可能是,当前 NVIDIA 驱动默认只允许 EDID 明确报告的显示模式;但用户有时需要 EDID 未提供的刷新率或分辨率(即使 EDID 本身没有错误)。

在这种情况下,可以在 xorg.conf 中添加一个选项,以允许非 EDID 模式:

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
...
    Option         "ModeValidation" "AllowNonEdidModes"
...
EndSection

此选项可以针对各个输出单独设置。更多信息参见 README 附录 B:X 配置选项。

覆盖 EDID

参见 内核级显示模式设置#强制设置显示模式与 EDID、Xrandr#疑难排除 和 Qnix QX2710#Fixing X11 with Nvidia。

nvidia-settings 图形界面无法超频

本文或本章节的语言、语法或风格需要改进。参考:帮助:风格

原因:内容重复,“无法工作”的描述不够明确(在Talk:NVIDIA/故障排除讨论)

解决方法是在启用超频后,通过 nvidia-settings 命令行界面查询和设置相关变量(参见 NVIDIA/提示和技巧#在 nvidia-settings 中启用超频,以及 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

一次设置多个变量的示例(GPU 超频 50 MHz、显存超频 50 MHz、GPU 电压增加 100 mV):

 nvidia-settings -a GPUGraphicsClockOffsetAllPerformanceLevels=50 -a GPUMemoryTransferRateOffsetAllPerformanceLevels=50 -a GPUOverVoltageOffset=100

超频失败并出现 Unknown Error

如果以非 root 用户身份运行 Xorg 并尝试对 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).

为避免此问题,必须以 root 身份运行 Xorg。详情参见 Xorg#没有 root 权限的 Xorg。

功耗

这篇文章的某些内容需要扩充。

原因:本节的目的是什么? (在 Talk:NVIDIA/故障排除 中讨论)

检查驱动的使用情况:

# 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

如果已在内核模块上配置节能功能:

$ 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

这样就会使用 Mesa libgl 进行软件 GLX 和 EGL 渲染,有助于测试某个错误是否与 NVIDIA GL 库有关。

刷新率被限制为 120 Hz

较新版本的驱动(550xx 之后)似乎会在 8 bpc 输出时浪费带宽,可能使信号超出接口规范限制,导致原本在接口带宽范围内的更高刷新率模式无法使用。 在内核参数中添加 nvidia-modeset.hdmi_deepcolor=0,或通过 modprobe 设置该选项。 但请注意,HDR 显示器需要深色彩(Deep Color)功能。

Wayland 下 HDMI 60 Hz 输出的色彩空间错误

某些情况下(例如使用 HDMI 连接、刷新率为 60 Hz 的 GTX 1660 Super 显卡),驱动似乎会错误判断输出色彩空间,使颜色看起来比正常情况更暗。由于 Wayland 下没有简单的方法显式设置色彩空间,可以在内核参数中添加 nvidia-modeset.debug_force_color_space=2,或通过 modprobe 设置该选项,作为临时解决方法。