跳转到内容
来自 Arch Linux 中文维基

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

原因:
  • 明确哪些内容特定于 X,哪些内容可用于 Wayland。
  • 删除剩余的“Intel”提及,改为“集成”:Optimus 也适用于 AMD 集成显卡。
(在 Talk:NVIDIA Optimus 中讨论)

NVIDIA Optimus 是一项允许集成图形处理器(GPU)和英伟达(NVIDIA)独立图形处理器置入并通过一台笔记本电脑访问的技术。作为前提条件,请为两张显卡安装相关的 GPU 驱动

可用方法

这里有几种可行的方法:

  • #仅使用集成显卡 - 能节约用电,因为此时英伟达 GPU 是完全关闭(不通电)的。
  • #仅使用英伟达显卡 - 能比集成显卡提供更强的性能表现,但是更耗电(这对移动设备不太友好)。此方法和 optimus-manager 以及 nvidia-xrun 两者一样采用了相同的底层处理,所以在选用一种更自动化的方法之前,应该先利用这个方法来排除故障和验证一些常规功能。
  • 两者兼用 (在需要的时候使用英伟达 GPU,其他时候关闭它以节省电量):
    • #使用 PRIME 渲染分载(render offload) - 英伟达官方支持方法。
    • #使用 optimus-manager - 用一个简单的命令切换显卡(需要注销重新登录来生效)。还支持与 PRIME 渲染分载的混合模式。这可实现需要时使用英伟达 GPU 达到最大性能,不用时则将后者关闭。自 1.4 版本起,还支持 AMD+NVIDIA 组合。
    • #使用 nvidia-xrun - 使用英伟达显卡在另外的 TTY 上运行单独的 X 会话。这可实现需要时使用英伟达 GPU 达到最大性能,不用时则将后者关闭。
    • #使用大黄蜂(Bumblebee) - 提供了与 Windows 下相似的功能,可以选择需要的程序使用英伟达显卡,而其他的程序则用集成显卡运行。不过大黄蜂有重大的性能问题。
    • #使用 switcheroo-control - 类似于大黄蜂,但专为 GNOME 用户设计。允许应用程序在其桌面项文件中指定是否偏好使用独立显卡,并允许你从右键菜单中手动选择在英伟达 GPU 上运行任意应用程序。
    • #使用 nouveau - (与英伟达官方提供的专有驱动相比)提供的性能较差,而且可能导致睡眠和休眠问题。不适用于最新的英伟达 GPU。
    • #使用 EnvyControl - 类似于 optimus-manager,但不需要复杂的配置或后台运行守护进程,如果你是 GNOME 用户,也不需要安装修补版的 GDM。
    • #使用 NVidia-eXec - 类似于大黄蜂,但没有性能影响。它适用于 Xorg 和 Wayland。这个包是实验性的,目前仅在 GNOME/GDM 下进行测试。
    • #使用 nvidia-switch - 类似于 nvidia-xrun,但不需要切换 TTY,切换将通过登录和注销在显示管理器中完成。这个包在基于 Debian 的系统上进行测试,但像 nvidia-xrun 一样,它应该可以在所有 Linux 系统上工作。
注意:所有这些方法选择都是互斥的,如果测试了一种方法后又决定使用另一种方法,则必须确保在尝试另一种方法之前,还原通过遵循前一种方法所做的所有配置更改,否则可能会发生文件冲突和不定行为。

仅使用集成显卡

如果你只想使用某个特定的GPU而不进行切换,请检查你系统BIOS中的选项。应该有一个选项可以禁用其中一个显卡。有些笔记本电脑只允许禁用独立显卡,或者反之,但如果你只计划使用其中一个显卡,值得检查一下。

如果你的BIOS不允许禁用Nvidia显卡,你可以从Linux内核本身禁用它。参见Hybrid graphics#完全关闭独立GPU

在不切换渲染提供程序的情况下使用CUDA

你可以在不将渲染切换到Nvidia显卡的情况下使用CUDA。你只需要确保在启动CUDA应用程序之前Nvidia显卡已通电,详见Hybrid graphics#完全关闭独立GPU

现在,当你启动CUDA应用程序时,它将自动加载所有必要的内核模块。在使用CUDA后关闭Nvidia显卡之前,必须先卸载nvidia内核模块:

# rmmod nvidia_uvm
# rmmod nvidia

仅使用英伟达显卡

