NVIDIA (简体中文) - ArchWiki

Jump to content

# NVIDIA (简体中文)

From ArchWiki

相关文章

- NVIDIA/Tips and tricks
- NVIDIA/Troubleshooting
- Nouveau
- NVIDIA Optimus
- PRIME
- Bumblebee
- nvidia-xrun
- Xorg (简体中文)
- Vulkan

本文包含安装和配置 NVIDIA 专有 显卡驱动的信息。想要了解开源驱动的信息，参见 Nouveau.如果您使用基于 hybrid Intel/NVIDIA的双显卡笔记本, 参见 NVIDIA Optimus 内容.

## 安装

该部分仅适用于 linux 或 linux-lts 内核包，定制内核请略过该小节。

警告： 请避免从NVIDIA官网下载驱动包进行安装。通过使用ArchLinux的pacman来安装，NVIDIA驱动能够在更新系统时与其他组件一同更新。

1. 如果你不知道显卡情况，可运行以下命令获知：

      $ lspci -k | grep -A 2 -E "(VGA|3D)"

2. 也从以下渠道可确定你的显卡型号以及下载相应的版本：

  - 查找代号(如 NV50, NVC0等）： 英伟达代号查询页 或 [1]
  - 如果在上面的页面找不到你的型号的显卡，可到英伟达历史型号列表页查找。
  - 英伟达驱动下载站

3. 为你的显卡安装和合适的驱动：

  - GeForce 930起、10系至20系、 Quadro/Tesla/Tegra K-系列以及更新的显卡（NV110以及更新的显卡家族），安装 nvidia （用于linux） 或者 nvidia-lts （用于linux-lts）。
    - 假如您是使用最新的显卡，如果以上两个驱动安装后都不能正常工作，您也许需要使用 nvidia-betaAUR 和 nvidia-utils-betaAUR 来获得支持。
  - 2013年至2014年左右的开普勒（NVE0）系列（包括GeForce 630-920），安装nvidia-470xx-dkmsAUR.
  - GeForce 400/500/600 系列（ NVCx 以及 NVDx ），大概是2010年至2011年的显卡，安装 nvidia-390xx-dkmsAUR.

  - 更老的显卡型号（发布于2010年或更早），参见#不再受支持的显卡 。

4. 对于32位应用程序支持，请安装multilib仓库中对应的 lib32 nvidia 软件包（例如lib32-nvidia-utils）。

5. 重新启动您的计算机。nvidia 软件包包含一个屏蔽了 nouveau 内核模块的文件，所以重启是必要的。

一旦驱动安装完毕，就可以进入下一步了：配置英伟达驱动。

### 不再受支持的显卡

如果你的显卡是 GeForce 300 系列或者更老的（发布于2010年及之前），Nvidia不再为这些显卡提供驱动。这意味着这些驱动不支持现在的Xorg版本。因此使用 Nouveau 驱动可能会更方便，因为它依然为这些老显卡提供对当前Xorg的支持。

但是，Nvidia 依然提供 legacy 驱动，并且或许拥有更好的 3D 性能（稳定性）。

- GeForce 8/9、ION以及100至300系列显卡（NV5x、NV8x、NV9x以及NVAx），安装 nvidia-340xx-dkmsAUR。
- GeForce 7系列及更老的显卡（NV6x、NV4x及以下），Arch Linux没有相应的驱动包。

### 定制内核

如果你使用的是一个定制的内核，可以通过 DKMS 来自动编译 Nvidia 内核模块。

安装 nvidia-dkms 软件包。 Nvidia 内核模块会在每次 Nvidia 或者内核更新的时候自动重新编译，这个功能由 DKMS pacman钩子 实现。

### DRM内核级显示模式设置

nvidia 364.16 添加了对 DRM （Direct Rendering Manager) 内核级显示模式设置的支持。使用此功能需要添加`nvidia-drm.modeset=1`内核参数。除非有别的需求，添加内核参数已经足够使用基本的功能了。但是，如果你想尽早加载此功能，或者发现启动时有问题（比如 `nvidia` 内核模块在显示管理器之后才加载），你可以往Mkinitcpio#MODULES里添加这4个模块：`nvidia`、 `nvidia_modeset`、 `nvidia_uvm` 以及 `nvidia_drm`。这会使 initramfs 包含这4个模块以便初始化时加载。

