NVIDIA
本文介绍官方 NVIDIA 显卡驱动程序。有关社区开源驱动程序,请参阅 Nouveau。如果您有配备混合显卡的笔记本电脑,另请参阅 NVIDIA Optimus。
安装
首先,在 nouveau wiki 的代码名称页面上找到您的显卡系列(例如 NV110、NVC0 等),对应于使用以下命令获得的型号/官方名称
$ lspci -k -d ::03xx
然后,为您的显卡安装适当的驱动程序
GPU 系列 | 驱动程序 | 状态 |
---|---|---|
Turing (NV160/TUXXX) 及更新型号 | nvidia-open 用于 linux nvidia-open-lts 用于 linux-lts nvidia-open-dkms 用于任何内核 |
上游推荐 当前,受支持1 |
Maxwell (NV110/GMXXX) 至 Ada Lovelace (NV190/ADXXX) |
nvidia 用于 linux nvidia-lts 用于 linux-lts nvidia-dkms 用于任何内核 |
当前,受支持1 |
Kepler (NVE0/GKXXX) | nvidia-470xx-dkmsAUR | 旧版,不受支持2,3 |
Fermi (NVC0/GF1XX) | nvidia-390xx-dkmsAUR | |
Tesla (NV50/G80-90-GT2XX) | nvidia-340xx-dkmsAUR | |
Curie (NV40/G70) 及更旧型号 | 不再打包 |
- 如果这些软件包不起作用,通常是由于新的硬件版本发布,nvidia-open-betaAUR 可能有更新的驱动程序版本提供支持。
- 在具有 Intel CPU 第 11 代及更新型号 的系统上,Linux 5.18(或更高版本)可能无法正常运行,这是由于与 间接分支跟踪不兼容。您可以通过从 引导加载程序 设置
ibt=off
内核参数 来禁用它。请注意,此安全功能负责缓解一类利用技术。 - NVIDIA 不再积极支持这些显卡及其驱动程序,并且它们的驱动程序 可能不正式支持当前的 Xorg 版本。使用 nouveau 驱动程序可能更容易;但是,NVIDIA 的旧版驱动程序仍然可用,并且可能提供更好的 3D 性能/稳定性。
- 注意
- 安装 dkms 时,请阅读 Dynamic Kernel Module Support#Installation。
- DKMS 变体不绑定到特定的内核,因为它们会为安装了头文件的每个内核重新编译 NVIDIA 内核模块。
为了获得 32 位应用程序支持,还要从 multilib 仓库安装相应的 lib32 软件包(例如 lib32-nvidia-utils)。
从 /etc/mkinitcpio.conf
中的 HOOKS
数组中删除 kms
,并重新生成 initramfs。这将防止 initramfs 包含 nouveau
模块,确保内核在早期启动期间无法加载它。nvidia-utils 软件包包含一个文件,该文件会在您重新启动后将 nouveau
模块列入黑名单。
驱动程序安装完成后,继续进行 #Xorg 配置 或 #Wayland 配置。
自定义内核
确保您的内核具有 CONFIG_DRM_SIMPLEDRM=y
,并且如果使用 CONFIG_DEBUG_INFO_BTF
,则 PKGBUILD 中需要此选项(自内核 5.16 起)
install -Dt "$builddir/tools/bpf/resolve_btfids" tools/bpf/resolve_btfids/resolve_btfids
DRM 内核模式设置
由于 NVIDIA 不支持 自动 KMS 延迟加载,因此需要启用 DRM (Direct Rendering Manager) 内核模式设置 才能使 Wayland 合成器正常运行,或者允许 Xorg#Rootless Xorg。
从 nvidia-utils 560.35.03-5 开始,DRM 默认启用。[1] 对于旧版驱动程序,请为 nvidia_drm
模块设置 modeset=1
内核模块参数。
要验证 DRM 是否实际启用,请执行以下操作
# cat /sys/module/nvidia_drm/parameters/modeset
现在应返回 Y
,而不是 N
。
提前加载
对于基本功能,只需添加内核参数就足够了。如果您想确保它尽早加载,或者您注意到启动问题(例如 nvidia
内核模块在 显示管理器 之后加载),您可以将 nvidia
、nvidia_modeset
、nvidia_uvm
和 nvidia_drm
添加到 initramfs。请参阅 Kernel module#Early module loading 以了解如何配置您的 initramfs 生成器。mkinitcpio 用户可能还需要在每次 nvidia 驱动程序更新时重新生成 initramfs 镜像。请参阅 #pacman 钩子 以自动化这些步骤。
pacman 钩子
*-dkms
软件包不需要它,因为它们的升级将自动触发 mkinitcpio 运行。为了避免在 NVIDIA 驱动程序升级后忘记更新 initramfs 的可能性,您可能需要使用 pacman 钩子
/etc/pacman.d/hooks/nvidia.hook
[Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package # You can remove package(s) that don't apply to your config, e.g. if you only use nvidia-open you can remove nvidia-lts as a Target Target=nvidia Target=nvidia-open Target=nvidia-lts # If running a different kernel, modify below to match 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'
Exec
行中的复杂性是为了避免在 nvidia
和 linux
都更新时多次运行 mkinitcpio。如果这种情况不会困扰您,则可以删除 Target=linux
和 NeedsTargets
行,并且可以将 Exec
行简化为 Exec=/usr/bin/mkinitcpio -P
。硬件加速视频解码
GeForce 8 系列显卡及更新型号支持使用 VDPAU 进行加速视频解码。Fermi (~400 系列) 显卡及更新型号支持使用 NVDEC 进行加速视频解码。有关详细信息,请参阅 Hardware video acceleration。
使用 NVENC 的硬件加速视频编码
NVENC 需要 nvidia_uvm
模块和在 /dev
下创建相关的设备节点。
最新的驱动程序软件包提供了一个 udev 规则,该规则会自动创建设备节点,因此无需进一步操作。
如果您使用的是旧版驱动程序(例如 nvidia-340xx-dkmsAUR),则需要创建设备节点。调用 nvidia-modprobe
实用程序会自动创建它们。您可以创建 /etc/udev/rules.d/70-nvidia.rules
以自动运行它
/etc/udev/rules.d/70-nvidia.rules
ACTION=="add", DEVPATH=="/bus/pci/drivers/nvidia", RUN+="/usr/bin/nvidia-modprobe -c 0 -u"
Wayland 配置
关于 Xwayland,请查看 Wayland#Xwayland。
有关更多配置选项,请查看相应 合成器的 wiki 页面或文档。
linux-drm-syncobj-v1
协议进行显式同步的 Wayland 合成器时,NVIDIA 驱动程序可能会出现主要问题,表现为闪烁、帧序混乱等,无论是在原生 Wayland 应用程序还是 Xwayland 应用程序中。基本支持
nvidia_drm
模块有两个内核参数需要考虑:modeset
和 fbdev
。当使用 nvidia-utils 软件包时,两者都默认启用。NVIDIA 也计划在未来的版本中默认启用它们。
modeset
启用 modeset
对于所有 Wayland 配置都是必要的。
对于不支持的驱动程序,其中需要手动启用 modeset
,请参阅 #DRM 内核模式设置 和 Wayland#Requirements 以获取更多信息。
fbdev
启用 fbdev
对于某些 Wayland 配置是必要的。
它特别是在 Linux 6.11 及更高版本上的硬性要求,但目前尚不清楚这是否是预期行为还是错误,请参阅 [2] 了解更多详细信息。
它可以像 modesetting 参数 一样设置,区别在于执行
# cat /sys/module/nvidia_drm/parameters/fbdev
如果根本未设置,则会返回文件丢失错误,而不是 N
。
挂起支持
Wayland 挂起可能比 X 更容易受到默认值的影响,请参阅 /Tips and tricks#Preserve video memory after suspend 了解详细信息。
如果您使用 GDM,另请参阅 GDM#Wayland and the proprietary NVIDIA driver。
Xorg 配置
专有的 NVIDIA 显卡驱动程序不需要任何 Xorg 服务器配置文件。您可以启动 X 以查看 Xorg 服务器是否在没有配置文件的情况下正常运行。但是,可能需要创建一个配置文件(首选 /etc/X11/xorg.conf.d/20-nvidia.conf
而不是 /etc/X11/xorg.conf
)以调整各种设置。此配置可以由 NVIDIA Xorg 配置工具生成,也可以手动创建。如果手动创建,它可以是最小配置(从某种意义上说,它只会将基本选项传递给 Xorg 服务器),或者它可以包含许多可以绕过 Xorg 的自动发现或预配置选项的设置。
自动配置
NVIDIA 软件包包含一个自动配置工具,用于创建 Xorg 服务器配置文件 (xorg.conf
),可以通过以下方式运行
# nvidia-xconfig
此命令将根据当前硬件自动检测并创建(或编辑,如果已存在)/etc/X11/xorg.conf
配置。
如果存在 DRI 实例,请确保将其注释掉
# Load "dri"
仔细检查您的 /etc/X11/xorg.conf
以确保您的默认深度、水平同步、垂直刷新率和分辨率是可以接受的。
nvidia-settings
nvidia-settings 工具允许您使用 CLI 或 GUI 配置许多选项。运行 nvidia-settings
不带任何选项将启动 GUI,有关 CLI 选项,请参阅 nvidia-settings(1)。
您可以以非 root 用户身份运行 CLI/GUI,并通过使用nvidia-settings Configuration 选项卡下的Save Current Configuration 选项将设置保存到 ~/.nvidia-settings-rc
。
要为当前用户加载 ~/.nvidia-settings-rc
$ nvidia-settings --load-config-only
请参阅 Autostarting 以在每次启动时启动此命令。
- Xorg 在保存
nvidia-settings
更改后可能无法启动或在启动时崩溃。调整或删除生成的~/.nvidia-settings-rc
和/或 Xorg 文件应该可以恢复正常启动。 - Cinnamon 桌面可以覆盖通过
nvidia-settings
所做的更改。您可以调整 Cinnamon 启动行为以防止这种情况。
手动配置
可以通过编辑配置文件来执行一些调整(无法自动或使用 nvidia-settings 启用)。Xorg 服务器需要重新启动后才能应用任何更改。
有关其他详细信息和选项,请参阅 NVIDIA Accelerated Linux Graphics Driver README and Installation Guide。
最小化配置
20-nvidia.conf
(或已弃用的 xorg.conf
)中的基本配置块如下所示
/etc/X11/xorg.conf.d/20-nvidia.conf
Section "Device" Identifier "NVIDIA Card" Driver "nvidia" VendorName "NVIDIA Corporation" BoardName "GeForce GTX 1050 Ti" EndSection
启动时禁用徽标
如果您使用的是旧版驱动程序 (nvidia-340xx-dkmsAUR),您可能希望禁用在 X 启动时显示的 NVIDIA 徽标启动画面。在 Device
部分下添加 "NoLogo"
选项
Option "NoLogo" "1"
覆盖显示器检测
Device
部分下的 "ConnectedMonitor"
选项允许在 X 服务器启动时覆盖显示器检测,这可以节省大量启动时间。可用选项包括:模拟连接的 "CRT"
,数字显示器的 "DFP"
和电视的 "TV"
。
以下语句强制 NVIDIA 驱动程序绕过启动检查并将显示器识别为 DFP
Option "ConnectedMonitor" "DFP"
启用亮度控制
添加到内核参数
nvidia.NVreg_RegistryDwords=EnableBrightnessControl=1
或者,在 Device
部分下添加以下内容
Option "RegistryDwords" "EnableBrightnessControl=1"
如果亮度控制仍然无法使用此选项,请尝试安装 nvidia-bl-dkmsAUR。
/sys/class/backlight/nvidia_backlight/
接口来控制背光亮度,但您的系统可能会继续在 /sys/class/backlight/acpi_video0/
上发出背光控制更改。在这种情况下,一种解决方案是使用 inotifywait 监视 acpi_video0/brightness
上的更改,并将更改转换为 nvidia_backlight/brightness
并写入。请参阅 Backlight#sysfs modified but no brightness change。启用 SLI
摘自 NVIDIA 驱动程序的 README 附录 B:此选项控制受支持配置中 SLI 渲染的配置。 “受支持的配置”是指配备了 SLI 认证主板和 2 个或 3 个 SLI 认证 GeForce GPU 的计算机。
使用 lspci
找到第一个 GPU 的 PCI 总线 ID
# lspci -d ::03xx
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller (rev 09) 03:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) 04: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)
在 Device
部分下添加 BusID(上例中为 3)
BusID "PCI:3:0:0"
"PCI:<BusID>:0:0"
在 Screen
部分下添加所需的 SLI 渲染模式值
Option "SLI" "AA"
下表列出了可用的渲染模式。
值 | 行为 |
---|---|
0, no, off, false, Single | 渲染时仅使用单个 GPU。 |
1, yes, on, true, Auto | 启用 SLI 并允许驱动程序自动选择适当的渲染模式。 |
AFR | 启用 SLI 并使用交替帧渲染模式。 |
SFR | 启用 SLI 并使用分割帧渲染模式。 |
AA | 启用 SLI 并使用 SLI 抗锯齿。将此选项与全场景抗锯齿结合使用以提高视觉质量。 |
或者,您可以使用 nvidia-xconfig 实用程序通过单个命令将这些更改插入到 xorg.conf
中
# nvidia-xconfig --busid=PCI:3:0:0 --sli=AA
要从 shell 验证 SLI 模式是否已启用
$ nvidia-settings -q all | grep SLIMode
Attribute 'SLIMode' (arch:0.0): AA 'SLIMode' is a string attribute. 'SLIMode' is a read-only attribute. 'SLIMode' can use the following target types: X Screen.
如果此配置不起作用,您可能需要使用 nvidia-settings
提供的 PCI 总线 ID,
$ nvidia-settings -q all | grep -i pcibus
Attribute 'PCIBus' (host:0[gpu:0]): 101. 'PCIBus' is an integer attribute. 'PCIBus' is a read-only attribute. 'PCIBus' can use the following target types: GPU, SDI Input Device. Attribute 'PCIBus' (host:0[gpu:1]): 23. 'PCIBus' is an integer attribute. 'PCIBus' is a read-only attribute. 'PCIBus' can use the following target types: GPU, SDI Input Device.
并注释掉 xorg.d 配置中的 PrimaryGPU 选项,
/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
... Section "OutputClass" ... # Option "PrimaryGPU" "yes" ...
使用此配置也可能解决任何图形启动问题。
多显示器
有关更多常规信息,请参阅 Multihead。
使用 nvidia-settings
nvidia-settings 工具可以配置多个显示器。
对于 CLI 配置,首先运行以下命令获取 CurrentMetaMode
$ nvidia-settings -q CurrentMetaMode
Attribute 'CurrentMetaMode' (hostnmae:0.0): id=50, switchable=no, source=nv-control :: DPY-1: 2880x1620 @2880x1620 +0+0 {ViewPortIn=2880x1620, ViewPortOut=2880x1620+0+0}
将 ::
之后的所有内容保存到属性的末尾(在本例中为:DPY-1: 2880x1620 @2880x1620 +0+0 {ViewPortIn=2880x1620, ViewPortOut=2880x1620+0+0}
),并使用 nvidia-settings --assign "CurrentMetaMode=your_meta_mode"
重新配置您的显示器。
ConnectedMonitor
如果驱动程序未正确检测到第二个显示器,您可以使用 ConnectedMonitor 强制其检测。
/etc/X11/xorg.conf
Section "Monitor" Identifier "Monitor1" VendorName "Panasonic" ModelName "Panasonic MICRON 2100Ex" HorizSync 30.0 - 121.0 # this monitor has incorrect EDID, hence Option "UseEDIDFreqs" "false" VertRefresh 50.0 - 160.0 Option "DPMS" EndSection Section "Monitor" Identifier "Monitor2" VendorName "Gateway" ModelName "GatewayVX1120" HorizSync 30.0 - 121.0 VertRefresh 50.0 - 160.0 Option "DPMS" EndSection Section "Device" Identifier "Device1" Driver "nvidia" Option "NoLogo" Option "UseEDIDFreqs" "false" Option "ConnectedMonitor" "CRT,CRT" VendorName "NVIDIA Corporation" BoardName "GeForce 6200 LE" BusID "PCI:3:0:0" Screen 0 EndSection Section "Device" Identifier "Device2" Driver "nvidia" Option "NoLogo" Option "UseEDIDFreqs" "false" Option "ConnectedMonitor" "CRT,CRT" VendorName "NVIDIA Corporation" BoardName "GeForce 6200 LE" BusID "PCI:3:0:0" Screen 1 EndSection
重复的带有 Screen
的设备是您如何在不使用 TwinView
的情况下让 X 在一张显卡上使用两个显示器。请注意,nvidia-settings
将剥离您添加的任何 ConnectedMonitor
选项。
TwinView
您只需要一个大屏幕而不是两个。将 TwinView
参数设置为 1
。如果您希望进行合成,则应使用此选项。TwinView 仅在每个显卡的基础上工作,当所有参与的显示器都连接到同一张显卡时。
Option "TwinView" "1"
示例配置
/etc/X11/xorg.conf.d/10-monitor.conf
Section "ServerLayout" Identifier "TwinLayout" Screen 0 "metaScreen" 0 0 EndSection Section "Monitor" Identifier "Monitor0" Option "Enable" "true" EndSection Section "Monitor" Identifier "Monitor1" Option "Enable" "true" EndSection Section "Device" Identifier "Card0" Driver "nvidia" VendorName "NVIDIA Corporation" #refer to the link below for more information on each of the following options. Option "HorizSync" "DFP-0: 28-33; DFP-1: 28-33" Option "VertRefresh" "DFP-0: 43-73; DFP-1: 43-73" Option "MetaModes" "1920x1080, 1920x1080" Option "ConnectedMonitor" "DFP-0, DFP-1" Option "MetaModeOrientation" "DFP-1 LeftOf DFP-0" EndSection Section "Screen" Identifier "metaScreen" Device "Card0" Monitor "Monitor0" DefaultDepth 24 Option "TwinView" "True" SubSection "Display" Modes "1920x1080" EndSubSection EndSection
如果您有多张支持 SLI 的显卡,则可以将多个显示器连接到不同的显卡(例如:两张 SLI 显卡,每张显卡连接一个显示器)。“MetaModes”选项与 SLI Mosaic 模式结合使用可以实现此目的。以下是适用于上述示例并完美运行 GNOME 的配置。
/etc/X11/xorg.conf.d/10-monitor.conf
Section "Device" Identifier "Card A" Driver "nvidia" BusID "PCI:1:00:0" EndSection Section "Device" Identifier "Card B" Driver "nvidia" BusID "PCI:2:00:0" EndSection Section "Monitor" Identifier "Right Monitor" EndSection Section "Monitor" Identifier "Left Monitor" EndSection Section "Screen" Identifier "Right Screen" Device "Card A" Monitor "Right Monitor" DefaultDepth 24 Option "SLI" "Mosaic" Option "Stereo" "0" Option "BaseMosaic" "True" Option "MetaModes" "GPU-0.DFP-0: 1920x1200+4480+0, GPU-1.DFP-0:1920x1200+0+0" SubSection "Display" Depth 24 EndSubSection EndSection Section "Screen" Identifier "Left Screen" Device "Card B" Monitor "Left Monitor" DefaultDepth 24 Option "SLI" "Mosaic" Option "Stereo" "0" Option "BaseMosaic" "True" Option "MetaModes" "GPU-0.DFP-0: 1920x1200+4480+0, GPU-1.DFP-0:1920x1200+0+0" SubSection "Display" Depth 24 EndSubSection EndSection Section "ServerLayout" Identifier "Default" Screen 0 "Right Screen" 0 0 Option "Xinerama" "0" EndSection
使用 TwinView 的垂直同步
如果您正在使用 TwinView 和垂直同步(nvidia-settings 中的“Sync to VBlank”选项),您会注意到只有一块屏幕被正确同步,除非您有两个相同的显示器。尽管 nvidia-settings 确实提供了一个选项来更改要同步的屏幕(“Sync to this display device”选项),但这并不总是有效。一种解决方案是在启动时添加以下环境变量,例如在 /etc/profile
中附加
export __GL_SYNC_TO_VBLANK=1 export __GL_SYNC_DISPLAY_DEVICE=DFP-0 export VDPAU_NVIDIA_SYNC_DISPLAY_DEVICE=DFP-0
您可以将 DFP-0
更改为您首选的屏幕(DFP-0
是 DVI 端口,CRT-0
是 VGA 端口)。您可以从 nvidia-settings 的“X Server XVideoSettings”部分找到显示器的标识符。
使用 TwinView 游戏
如果您想在使用 TwinView 时玩全屏游戏,您会注意到游戏将两个屏幕识别为一个大屏幕。虽然这在技术上是正确的(虚拟 X 屏幕确实是您的屏幕组合的大小),但您可能不想同时在两个屏幕上玩游戏。
要纠正 SDL 的此行为,请尝试
export SDL_VIDEO_FULLSCREEN_HEAD=1
对于 OpenGL,请在 Device
部分中将适当的 Metamodes 添加到您的 xorg.conf 并重新启动 X
Option "Metamodes" "1680x1050,1680x1050; 1280x1024,1280x1024; 1680x1050,NULL; 1280x1024,NULL;"
另一种可能单独工作或与上述方法结合使用的方法是在单独的 X 服务器中启动游戏。
Mosaic 模式
Mosaic 模式是在多个显卡上使用超过 2 个显示器进行合成的唯一方法。您的窗口管理器可能无法识别每个显示器之间的区别。Mosaic 模式需要有效的 SLI 配置。即使在使用没有 SLI 的 Base 模式时,GPU 也必须是 SLI 兼容/兼容的。
Base Mosaic
Base Mosaic 模式适用于任何一组 Geforce 8000 系列或更高版本的 GPU。无法从 nvidia-setting GUI 中启用它。您必须使用 nvidia-xconfig 命令行程序或手动编辑 xorg.conf
。必须指定 Metamodes。以下是 2x2 配置中四个 DFP 的示例,每个 DFP 以 1920x1024 运行,两个 DFP 连接到两张显卡
$ nvidia-xconfig --base-mosaic --metamodes="GPU-0.DFP-0: 1920x1024+0+0, GPU-0.DFP-1: 1920x1024+1920+0, GPU-1.DFP-0: 1920x1024+0+1024, GPU-1.DFP-1: 1920x1024+1920+1024"
SLI Mosaic
如果您有 SLI 配置,并且每个 GPU 都是 Quadro FX 5800、Quadro Fermi 或更新型号,则可以使用 SLI Mosaic 模式。可以从 nvidia-settings GUI 中启用它,也可以从命令行中使用以下命令启用它
$ nvidia-xconfig --sli=Mosaic --metamodes="GPU-0.DFP-0: 1920x1024+0+0, GPU-0.DFP-1: 1920x1024+1920+0, GPU-1.DFP-0: 1920x1024+0+1024, GPU-1.DFP-1: 1920x1024+1920+1024"
NVswitch
对于具有 NVswitch 的系统,如 AWS 上的 H100x8,需要以下操作。
- 安装 nvidia-fabricmanager
- 安装 fabric manager 所需的匹配内核模块
使用 fabricmanager,pytorch 会报告找不到 GPU。
要安装 fabric manager
- 从 nvidia 下载 tarball。此处
- 版本 555.42.02 效果良好
- 修改 sbin/fm_run_package_installer.sh 中的安装脚本以修复已安装的文件路径
要获取匹配的内核驱动程序
- git 克隆 nvidia-beta-dkms 和 nvidia-utils-beta 的 AUR
- 更改 PKGBUILD 以使用版本 555.42.02
- 构建并安装它们
- 重启
最后,systemctl enable nvidia-fabricmanager
和 systemctl start nvidia-fabricmanager
,然后 pytorch 应该可以工作了。
技巧和窍门
请参阅 NVIDIA/技巧和窍门。
故障排除
请参阅 NVIDIA/故障排除。