专有的英伟达驱动可配置为主渲染提供程序。它也有明显的画面撕裂问题——除非通过启动 NVIDIA#DRM 内核级显示模式设置启用 PRIME Sync,更多信息请参见 [1]。专有驱动确实允许使用独立 GPU,而且(截至 2017 年一月)它相比 nouveau 驱动有更明显的性能优势。

首先,安装英伟达驱动和 xorg-xrandr 软件包。然后,配置 /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf,其中的选项将与软件包提供的 /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf 文件结合提供与此配置的兼容性。

注意:在一些配置上,此配置会使英伟达驱动无法通过 EDID 文件自动探测显示参数值。解决方案可参考#分辨率和屏幕扫描错误“EDID errors in Xorg.log”
/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection

接下来,依所使用的登录图形的方式不同而有所不同,请按实际情况选择阅读。

startx

请在 ~/.xinitrc 文件的开头处添加下列两行内容:

~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

现在重启以加载驱动,X 服务器也应该启动了。

如果显示 DPI 不正确,请再添加下列一行:

xrandr --dpi 96

如果在启动 X 服务器时出现黑屏,请确保 ~/.xinitrc 文件中的两个 xrandr 命令后面没有“&”符号。如果有“&”号,窗口管理器可能在 xrandr 命令执行完成前就运行了,从而导致了黑屏。

显示管理器

如果打算使用显示管理器,就不是使用 ~/.xinitrc 文件了,而是需要为显示管理器创建或编辑显示配置脚本。

LightDM

LightDM 显示管理器创建/编辑脚本:

/etc/lightdm/display_setup.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

然后赋予脚本可执行权限。

通过编辑 /etc/lightdm/lightdm.conf[Seat:*] 部分配置 LightDM 来运行这个脚本:

# nano /etc/lightdm/lightdm.conf
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

现在重启,然后显示管理器应该能启动了。

SDDM

SDDM 显示管理器创建/编辑脚本(SDDM 是 KDE 的默认显示管理器):

/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

要为 GDM 创建启动脚本,请创建两个新的 .desktop 文件,如下:

/usr/share/gdm/greeter/autostart/optimus.desktop
/etc/xdg/autostart/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

并且请确保 GDM 使用 Xorg 作为后端

检查 3D 设置

可通过安装 mesa-utils 并运行以下命令来检查英伟达显卡是否被使用:

$ glxinfo | grep NVIDIA

更多信息

更多信息请参见英伟达官方网页上的这个主题文章 [2]

使用可切换显卡

使用 PRIME 渲染分载(render offload)

这是 NVIDIA 官方支持可切换显卡的方法。

参见 PRIME#PRIME 渲染分载

使用 nouveau

图形切换参见 PRIME,开源 NVIDIA驱动程序见 nouveau

使用大黄蜂(Bumblebee)

参见 Bumblebee

使用 switcheroo-control

参见 PRIME#GNOME 集成

使用 nvidia-xrun

参见 nvidia-xrun

使用 optimus-manager

参见 Optimus-manager 上游文档。它涵盖了在 Arch Linux 系统中的安装和配置。

使用 EnvyControl

参见 EnvyControl 上游文档。它涵盖了安装和使用说明。

使用 NVidia-eXec

参见 NVidia-eXec 上游文档。它涵盖了安装和使用说明。

使用 nvidia-switch

参见 nvidia-switch 上游文档。它涵盖了安装和使用说明。

疑难解答

垂直同步撕裂

开启 DRM 内核级显示模式设置,这将启用 PRIME 同步并修复撕裂问题。

官方论坛查看详细信息:forum thread

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

添加 rcutree.gp_init_delay=1 到内核参数。原始话题见 [3][4]

分辨率和屏幕扫描错误“EDID errors in Xorg.log”

这是由于 NVIDIA 的驱动程序没有检测显示器的 EDID。你需要手动指定路径的 EDID 文件或以类似的方式提供相同的信息。

增加这些线路和变化部分反映你自己的系统:

/etc/X11/xorg.conf
Section "Device"
       	Option		"ConnectedMonitor" "CRT-0"
       	Option		"CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
	Option		"IgnoreEDID" "false"
	Option		"UseEDID" "true"
EndSection

如果 Xorg 不会启动,尝试将所有 CRT 替换为 DFB。card0 是标识为英特尔卡,显示器通过 LVDS 连接。EDID 二进制文件位于此目录。如果硬件配置不同,CustomEDID 的值可能有所不同,但这已得到证实。不管怎样,路径都将从 /sys/class/drm 开始。