如果你将这4个模块加入到了 initramfs，那么你就需要每次更新 nvidia 驱动之后运行一次 mkinitcpio。参见 #Pacman钩子 来自动化这一步骤。

警告： 启用 KMS 会导致 GNOME 默认使用 Wayland. 非原生 Wayland 应用在 Wayland 会话里性能表现很差，因为 XWayland 没有硬件加速。这个问题在 NVIDIA 470 驱动 得到修复，但是这是一个 beta 版驱动。综上，请暂时使用 GNOME on Xorg 会话。
注意： NVIDIA 驱动没有为内核内置的 `vesafb` 模块提供 `fbdev` 驱动以用于高分辨率终端 。但是，另一个内核内置模块 `efifb` 能够在 EFI 系统上支持高分辨率终端。 后者需要 GRUB 或者 rEFInd，详细内容参考 NVIDIA/Tips and tricks#Fixing terminal resolution.[2][3][4].

#### Pacman钩子

为了避免更新 NVIDIA 驱动之后忘了更新initramfs，你可以使用Pacman Hooks：

    /etc/pacman.d/hooks/nvidia.hook

    [Trigger]
    Operation=Install
    Operation=Upgrade
    Operation=Remove
    Type=Package
    Target=nvidia
    Target=linux
    # Change the linux part above and in the Exec line if a different kernel is used

    [Action]
    Description=Update 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'

务必保证 `Target` 项所设置的软件包与你在前面的安装过程中所使用的相符（例如`nvidia` 或 `nvidia-dkms` 或 `nvidia-lts` 或 `nvidia-ck-something`）。

注意： `Exec` 那一行看起来非常复杂，是为了避免在 `nvidia` 和 `linux` 软件包都发生更新的时候重复运行 `mkinitcpio`。如果你觉得无所谓，可以删掉 `Target=linux` 以及 `NeedsTargets`，然后 `Exec` 就可以简化为 `Exec=/usr/bin/mkinitcpio -P`.

### 硬件加速视频解码

GeForce 8系列及更新的显卡通过 VDPAU 进行视频硬件解码。费米架构（400、500系列）及更新的显卡支持通过 NVDEC 进行硬件加速解码。参见硬件视频加速。

## Xorg配置

NVIDIA专有驱动不需要任何Xorg服务器配置文件。您可以启动X来检验没有配置文件的Xorg能否正确运行。但是，您可能需要创建配置文件（优先创建`/etc/X11/xorg.conf.d/20-nvidia.conf`而不是`/etc/X11/xorg.conf`）来调整Xorg运行时的一些设置。您可以用NVIDIA Xorg配置工具来生成配置，也可以手动创建它。假如是手动创建的话，它可以是一个最小配置文件(也就是意味着它仅仅把一些基础的选项传给Xorg服务器)，也可以是包含大量的绕开Xorg自动发现与预配置选项的设置的文件。

提示： 更多配置项相关内容参见NVIDIA/Troubleshooting。

### 自动配置

英伟达的软件包已经包含一个自动配置的工具来帮助您创建Xorg服务器配置文件(`xorg.conf`)。您可以通过运行下面的命令来实现自动配置：

    # nvidia-xconfig

该命令会自动检测并根据现有硬件的情况创建（或修改）`/etc/X11/xorg.conf`。如果配置文件中存在DRI的话，请把它们注释掉：

    #    Load        "dri"

再一次检查您的配置文件`/etc/X11/xorg.conf`中的默认色深、水平同步、垂直刷新和分辨率是否正确。

### nvidia-settings

nvidia-settings工具可以让你通过CLI或者图形界面配置很多选项。无参数运行`nvidia-settings`会启动图形界面版本的配置工具，而CLI选项参见nvidia-settings(1)。

