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 Turing 上没有 RTD3 电源管理2 导致某些笔记本电脑崩溃2 |
| Maxwell (NV110/GMXXX) 至 Ada Lovelace (NV190/ADXXX) |
nvidia-580xx-dkmsAUR | 旧版本,支持 |
| Kepler (NVE0/GKXXX) | nvidia-470xx-dkmsAUR | 旧版本,不支持3,4 |
| Fermi (NVC0/GF1XX) | nvidia-390xx-dkmsAUR | |
| Tesla (NV50/G80-90-GT2XX) | nvidia-340xx-dkmsAUR | |
| Curie (NV40/G70) 及更早版本 | 已不再打包 |
- 如果这些软件包不起作用(通常是由于新硬件发布),nvidia-open-betaAUR 可能包含一个提供支持的新版本。
- NVIDIA 的 GSP 固件已知会导致问题,从 Turing GPU 的次优电源管理到 包含 Ampere GPU 的某些笔记本电脑上的完全失败。如果受影响,请使用专有驱动程序(例如 nvidia-580xx-dkmsAUR)并带有 模块参数
NV_EnableGpuFirmware=0。 - 在 Linux 5.18(或更高版本)上,对于带有 Intel CPU 的系统,由于与 间接分支跟踪 的不兼容性,可能无法正常运行 第 11 代及更新版本。您可以通过从 引导加载程序设置
ibt=off内核参数来禁用它。请注意,此安全功能负责 缓解一类漏洞利用技术。 - NVIDIA 不再积极支持这些卡,并且其驱动程序可能不支持当前的 Xorg 版本。使用 nouveau 驱动程序可能更容易;但是,NVIDIA 的旧版本驱动程序仍然可用,并且可能提供更好的 3D 性能/稳定性。
- 注
- 安装 dkms 时,请阅读 Dynamic Kernel Module Support#Installation。
- DKMS 变体不与特定内核绑定,因为它们会为已安装了头文件信息的每个内核重新编译 NVIDIA 内核模块。
有关 32 位应用程序支持,请从 multilib 仓库安装相应的 *lib32* 软件包(例如 lib32-nvidia-utils)。
nvidia-utils 软件包包含一个文件,该文件会在您重启后禁用 `nouveau` 模块。可选地,您也可以从 `/etc/mkinitcpio.conf` 中的 `HOOKS` 数组中移除 `kms` 并重新生成 initramfs。这将确保 initramfs 不包含 `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
如果您的内核编译时启用了 `CONFIG_NOVA_CORE`,您可能需要阻止新的 NVIDIA GPU 驱动程序 Nova 加载。nvidia-utils 默认会将其加入黑名单。您可以通过运行 systemd-analyze 来检查这一点。如果您安装了不同版本的驱动程序,您可能需要手动将 `nova_core` 和 `nova_drm` 模块加入黑名单。
DRM 内核模式设置
由于 NVIDIA 不支持自动 KMS 延迟加载,启用 DRM(Direct Rendering Manager)内核模式设置是使 Wayland 合成器正常工作的必要条件。KMS 也对于双 GPU 设置中 NVIDIA dGPU 上的原生 Wayland 渲染是必需的。
从 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 用户(v40 版本之后)不需要执行手动 initramfs 重新生成,因为内置钩子将自动完成此操作。
硬件加速视频解码
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 页面或文档。
基本支持
对于 `nvidia_drm` 模块,有两个内核参数需要考虑:`modeset` 和 `fbdev`。在使用 nvidia-utils 软件包时,两者默认启用。NVIDIA 还计划在未来的版本中默认启用它们。
modeset
启用 `modeset` 对于所有 Wayland 配置的正常运行是必要的。
对于需要手动启用 `modeset` 的不支持的驱动程序,请参阅 #DRM 内核模式设置,并参阅 Wayland#Requirements 获取更多信息。
fbdev
对于不再支持的旧版本驱动程序,启用 `fbdev` 可能对某些 Wayland 配置是必需的。
对于 Linux 6.11 及更高版本,它是一个硬性要求,但目前尚不清楚这是预期行为还是 bug,有关更多详细信息,请参阅 [2]。
可以以与modesetting 参数相同的方式设置,区别在于执行
# cat /sys/module/nvidia_drm/parameters/fbdev
如果根本没有设置,将返回文件丢失的错误,而不是 `N`。
挂起支持
与 X 相比,Wayland 挂起可能更容易受到默认设置的影响,有关详细信息,请参阅 /Tips and tricks#Preserve video memory after suspend。
如果您使用 GDM,也请参阅 GDM#Wayland and the proprietary NVIDIA driver。
nvidia-application-profiles-rc.d
如果未针对其进程名称应用 `GLVidHeapReuseRatio` 应用程序配置文件键,一些 Wayland 合成器默认会占用大量 VRAM。例如,niri 用户可以通过以下方式释放高达约 2.5GiB 的空闲 VRAM 占用:
/etc/nvidia/nvidia-application-profiles-rc.d/50-limit-free-buffer-pool-in-wayland-compositors.json
{
"rules": [
{
"pattern": {
"feature": "procname",
"matches": "niri"
},
"profile": "Limit free buffer pool on Wayland compositors"
}
],
"profiles": [
{
"name": "Limit free buffer pool on Wayland compositors",
"settings": [
{
"key": "GLVidHeapReuseRatio",
"value": 0
}
]
}
]
}
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` 配置。
仔细检查您的 `/etc/X11/xorg.conf`,以确保默认的颜色深度、水平同步、垂直刷新率和分辨率是可接受的。
nvidia-settings
nvidia-settings 工具允许您使用 CLI 或 GUI 配置许多选项。运行 `nvidia-settings` 不带任何选项将启动 GUI,有关 CLI 选项,请参阅 nvidia-settings(1)。
您可以以非 root 用户身份运行 CLI/GUI,并通过“nvidia-settings 配置”选项卡下的“保存当前配置”将设置保存到 `~/.nvidia-settings-rc`。
要为当前用户加载 `~/.nvidia-settings-rc`
$ nvidia-settings --load-config-only
请参阅 Autostarting 以在每次启动时运行此命令。
手动配置
可以通过编辑配置文件来执行一些调整(这些调整无法自动或使用 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
禁用启动时的 Logo
如果您使用的是旧版驱动程序(nvidia-340xx-dkmsAUR),您可能希望禁用 X 启动时显示的 NVIDIA Logo 启动画面。在 `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。
启用 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` 部分添加总线 ID(上例中为 3)
BusID "PCI:3: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 1.2 纠正此行为,请尝试
export SDL_VIDEO_FULLSCREEN_HEAD=1
对于 OpenGL,在 xorg.conf 的 `Device` 部分添加适当的 Metamodes 并重启 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。下面是四个 DFP 在 2x2 配置下的示例,每个 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 clone AUR 中的 nvidia-beta-dkms 和 nvidia-utils-beta
- 更改 PKGBUILD 以使用版本 555.42.02
- 构建并安装它们
- 重启
最后,`systemctl enable nvidia-fabricmanager` 和 `systemctl start nvidia-fabricmanager`,然后 pytorch 应该可以工作。