或者你可以使用工具如 read-edid 生成你的 EDID,并将驱动指向此文件。也可以使用 modelines,但是务必要修改 UseEDIDIgnoreEDID

无 EDID 错误的分辨率问题

使用 nvidia-xconfig 时,可能会在 xorg.conf 中生成错误的信息,特别是错误的显示器刷新率,限制了可能的分辨率。尝试注释掉 HorizSync/VertRefresh 行。如果这有帮助,你可能还可以删除本文中未提及的其他内容。

锁定问题(lspci 挂起)

问题:lspci 挂起,系统暂停失败,关机时挂起,optirun 挂起。多出现在新的笔记本电脑或使用了类似 bbswitch GTX 的 965m 时(例如 bumblebee)以及 nouveau 的情况。

当独立显卡接通电源,可能出现这种情况,参见 (kernel bug 156341)。

具体解决方法参见 this issue。 你可以添加 acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009"内核参数中。

笔记本电脑未发现屏幕/NVIDIA Optimus

检查输出是否类似:

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)

NVIDIA 驱动自 319.12 Beta [5] 起已经包含在内核(版本 3.9 级以上)中。

另一个解决方案是安装 Intel 驱动进行显示,如果需要运行 3D 软件,可以使用 Bumblebee 来使用 NVIDIA 显卡。

随机冻结 "(EE) NVIDIA(GPU-0): WAIT"

在使用集成 AMD 卡和专用 NVIDIA 卡的设置上使用专有驱动时,用户报告冻结长达 10 秒,Xorg 日志中出现以下错误:

[   219.796] (EE) NVIDIA(GPU-0): WAIT (2, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)
[   226.796] (EE) NVIDIA(GPU-0): WAIT (1, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)

虽然尚未找到根本原因,但似乎与集成卡和专用卡与 Xorg 的交互方式冲突有关。

解决方法是使用可切换显卡,详见 PRIME#PRIME render offload

使用 optimus-manager 时出现 "No Devices detected"

在某些情况下,lspci 会将 PCI 域作为第一列输出,导致 optimus-manager 生成的文件在尝试映射 BusID 时在多款笔记本电脑上出现问题。

如果你遇到黑屏、GUI 部分加载或 Xorg 崩溃并显示 (EE) - No Devices detected,解决方法和错误报告可在 上游 GitHub 找到。

Xorg:外部显示器仅在鼠标移动时更新

解决方法是卸载 iGPU 的 Xorg 驱动(例如 xf86-video-amdgpuxf86-video-intel[6]。只要外部显示器端口(HDMI/DP/USB-C)直接连接到 NVIDIA dGPU,这应该有效。

提示:桌面行为可能会变得不稳定(例如切换虚拟桌面或 Alt-Tab 时外部显示器图像冻结),也可以通过禁用笔记本电脑的显示器来解决。

低功耗(TDP)

自 530.41 驱动版本以来,出现了显卡锁定在低功耗限制的情况(参见 GitHub issue 483)。NVIDIA 驱动已禁用使用 nvidia-smi 命令手动设置功耗限制的功能,因此许多笔记本电脑被锁定在低功耗和性能不佳的状态。

要解决此问题(适用于 Ampere 代或更新),启动/启用 nvidia-powerd.service,这将启用 DynamicBoost

NVIDIA GPU 无法关闭或保持停用状态

某些进程可能会由于它们与 GPU 的交互方式而保持你的 NVIDIA GPU 处于活动状态。这会导致功耗显著增加、电池寿命缩短和温度升高。

你可以通过运行以下命令检查你的 GPU 是否处于活动状态或已挂起:

$ cat /sys/bus/pci/devices/0000\:01\:00.0/power/runtime_status

如果状态为 active,你可能正在运行一个保持 GPU 活动的进程。

如果你使用一个探测 GPU 温度的温度监控器,它通常会调用 nvidia-smi 来获取此温度,这将唤醒你的 GPU 并保持其处于活动状态。

你可以使用 nvtop 检查是否有进程(如 Xorg)正在使用 NVIDIA GPU,但此方法并非在所有情况下都有效。例如,如果你运行 ollama 服务器,它将始终保持你的 GPU 处于活动状态,但不会显示在 nvtop 或调用 nvidia-smi 中。

记得检查与你选择的故障排除方法相关的文章。