你可以以非root用户身份使用CLI/图形界面配置工具，并把设置保存到`~/.nvidia-settings-rc`或使用Save to X configuration File按钮来保存到xorg.conf（用于多用户环境）。

通过以下命令来为当前用户加载`~/.nvidia-settings-rc`：

    $ nvidia-settings --load-config-only

参见Autostarting来在每次开机的时候自动执行此命令。

注意： 在保存了`nvidia-settings`的设置变更之后，Xorg 可能会无法启动或者启动时崩溃。修改或者删掉生成的`~/.nvidia-settings-rc`及（或）Xorg文件可能能够恢复正常启动。

### 手动配置

有些调整项（无法通过#自动配置或#nvidia-settings自动启用）可以通过修改你的配置文件来进行配置。Xorg服务器需要重新启动以应用这些配置。

参见NVIDIA Accelerated Linux Graphics Driver README and Installation Guide来了解更多细节及选项。

#### 最小配置模式

用root用户创建一个配置文件`20-nvidia.conf`(或 `/etc/X11/xorg.conf`)：

    /etc/X11/xorg.conf.d/20-nvidia.conf

    Section "Device"
       Identifier     "Device0"
       Driver         "nvidia"
       VendorName     "NVIDIA Corporation"
    EndSection

提示： 假如您已经预先安装了开源驱动nouveau，请确定已经从`/etc/mkinitcpio.conf`里面去除"nouveau"。您也可以通过使用这些脚本[损坏的链接：无效的章节]来在开源和闭源驱动之间进行切换。

#### 关闭启动时的Logo

添加`"NoLogo"`选项到`Device`节里：

    Option "NoLogo" "1"

#### 覆盖显示器侦测

`Device`节下面的`"ConnectedMonitor"`选项允许您覆盖X服务器在启动时的显示器侦测过程，这可能有助于在启动时节约大量时间。可用的选项包括：`"CRT"`用于模拟信号连接，`"DFP"`用于数字显示器，`"TV"`用于电视。

下面的例子是强制英伟达的驱动绕开启动检测并且强制把显示器识别为DFP：

    Option "ConnectedMonitor" "DFP"

注意： "CRT"适用于所有传输模拟信号的15 pin VGA连接器，包括平板显示器上的VGA接口。"DFP"仅适用于DVI、HDMI和DisplayPort等数字信号连接器。

#### 启用亮度控制

添加内核参数：

    nvidia.NVreg_RegistryDwords=EnableBrightnessControl=1

或者，在`Device`节下添加:

    Option "RegistryDwords" "EnableBrightnessControl=1"

如果亮度控制依旧无法生效，请尝试安装nvidia-bl-dkmsAUR。

注意： 安装 nvidia-bl-dkmsAUR 会提供 `/sys/class/backlight/nvidia_backlight/` 接口以用于背光亮度控制，但是你的系统可能会继续发送亮度调整信号到 `/sys/class/backlight/acpi_video0/`。 解决方案之一是监视文件变化，例如为 `acpi_video0/brightness` 添加 inotifywait 并将变化翻译并写入 `nvidia_backlight/brightness`。 参见 Backlight#sysfs modified but no brightness change.

#### 启用SLI

警告： 自GTX 10xx系列（1080、1070、1060等等）开始，仅2路SLI是受支持的。3路或4路SLI或许能够在CUDA/OpenCL应用上使用，但是会让几乎所有OpenGL应用崩溃。

根据英伟达驱动的README 附录B: 这个选项可以在支持的配置中控制 SLI 渲染的相关配置。一个支持的配置是指有一块SLI认证的主板以及2或者3个SLI认证的GeForce GPU的计算机。

您可以用`lspci`查找第一个GPU的PCI总线ID：

    # lspci | grep "VGA|3D controller"

    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"

注意： 这个格式很重要。BusID的值必须指定为`"PCI:<BusID>:0:0"`的格式。

根据需要的SLI渲染模式来添加值到`Screen`节下面：

    Option "SLI" "AA"

下表列出了可用的渲染模式。

Value | Behavior
--- | ---
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.

警告： 启用SLI之后，你的系统可能会在启动xorg的时候假死、没有反应。建议你在重启之前禁用你的显示管理器。

