跳转至内容

Bumblebee

来自 ArchWiki

来自Bumblebee的FAQ

Bumblebee是一项旨在使NVIDIA Optimus笔记本电脑在GNU/Linux系统中正常工作的项目。该功能涉及两种具有不同功耗配置的显卡,以分层方式连接,共享一个帧缓冲区。
  • Bumblebee存在严重的性能问题[1][2]。请参阅NVIDIA Optimus以获取替代解决方案。
  • NVIDIA已在其Linux驱动中实现了PRIME,这使得Bumblebee及替代方案已过时。

Bumblebee: Linux上的Optimus

Optimus技术是一种混合显卡实现,没有硬件复用器。集成GPU管理显示,而独立GPU处理最耗费资源的渲染,并将工作提交给集成GPU显示。当笔记本电脑使用电池供电时,独立GPU会关闭以节省电力并延长电池寿命。它也已成功与使用Intel集成显卡和NVIDIA独立显卡的台式机进行了测试。

Bumblebee是一个包含两部分的软件实现

  • 在独立显卡上离屏渲染程序,并使用集成显卡将其显示在屏幕上。这个桥接由VirtualGL或primus (稍后阅读) 提供,并连接到一个为独立显卡启动的X服务器。
  • 当独立显卡不使用时将其关闭(参见#电源管理部分)

它试图模仿Optimus技术的行为;在需要时使用独立GPU进行渲染,并在不使用时将其关闭。当前版本仅支持按需渲染,不实现基于工作负载的自动启动程序与独立显卡。

安装

在安装Bumblebee之前,请检查您的BIOS并尽可能激活Optimus(较旧的笔记本电脑称之为“可切换显卡”)(BIOS不一定提供此选项)。如果BIOS中没有“Optimus”或“可切换”选项,请确保同时启用两个GPU,并且集成显卡(igfx)是初始显示(主显示)。显示器应连接到集成显卡,而不是独立显卡。如果之前禁用了集成显卡并安装了独立显卡驱动,请确保删除/etc/X11/xorg.conf/etc/X11/xorg.conf.d中与独立显卡相关的配置文件。

安装:

为了支持32位应用程序,请启用multilib仓库并安装

为了使用Bumblebee,必须将您的常规*用户*添加到bumblebee

# gpasswd -a user bumblebee

同时启用bumblebeed.service。重启您的系统并遵循#用法

  • bumblebee软件包将安装一个内核模块黑名单文件,阻止nvidia-drm模块在启动时加载。如果您以后切换到其他解决方案,请记住卸载此文件。
  • 该软件包不会黑名单nvidiafb模块。您可能没有安装它,因为默认内核不包含它。但是,对于其他内核,您也必须明确将其黑名单,否则*optirun*和*primusrun*将无法运行。请参阅FS#69018

用法

测试

安装mesa-utils并使用glxgears测试Bumblebee是否在您的Optimus系统上工作

$ optirun glxgears -info

如果失败,请尝试以下命令(来自virtualgl

$ optirun glxspheres64

如果带有动画的窗口出现,则表示Optimus与Bumblebee正在工作。

注意 如果glxgears失败,但glxspheres64成功,请始终在所有情况下将glxgears替换为glxspheres64

通用用法

$ optirun [options] application [application-parameters]

例如,使用Optimus启动Windows应用程序

$ optirun wine application.exe

另一个例子,使用Optimus打开NVIDIA设置面板

$ optirun -b none nvidia-settings -c :8
注意 nvdockAUR的补丁版本可在nvdock-bumblebeeAUR软件包中找到。

有关所有可用选项的列表,请参阅optirun(1)

配置

您可以配置Bumblebee的行为以满足您的需求。速度优化、电源管理和其他功能的精细调整可以在/etc/bumblebee/bumblebee.conf中配置

优化速度

离屏渲染方法的一个缺点是性能。下表是对Lenovo ThinkPad T480在eGPU设置中使用NVIDIA GTX 1060 6GB和unigine-heavenAUR基准测试(1920x1080,最高设置,8x AA)的原始概述

命令 显示 FPS 分数 最低FPS 最高FPS
optirun unigine-heaven 内置 20.7 521 6.9 26.6
primusrun unigine-heaven 内置 36.9 930 15.3 44.1
unigine-heaven Nvidia-xrun中内部 51.3 1293 8.4 95.6
unigine-heaven Nvidia-xrun中外部 56.1 1414 8.4 111.9

使用VirtualGL作为桥接

Bumblebee在不可见的X服务器中使用VirtualGL为您的Optimus NVIDIA卡渲染帧,并将它们传输回您的可见X服务器。帧将在传输前被压缩——这可以节省带宽并用于加速Bumblebee的优化

要为单个应用程序使用另一种压缩方法

$ optirun -c compress-method application

压缩方法将影响GPU/CPU使用率的性能。压缩方法主要加载CPU。然而,未压缩方法主要加载GPU。

压缩方法

  • jpeg
  • rgb
  • yuv

未压缩方法

  • proxy
  • xv

这是使用ASUS N550JV笔记本电脑和基准测试应用程序unigine-heavenAUR测试的性能表

命令 FPS 分数 最低FPS 最高FPS
optirun unigine-heaven 25.0 630 16.4 36.1
optirun -c jpeg unigine-heaven 24.2 610 9.5 36.8
optirun -c rgb unigine-heaven 25.1 632 16.6 35.5
optirun -c yuv unigine-heaven 24.9 626 16.5 35.8
optirun -c proxy unigine-heaven 25.0 629 16.0 36.1
optirun -c xv unigine-heaven 22.9 577 15.4 32.2
注意 使用jpeg压缩方法时出现延迟峰值。

要在/etc/bumblebee/bumblebee.conf中为所有应用程序设置标准压缩,请将VGLTransport设置为compress-method

/etc/bumblebee/bumblebee.conf
[...]
[optirun]
VGLTransport=proxy
[...]

您还可以尝试VirtualGL读取显卡像素的方式。将VGL_READBACK 环境变量设置为pbo应该可以提高性能。比较以下

PBO应该更快

VGL_READBACK=pbo optirun glxgears

默认值为sync

VGL_READBACK=sync optirun glxgears
注意 CPU频率缩放将直接影响渲染性能。

Primusrun

注意 由于组合会降低性能,因此不建议在组合WM激活时调用primus。请参阅#Primus在组合窗口管理器下的问题

primusrun(来自primus)正成为默认选择,因为它消耗的功率更少,有时性能比optirun/virtualgl更好。它可以单独运行,但它不接受像optirun这样的选项。将primus设置为optirun的桥接提供了更大的灵活性。

对于64位机器上的32位应用程序支持,请安装lib32-primus(必须启用multilib)。

您可以单独运行它

$ primusrun glxgears

或者作为*optirun*的桥接。默认配置将virtualgl设置为桥接。在命令行中覆盖它

$ optirun -b primus glxgears

或者,在/etc/bumblebee/bumblebee.conf中设置Bridge=primus,这样您就不必在命令行中指定它。

提示 如果您想禁用VSYNC,请参阅#Primusrun鼠标延迟(禁用VSYNC)。它还可以消除鼠标输入延迟,并略微提高性能。

Pvkrun

来自软件包primus_vkpvkrunprimusrun的直接替代品,它允许运行Vulkan应用程序。可以通过vulkan-tools中的vulkaninfo进行快速检查。

$ pvkrun vulkaninfo

电源 management

本文档或章节是合并到Hybrid graphics#使用bbswitch的候选。

注意:本节仅讨论bbswitch,它并非Bumblebee特有。(请在Talk:Bumblebee讨论)

电源管理功能的目标是在NVIDIA卡不再被Bumblebee使用时将其关闭。如果安装了bbswitch(用于linux)或bbswitch-dkms(用于linux-lts或自定义内核),则Bumblebee守护进程启动时会自动检测到它。无需额外配置。但是,bbswitch仅适用于Optimus笔记本电脑,在台式机上无法工作。因此,Bumblebee电源管理不适用于台式机,也没有理由在台式机上安装bbswitch。(尽管如此,Bumblebee的其他功能在某些台式机上仍然可用。)

要手动通过bbswitch打开或关闭显卡,请写入/proc/acpi/bbswitch

# echo OFF > /proc/acpi/bbswitch
# echo ON > /proc/acpi/bbswitch

使用bbswitch设置NVIDIA显卡的默认电源状态

bbswitch的默认行为是保持显卡电源状态不变。bumblebeed在启动时会禁用显卡,所以下面的设置仅在您在没有bumblebeed的情况下使用bbswitch时才需要。

根据您的需求设置load_stateunload_state 内核模块参数(参见bbswitch文档)。

/etc/modprobe.d/bbswitch.conf
options bbswitch load_state=0 unload_state=1

要在系统启动时无bumblebeed运行bbswitch,请不要忘记将bbswitch添加到/etc/modules-load.d,如Kernel module#systemd中所述。

关机时启用NVIDIA显卡

在某些笔记本电脑上,如果系统上次关机时显卡是断电的,NVIDIA显卡在启动时可能无法正确初始化。因此,Bumblebee守护进程会在停止守护进程时(例如关机时)打开GPU,这是因为/etc/bumblebee/bumblebee.conf中(默认)设置了TurnCardOffAtExit=false。请注意,此设置不会影响守护进程运行时 the power state,因此如果所有optirunprimusrun程序已退出,GPU仍将关闭。

当您手动停止守护进程时,您可能希望在关机时保持显卡通电,同时在关机时将其通电。要实现后者,请添加以下systemd服务(如果使用bbswitch

/etc/systemd/system/nvidia-enable.service
[Unit]
Description=Enable NVIDIA card
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo ON > /proc/acpi/bbswitch'

[Install]
WantedBy=shutdown.target

然后启用nvidia-enable.service单元。

从挂起状态恢复后启用NVIDIA显卡

Bumblebee守护进程可能无法在挂起后激活显卡。一个可能的修复方法是将bbswitch设置为电源管理的默认方法

/etc/bumblebee/bumblebee.conf
[driver-nvidia]
PMMethod=bbswitch

[driver-nouveau]
PMMethod=bbswitch
注意 此修复似乎仅在重启系统后才有效。重启bumblebee服务不足以解决问题。

如果上述修复失败,请尝试以下命令

# echo 1 > /sys/bus/pci/rescan

为了在挂起后自动重新扫描PCI总线,请创建一个脚本,如Power management/Suspend and hibernate#Hooks in /usr/lib/systemd/system-sleep中所述。

多显示器

连接到Intel芯片的输出

如果端口(DisplayPort/HDMI/VGA)连接到Intel芯片,您可以使用xorg.conf设置多个显示器。将它们设置为使用Intel显卡,但Bumblebee仍可使用NVIDIA显卡。以下是一个示例配置,用于两个相同的1080p分辨率屏幕,并使用HDMI输出。

/etc/X11/xorg.conf
Section "Screen"
    Identifier     "Screen0"
    Device         "intelgpu0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "0"
    SubSection "Display"
        Depth          24
        Modes          "1920x1080_60.00"
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "intelgpu1"
    Monitor        "Monitor1"
    DefaultDepth   24
    Option         "TwinView" "0"
    SubSection "Display"
        Depth          24
        Modes          "1920x1080_60.00"
    EndSubSection
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    Option         "Enable" "true"
EndSection

Section "Monitor"
    Identifier     "Monitor1"
    Option         "Enable" "true"
EndSection

Section "Device"
    Identifier     "intelgpu0"
    Driver         "intel"
    Option         "UseEvents" "true"
    Option         "AccelMethod" "UXA"
    BusID          "PCI:0:2:0"
EndSection

Section "Device"
    Identifier     "intelgpu1"
    Driver         "intel"
    Option         "UseEvents" "true"
    Option         "AccelMethod" "UXA"
    BusID          "PCI:0:2:0"
EndSection

Section "Device"
    Identifier     "nvidiagpu1"
    Driver         "nvidia"
    BusID          "PCI:0:1:0"
EndSection

您可能需要更改Intel和NVIDIA显卡的BusID。

$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller [8086:0126] (rev 09)

BusID是0:2:0。请注意,*lspci*输出的是十六进制值,而Xorg期望的是十进制值。

连接到NVIDIA芯片的输出

在某些笔记本上,数字视频输出(HDMI或DisplayPort)硬连接到NVIDIA芯片。如果您想在这样的系统上同时使用所有显示器,最简单的解决方案是使用intel-virtual-output,这是xf86-video-intel驱动程序集(版本2.99及更高版本)提供的一个工具。它允许您将现有的X会话扩展到其他屏幕,利用虚拟输出来与独立显卡配合使用。用法如下:

$ intel-virtual-output [OPTION]... [TARGET_DISPLAY]...
-d <source display>  source display
-f                   keep in foreground (do not detach from console and daemonize)
-b                   start bumblebee
-a                   connect to all local displays (e.g. :1, :2, etc)
-S                   disable use of a singleton and launch a fresh intel-virtual-output process
-v                   all verbose output, implies -f
-V <category>        specific verbose output, implies -f
-h                   this help

如果仅使用此命令不起作用,您可以尝试使用optirun运行它来启用独立显卡并允许其检测输出。已知这是Lenovo Legion Y720必需的。

$ optirun intel-virtual-output

如果命令行中没有解析到目标显示器,intel-virtual-output将尝试连接到任何本地显示器。检测到的显示器可以通过任何桌面显示管理器(如xrandr或KDE Display)进行管理。该工具还将启动bumblebee(可以保持默认安装)。有关更多信息,请参阅Bumblebee wiki页面

在终端中运行时,intel-virtual-output将自己作为守护进程运行,除非使用了-f开关。游戏可以通过导出显示器export DISPLAY=:8并在然后使用optirun game_bin运行游戏来在外接屏幕上运行,但是,光标和键盘未被完全捕获。使用export DISPLAY=:0恢复到标准操作。

如果intel-virtual-output未检测到显示器,或收到no VIRTUAL outputs on ":0"消息,则创建

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
    Identifier     "intelgpu0"
    Driver         "intel"
EndSection

该文件默认存在,并且

/etc/bumblebee/xorg.conf.nvidia
Section "ServerLayout"
    Identifier     "Layout0"
    Option         "AutoAddDevices" "true"
    Option         "AutoAddGPU" "false"
EndSection

Section "Device"
    Identifier     "DiscreteNvidia"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option         "ProbeAllGpus" "false"
    Option         "NoLogo" "true"
    Option         "UseEDID" "true"
    Option         "AllowEmptyInitialConfiguration"
#    Option         "UseDisplayDevice" "none"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "DiscreteNvidia"
EndSection

有关更多配置尝试,请参阅[3]。如果笔记本屏幕被拉伸且光标错位,而外接显示器仅显示光标,请尝试终止任何正在运行的组合管理器。

如果您不想使用intel-virtual-output,另一个选择是配置Bumblebee以保持独立GPU开启,并直接配置X以同时使用两个屏幕,因为它能够检测它们。

作为最后的手段,您可以运行2个X服务器。第一个将使用Intel驱动程序来驱动笔记本电脑屏幕。第二个将通过optirun在NVIDIA卡上启动,以显示在外接显示器上。确保在手动使用optirun启动桌面环境之前禁用任何显示/会话管理器。然后,您可以登录到集成显卡驱动的那个。

禁用屏幕空白

您可以使用xset在与intel-virtual-output一起使用时禁用屏幕空白,方法是适当设置DISPLAY环境变量(有关更多信息,请参阅DPMS

$ DISPLAY=:8 xset -dpms s off

多块NVIDIA显卡或NVIDIA Optimus

如果您有多块NVIDIA显卡(例如,将eGPU与带有内置NVIDIA显卡的笔记本电脑一起使用)或NVIDIA Optimus,您需要对/etc/bumblebee/xorg.conf.nvidia进行一个小修改。如果不进行此更改,守护进程可能会默认使用内部NVIDIA卡。

首先,确定外部显卡的BusID

$ lspci -ndd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation HD Graphics 530 [8086:191b] (rev 06) (prog-if 00 [VGA controller])
01:00.0 3D controller [0302]: NVIDIA Corporation GM107M [GeForce GTX 960M] [10de:139b] (rev ff) (prog-if ff)
0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070] [10de:1b81] (rev a1)

在这种情况下,BusID是0b:00.0

现在编辑/etc/bumblebee/xorg.conf.nvidia并在Section "Device"中添加以下行

/etc/bumblebee/xorg.conf.nvidia
Section "Device"
    ...
    BusID          "PCI:11:00:0"
    Option         "AllowExternalGpus" "true"  # If the GPU is external
    ...
EndSection
注意 注意,十六进制0b变成了十进制11

故障排除

注意 请在Bumblebee-Project的GitHub跟踪器上报告错误,如其wiki中所述。

[VGL] 错误:无法打开显示屏 :8

某些wine应用程序存在一个已知问题,它们会fork并终止父进程而不对其进行跟踪(例如,免费在线游戏“Runes of Magic”)。

这是VirtualGL的一个已知问题。从bumblebee 3.1开始,只要您安装了它,就可以使用Primus作为您的渲染桥接

$ optirun -b primus wine windows program.exe

如果这不起作用,此问题的替代解决方法是

$ optirun bash
$ optirun wine windows program.exe

如果使用NVIDIA驱动程序,此问题的修复方法是编辑/etc/bumblebee/xorg.conf.nvidia并将Option ConnectedMonitor更改为CRT-0

Xlib:缺少显示屏 ":0.0" 上的扩展 "GLX"

如果您尝试从NVIDIA网站安装NVIDIA驱动程序,这将不起作用。

  1. 以类似的方式卸载该驱动程序
    # ./NVIDIA-Linux-*.run --uninstall
  2. 删除NVIDIA生成的Xorg配置文件
    # rm /etc/X11/xorg.conf
  3. (重新)安装正确的NVIDIA驱动程序:参见#安装

[错误] 无法访问次要GPU:未检测到设备

在某些情况下,运行optirun会返回

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected.
[ERROR]Aborting because fallback start is disabled.

在这种情况下,您需要将文件/etc/X11/xorg.conf.d/20-intel.conf移动到其他位置,重启bumblebeed守护进程,它应该就能工作。如果您确实需要更改Intel模块的某些功能,一种解决方法是将/etc/X11/xorg.conf.d/20-intel.conf合并到/etc/X11/xorg.conf

也可能需要注释掉/etc/X11/xorg.conf.d/10-monitor.conf中的driver行。

如果您使用的是nouveau驱动程序,您可以尝试切换到NVIDIA驱动程序。

您可能需要在某处定义NVIDIA卡(例如,文件/etc/bumblebee/xorg.conf.nvidia),使用根据lspci输出的正确BusID

Section "Device"
    Identifier     "nvidiagpu1"
    Driver         "nvidia"
    BusID          "PCI:0:1:0"
EndSection

请注意,lspci的格式是十六进制,而xorg是十进制。因此,如果lspci的输出是,例如,0a:00.0,则BusID应该是PCI:10:0:0

NVIDIA(0):无法将任何连接的显示设备分配给X屏幕0

如果控制台输出是

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) NVIDIA(0): Failed to assign any connected display devices to X screen 0
[ERROR]Aborting because fallback start is disabled.

如果/etc/bumblebee/xorg.conf.nvidia中的以下行不存在,您可以将其添加到“Device”节

Option "ConnectedMonitor" "DFP"

如果它已经存在,您可以尝试将其更改为

Option "ConnectedMonitor" "CRT"

之后,重启Bumblebee服务以应用这些更改。

初始化PCI上的NVIDIA GPU失败:1:0:0 (GPU已从总线移除 / RmInitAdapter 失败!)

rcutree.rcu_idle_gp_delay=1添加到内核参数引导加载程序配置中(另请参见原始BBS帖子以获取配置示例)。

初始化PCI上的NVIDIA GPU失败:1:0:0 (Bumblebee守护进程报告:错误:[XORG] (EE) NVIDIA(GPU-0))

您可能会遇到一个问题,即在从睡眠恢复后,primusrunoptirun命令不再工作。有两种方法可以解决此问题 - 重启系统或执行以下命令

# echo 1 > /sys/bus/pci/rescan

然后尝试测试primusrunoptirun是否工作。

如果上述命令无效,请尝试查找您的NVIDIA卡的总线ID

$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation Core Processor Integrated Graphics Controller [8086:0042] 
(rev 18)
01:00.0 VGA compatible controller [0300]: nVidia Corporation Device 0df4 [10de:0df4] (rev a1)

例如,上面的命令显示01:00.0,所以我们使用以下命令和这个总线ID

# echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
# echo 1 > /sys/bus/pci/rescan

无法加载GPU驱动

如果控制台输出是

[ERROR]Cannot access secondary GPU - error: Could not load GPU driver

如果您尝试加载nvidia模块

# modprobe nvidia
modprobe: ERROR: could not insert 'nvidia': Exec format error

这可能是因为nvidia驱动程序与Linux内核不同步,例如,如果您安装了最新的NVIDIA驱动程序而没有在一段时间内更新内核。执行完整的系统更新,然后重启到更新后的内核。

NOUVEAU(0):[drm] 无法设置drm接口版本

考虑切换到官方NVIDIA驱动程序。正如上游所评论的,nouveau驱动程序在某些显卡和bumblebee方面存在一些问题。

[错误] 无法访问次要GPU - 错误:X未正确启动

/etc/bumblebee/xorg.conf.nvidia 中将 "AutoAddDevices" 选项设置为 "true"(参见 此处

Section "ServerLayout"
    Identifier     "Layout0"
    Option         "AutoAddDevices" "true"
    Option         "AutoAddGPU" "false"
EndSection

/dev/dri/card0: 无法设置 DRM 接口版本 1.4: 权限被拒绝

可以通过在 /etc/bumblebee/xorg.conf.nvidia 中附加以下行来解决此问题(参见 此处

Section "Screen"
    Identifier     "Default Screen"
    Device         "DiscreteNvidia"
EndSection

错误:ld.so:无法预加载 LD_PRELOAD 中的对象“libdlfaker.so”:已忽略

您可能想在 64 位系统上使用 bumblebee 启动 32 位应用程序。请参阅 #Installation 中的“对于 32 位...”部分。如果问题仍然存在,或者这是一个 64 位应用程序,请尝试使用 primus 桥接

X 服务器致命 IO 错误 11(资源暂时不可用)

/etc/bumblebee/bumblebee.conf 中的 KeepUnusedXServerfalse 更改为 true。您的程序会fork到后台,bumblebee对此一无所知。

视频撕裂

视频撕裂是 Bumblebee 上一个比较常见的问题。要解决这个问题,您需要启用垂直同步。它应该在 Intel 显卡上默认启用,但请从 Xorg 日志中验证。要检查 NVIDIA 是否启用了它,请确保安装了 nvidia-settings 并运行

$ optirun nvidia-settings -c :8

X Server XVideo Settings -> Sync to VBlankOpenGL Settings -> Sync to VBlank 都应该被启用。Intel 显卡通常撕裂较少,所以请用它进行视频播放。特别是使用 VA-API 进行视频解码(例如 mplayer-vaapi-vsync 参数)。

有关如何修复 Intel 显卡撕裂的问题,请参阅 Intel graphics#Tearing

如果仍未修复,请尝试禁用桌面环境中的合成器。也请尝试禁用三缓冲。

Bumblebee 无法连接到套接字

您可能会看到类似以下内容

$ optirun glxspheres64

或(对于 32 位)

$ optirun glxspheres32
[ 1648.179533] [ERROR]You have no permission to communicate with the Bumblebee daemon. Try adding yourself to the 'bumblebee' group
[ 1648.179628] [ERROR]Could not connect to bumblebee daemon - is it running?

如果您已在 bumblebee 组中(groups | grep bumblebee),可以尝试 移除套接字 /var/run/bumblebeed.socket

此错误的另一个原因可能是您实际上并未在 BIOS 中开启两个 GPU,因此 Bumblebee 守护进程实际上并未运行。请仔细检查 BIOS 设置,确保 Intel 显卡(集成显卡 - BIOS 中可能缩写为 igfx)已启用或设置为自动,并且它是主 GPU。您的显示器应连接到板载集成显卡,而不是独立显卡。

如果您错误地将显示器连接到独立显卡并且禁用了 Intel 显卡,您可能在尝试单独运行 NVIDIA 之后才安装了 Bumblebee。在这种情况下,请确保删除 /etc/X11/xorg.conf/etc/X11/xorg.conf.d/20-nvidia.conf 配置文件。如果 Xorg 在配置文件中被指示使用 NVIDIA,X 将会失败。

登录后从控制台运行 X.org(无根 X.org)

请参阅 Xorg#Rootless Xorg

使用 Primus 导致段错误

在某些情况下,使用 primusrun 而不是 optirun 会导致段错误。这是由于代码中自动检测更快的上传方法的错误引起的,参见 FS#58933

解决方法是通过将 PRIMUS_UPLOAD 环境变量手动设置为 1 或 2 来跳过自动检测,具体取决于哪种在您的设置上更快。

$ PRIMUS_UPLOAD=1 primusrun ...

Primusrun 鼠标延迟(禁用 VSYNC)

对于 primusrunVSYNC 默认启用,因此可能导致鼠标输入延迟或甚至轻微降低性能。测试禁用 VSYNCprimusrun

$ vblank_mode=0 primusrun glxgears

如果您对以上设置满意,请创建一个 别名(例如 alias primusrun="vblank_mode=0 primusrun")。

性能比较

VSYNC 已启用 FPS 分数 最低FPS 最高FPS
FALSE 31.5 793 22.3 54.8
TRUE 31.4 792 18.7 54.2

使用 ASUS N550JV 笔记本电脑和基准测试应用程序 unigine-heavenAUR 进行测试。

注意 要全局禁用垂直同步,请参阅 Intel graphics#Disable Vertical Synchronization (VSYNC)

合成窗口管理器下的 Primus 问题

由于合成会影响性能,因此不建议在活动合成 WM 时调用 primus。 [4] 如果您需要在合成下使用 primus 并看到闪烁或性能不佳,同步 primus 的显示线程与应用程序的渲染线程可能会有所帮助

$ PRIMUS_SYNC=1 primusrun ...

这使得 primus 显示之前渲染的帧。

从待机恢复后 Bumblebee 的问题

在某些系统中,可能会发生 nvidia 模块在从待机恢复后加载的情况。一种可能的解决方案是安装 acpi_callacpi 包。

Optirun 不工作,没有调试输出

用户报告说,在某些情况下,即使 Bumblebee 已正确安装,运行

$ optirun glxgears -info

也完全没有输出,并且 glxgears 窗口没有出现。任何需要 3D 加速的程序都会崩溃。

$ optirun bash
$ glxgears
Segmentation fault (core dumped)

显然这是 virtualgl 的某些版本中的一个 bug。因此,一种解决方法是改用 #Primusrun。有关更多信息,请参阅 此论坛帖子

内核 4.8 下的电源管理中断

本文档或章节是合并到Hybrid graphics#使用bbswitch的候选。

注意: 将所有关于 bbswitch 的信息放在一起。(在 Talk:Bumblebee 中讨论)

如果您有一台较新的笔记本电脑(BIOS 日期为 2015 年或更新),那么 Linux 4.8 可能会破坏 bbswitch(bbswitch issue 140),因为 bbswitch 不支持较新的、推荐的电源管理方法。结果,GPU 可能无法开机、无法关机,甚至更糟。

作为一种解决方法,将 pcie_port_pm=off 添加到您的 Kernel parameters 中。

或者,如果您只对节能(以及可能使用外部显示器)感兴趣,请移除 bbswitch 并依赖 Nouveau 运行时电源管理(它支持新方法)。

注意 某些工具(如 powertop --auto-tune)会自动为 PCI 设备启用电源管理,这会导致相同的问题 [5]。使用相同的解决方法或不要使用一体化的电源管理工具。

死锁问题(lspci 挂起)

请参阅 NVIDIA Optimus#Lockup issue (lspci hangs),了解影响带有 GTX 965M(或类似)的新笔记本电脑的问题。

独立显卡始终开启和 ACPI 警告

acpi_osi=Linux 添加到您的 Kernel parameters 中。有关更多信息,请参阅 [6][7]

屏幕 0 已删除,因为没有匹配的配置节

修改配置如下

/etc/bumblebee/xorg.conf.nvidia
...
Section "ServerLayout"
...
    Screen 0       "nvidia"
...
EndSection
...
Section "Screen"
    Identifier     "nvidia"
    Device         "DiscreteNvidia"
EndSection
...

行为 erratic、不可预测

如果 Bumblebee 以随机方式启动/工作,请检查您是否已设置 Network configuration#Local network hostname resolution(详情请参见 此处)。

独立显卡始终开启且 NVIDIA 驱动程序无法卸载

确保 nvidia-persistenced.service 已禁用且当前未激活。它的目的是使 NVIDIA 驱动程序始终运行 [8],这会阻止显卡关闭。

当某个应用程序请求 EGL 时,独立显卡会被静默激活

如果独立显卡被某个程序激活(例如,mpv 配合其 GPU 后端),它可能会保持开启状态。问题可能出在 libglvnd,它会加载 NVIDIA 驱动程序并激活显卡。

要禁用此功能,请将环境变量 __EGL_VENDOR_LIBRARY_FILENAMES(参见 文档)设置为仅加载 mesa 配置文件。

__EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/50_mesa.json"

nvidia-utils(及其分支)会将配置文件安装在 /usr/share/glvnd/egl_vendor.d/10_nvidia.json,该文件具有优先权,导致 libglvnd 加载 NVIDIA 驱动程序并激活显卡。

另一个解决方案是 避免安装nvidia-utils 提供的配置文件。

帧率在固定时间后下降到 1 FPS

使用 NVIDIA 440.36 驱动程序时,DPMS 设置默认启用,导致在固定时间段后(例如 10 分钟)超时,从而使帧率降低到 1 FPS。要解决此问题,请将以下行添加到 /etc/bumblebee/xorg.conf.nvidia 的“Device”节中。

Option "HardDPMS" "false"

应用程序无法录制屏幕

使用 Bumblebee 时,应用程序无法访问屏幕以识别和录制屏幕。例如,当使用 obs-studio 并启用 NVENC 时,会发生这种情况。要解决此问题,请使用 optirun -b none command 禁用桥接模式。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.