NVIDIA (简体中文)
本文包含安装和配置 NVIDIA 专有 显卡驱动的信息。想要了解开源驱动的信息,参见 Nouveau.如果您使用基于 hybrid Intel/NVIDIA的双显卡笔记本, 参见 NVIDIA Optimus 内容.
安装
该部分仅适用于 linux 或 linux-lts 内核包,定制内核请略过该小节。
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钩子 来自动化这一步骤。
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自动发现与预配置选项的设置的文件。
自动配置
英伟达的软件包已经包含一个自动配置的工具来帮助您创建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
/etc/mkinitcpio.conf
里面去除"nouveau"。您也可以通过使用这些脚本[损坏的链接:无效的章节]来在开源和闭源驱动之间进行切换。关闭启动时的Logo
添加"NoLogo"
选项到Device
节里:
Option "NoLogo" "1"
覆盖显示器侦测
Device
节下面的"ConnectedMonitor"
选项允许您覆盖X服务器在启动时的显示器侦测过程,这可能有助于在启动时节约大量时间。可用的选项包括:"CRT"
用于模拟信号连接,"DFP"
用于数字显示器,"TV"
用于电视。
下面的例子是强制英伟达的驱动绕开启动检测并且强制把显示器识别为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/
。 解决方案之一是监视文件变化,例如为 acpi_video0/brightness
添加 inotifywait 并将变化翻译并写入 nvidia_backlight/brightness
。 参见 Backlight#sysfs modified but no brightness change.启用SLI
根据英伟达驱动的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"
"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.
如果这个配置没有效果,你可能需要使用 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=前面保存的内容"
。
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"
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.