如果这个配置没有效果，你可能需要使用 `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 (简体中文)以获取更多信息。

#### TwinView

若你想用一个大屏幕,而不是两个屏幕.将`TwinView`设为`1`.

如果想要拼接应该使用此方法而不是上面的Xinerama

    Option "TwinView" "1"

##### Vertical sync using TwinView

If you are using TwinView and vertical sync (the "Sync to VBlank" option in nvidia-settings), you will notice that only one screen is being properly synced, unless you have two identical monitors. Although nvidia-settings does offer an option to change which screen is being synced (the "Sync to this display device" option), this does not always work. A solution is to add the following environment variables at startup, for example append in `/etc/profile`:

    export __GL_SYNC_TO_VBLANK=1
    export __GL_SYNC_DISPLAY_DEVICE=DFP-0
    export VDPAU_NVIDIA_SYNC_DISPLAY_DEVICE=DFP-0

You can change `DFP-0` with your preferred screen (`DFP-0` is the DVI port and `CRT-0` is the VGA port). You can find the identifier for your display from nvidia-settings in the "X Server XVideoSettings" section.

##### Gaming using TwinView

In case you want to play fullscreen games when using TwinView, you will notice that games recognize the two screens as being one big screen. While this is technically correct (the virtual X screen really is the size of your screens combined), you probably do not want to play on both screens at the same time.

To correct this behavior for SDL, try:

    export SDL_VIDEO_FULLSCREEN_HEAD=1

For OpenGL, add the appropriate Metamodes to your xorg.conf in section `Device` and restart X:

    Option "Metamodes" "1680x1050,1680x1050; 1280x1024,1280x1024; 1680x1050,NULL; 1280x1024,NULL;"

Another method that may either work alone or in conjunction with those mentioned above is starting games in a separate X server.

#### 使用 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=前面保存的内容"`。

提示： 你可以为你所使用的不同显示器及分辨率配置创建shell别名。

#### ConnectedMonitor

If the driver does not properly detect a second monitor, you can force it to do so with 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

The duplicated device with `Screen` is how you get X to use two monitors on one card without `TwinView`. Note that `nvidia-settings` will strip out any `ConnectedMonitor` options you have added.

#### Mosaic mode

Mosaic mode is the only way to use more than 2 monitors across multiple graphics cards with compositing. Your window manager may or may not recognize the distinction between each monitor. Mosaic mode requires a valid SLI configuration. Even if using Base mode without SLI, the GPUs must still be SLI capable/compatible.

##### Base Mosaic

Base Mosaic mode works on any set of Geforce 8000 series or higher GPUs. It cannot be enabled from within the nvidia-setting GUI. You must either use the `nvidia-xconfig` command line program or edit `xorg.conf` by hand. Metamodes must be specified. The following is an example for four DFPs in a 2x2 configuration, each running at 1920x1024, with two DFPs connected to two cards:

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

注意： While the documentation lists a 2x2 configuration of monitors, GeForce cards are artificially limited to 3 monitors in Base Mosaic mode. Quadro cards support more than 3 monitors. As of September 2014, the Windows driver has dropped this artificial restriction, but it remains in the Linux driver.

##### SLI Mosaic

If you have an SLI configuration and each GPU is a Quadro FX 5800, Quadro Fermi or newer then you can use SLI Mosaic mode. It can be enabled from within the nvidia-settings GUI or from the command line with:

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

## Wayland

For now only a few Wayland compositors support NVIDIA's buffer API, see Wayland#Requirements for more information.

For further configuration options, take a look at the wiki pages or documentation of the respective compositor.

Regarding XWayland take a look at Wayland#XWayland.

## 提示与技巧

参见 NVIDIA/Tips and tricks.

## 故障排除

参见 NVIDIA/Troubleshooting.

## 一些额外的链接

- Current graphics driver releases in official Nvidia Forum
- NVIDIA Developers Forum - Linux Subforum

Categories:

- Graphics (简体中文)
- X server (简体中文)

Hidden category:

- Pages with broken section links