Bumblebee (简体中文)
"Bumblebee 致力于使 NVIDIA Optimus 在 GNU/Linux 系统上可用,实现两块不同的供电配置的显卡同时插入使用,共享同一个 framebuffer。"
引自 Bumblebee FAQ:
Bumblebee: Linux上的 Optimus
Optimus 技术 是不依赖于硬件复杂结构的 交火显卡 实现。独立显卡按需渲染,并传输给集成显卡,集成显卡则负责显示功能。当笔记本通过电池供电时,独立显卡将关闭,以延长电池寿命。在使用 Intel 集成显卡和 NVIDIA 独立显卡的台式机上也能使用这项技术。
Bumblebee 通过软件来实现它的功能,包括两个部分:
- 利用独立显卡渲染程序,并通过集成显卡将图像显示在屏幕上。这是利用 VirtualGL 或 primus (见后面小节)实现的,相当于连接到了一个供独立显卡使用的 X 服务器。
- 独立显卡空闲的时候会被禁用。(参见 #电源管理 )
Bumblebee 试图模拟 Optimus 技术的行为;当需要的时候,使用独立显卡进行渲染,不使用的时候则关闭。当前的版本仅支持按需渲染,高负荷程序自动调用独立显卡的功能仍然在开发之中。
安装
安装 Bumblebee 之前,检查你的 BIOS 并尽可能激活 Optimus (老式电脑称之为"可切换显卡",BIOS有可能没有提供此项设置)。如果 "Optimus" 和 "switchable" 都没有在BIOS里,就保证两种GPU都已启用并且集成显卡是主要显示设备。显示应该连接在主板上的集成显卡,而不是独立显卡。如果集成显卡之前被禁用而安装了独立显卡的驱动,那就删除 /etc/X11/xorg.conf 或者有关独立显卡的 /etc/X11/xorg.conf.d 中的文件。
安装:
对于32位程序 (必须启用Multilib)在64位机器上的支持,安装:
- - 为32位应用提供的渲染/显示桥。
- 或者 (和64位对应)。
要使用 Bumblebee,请确保添加你的用户到 bumblebee 组:
# gpasswd -a user bumblebee
用法
测试
安装 并使用 glxgears 测试 Bumblebee 是否工作:
$ optirun glxgears -info
如果失败,尝试下列命令:
- 64位系统:
$ optirun glxspheres64
- 32位系统:
$ optirun glxspheres32
如果一个内有动画的窗口出现,那么 Optimus 和 Bumblebee 正在工作。
一般用法
$ optirun [options] application [application-parameters]
例如,用 Optimus 启动 Windows 程序:
$ optirun wine application.exe
另外,用 Optimus 打开 NVIDIA 设置面板:
$ optirun -b none nvidia-settings -c :8
更多 的选项参见手册页:
$ man optirun
配置
你可以按需配置 Bumblebee 的行为,可以通过 来调节诸如优化,电源管理,以及其他任务。
使用VirtualGL作为桥接
Bumblebee 使用你的 Optimus NVIDIA 显卡来渲染一个配置了 VirtualGL 的不可见的 X 服务器,并且将结果传输到你当前的 X 服务器上。传输之前将压缩侦,这可以节省带宽并且能够用于加速 bumblebee 的优化。
要为单个应用程序指定不同的压缩方法:
$ optirun -c compress-method application
压缩方法会影响 GPU性能和GPU使用,压缩方法会最大限度的使用 CPU,并且尽可能少的使用 GPU;非压缩的方法最大限度的使用 GPU,而尽可能少的使用 CPU。
压缩方法
rgb
非压缩方法
以下是用 Asus N550JV 笔记本和测试程序 unigine-heavenAUR的性能测试结果:
| Command | FPS | Score | Min FPS | Max 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 |
要为所有应用程序使用一个标准的压缩方法, 在 里把 设为 :
你也可考虑 VirtualGL 从你的显卡读回像素的方式。设置 环境变量为 应该能提升性能。比较以下两者:
# PBO should be faster. VGL_READBACK=pbo optirun glxgears # The default value is sync. VGL_READBACK=sync optirun glxgears
Primusrun
(来自 ) 正成为默认选项,因为其耗电量更低并且有时可以提供比 /更好的性能。它可以独立运行,但不能接受 的选项。将 primus 设置为 的桥接可提供更过的灵活性。
对于64位系统上32位程序的支持,安装 (须启用multilib)。
用法(独立运行):
$ primusrun glxgears
的桥接:
默认的配置将 作为桥接。在命令行上将其覆盖:
$ optirun -b primus glxgears
或者,在 中设置 使其永久生效。
电源管理
电源管理的目的是为了自动关闭 bumblebee 不再使用的 NVIDIA 显卡。 如果已安装 ,Bumblebee 守护进程启动时会自动检测到,不需要特别设置。
使用bbswitch时默认的 NVIDIA 电源状态
bbswitch的默认行为是保持显卡的电源状态。 启动时并不禁用显卡,所以你没有bumblebeed时使用bbswitch需要以下内容。
根据需要设置 和 unload_state 模块选项 (见 bbswitch documentation).
关机时启用NVIDIA显卡
如果上次关机时关闭了NVIDIA显卡的电源,NVIDIA显卡可能会在下一次启动时初始化异常。一个解决的办法是在 里设置 , 然而这么做会导致每次停止bumblebee守护进程时启用NVIDIA显卡,就算是手动停止也是一样。为确保NVIDIA显卡总是在关机时启用,添加如下 systemd 服务(如果使用 的话):
然后以root权限运行 以启用服务。
显示器连接在 Intel 显卡上
如果 (DisplayPort/HDMI/VGA) 接口连接到 Intel 显卡上,你可以通过 xorg.conf 设置多个显示器。设置他们使用 Intel 显卡,同时 Bumblebee 仍然可以使用 NVIDIA 显卡。下面的配置文件示例配置了两个不同的 1080p 的显示器,并且使用了 HDMI 输出。
你可能需要为Intel和NVIDIA显卡调整 BusID 字段的值:
$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
BusID 值为 0:2:0
显示器连接在 NVIDIA 显卡上
在一些笔记本上,数字视频输出(HDMI 或 DisplayPort) 是硬线连接到NVIDIA芯片上的。如果你想同时使用所有的显示器,你需要开两个 X Server.第一个使用Intel驱动用于笔记本面板和连接到VGA上的显示,第二个由optirun启用NVIDIA显卡用于数字显示。
目前网上有一些有关这个的设置教程。其中一个可在Bumblebee的 wiki 页面找到,另一个详见下文。
xf86-video-intel-virtual-crtc 和 hybrid-screenclone
本方法使用了一个打了补丁来扩展为含有一个虚拟显示器的Intel驱动,而hybrid-screenclone程序用于把虚拟显示器的内容复制到通过optirun运行于NVIDIA显卡的第二个X Server上的显示器上。有幸发现 Triple-head monitors on a Thinkpad T520 它是这一切在Ubuntu系统上如何完成的详细解说。
精简起见,下文DP指代 Digital Output (DisplayPort).如果笔记本是HDMI接口的话教程也是一样。
- 设置系统为只使用 NVIDIA 显卡,测试 DP/显示器组合,并生成 xorg.nvidia.conf.这步并非必须但推荐在支持设置为nvidia-only的BIOS上执行。为此,首先卸载 bumblebee 包,并只安装 NVIDIA 驱动。然后重启,进入BIOS设置为NVIDIA-only.重启进入Arch时,把显示器连接到DP并使用 startx 来检测这一切是否正常工作。使用 Xorg -configure 来为你的NVIDIA显卡生成 xorg.conf 文件。这在向下进一步深入时会派上用场。
- 重新安装 bumlbebee 和 bbswitch,重启并在BIOS里设置系统 Gfx 值回到 Hybrid.
- 安装 ,并以它替换掉 xf86-video-intel.
- 安装
- 改变以下 bumblebee.conf 设置:
- 复制在第一步里生成的 xorg.conf 到 (例如 ).在 的[driver-nvidia]部分,修改 为它的路径。
- 测试你的 是否有效
- 为了你的DP显示器在虚拟显示器上以正常分辨率出现,你需要编辑 里的Monitor section.由于这是附加步骤,你仍需要测试你自动生成的 xorg.conf.当发现 xrandr 显示的虚拟显示器分辨率不对后,再回来参考教程里的这条步骤。
- 首先要生成 Modeline.你需要工具 amlc,它用于输入一些基本参数后自动生成 Modeline.
- 例子: 24" 1920x1080 Monitor
- 以 参数启动工具
Monitor Identifier: Samsung 2494 Aspect Ratio: 2 physical size[cm]: 60 Ideal refresh rate, in Hz: 60 min HSync, kHz: 40 max HSync, kHz: 90 min VSync, Hz: 50 max VSync, Hz: 70 max pixel Clock, MHz: 400
这就是 生成的 Monitor Section:
在 里加入这个 Monitor Section.你还可以编辑你的文件使其包含 ServerLayout, Monitor, Device 和 Screen 部分。以下是我的,仅供参考:
- 也要把额外显示器插上之后再 startx.查看 .确保你的VGA显示器以正确的模式被检测出来。你也要看看虚拟输出出现的模式。
- 运行 然后三个显示器以及它们支持的模式都会被列出来。
- 如果对于你的VIRTUAL显示器没有符合你原生分辨率的Modelines输出, 记下输出的名称。对我来说是
VIRTUAL1.然后再看看 Xorg.0.log 文件。你应该会看到一条消息: "Output VIRTUAL1 has no monitor section".我们需要在/etc/X11/xorg.conf.d里放入含有合适 Monitor Section 的文件,稍后退出并重启X.
- 为开启NVIDIA显卡,运行:
- 为 DisplayPort 显示器开启另一个X Server:
sudo optirun true - 检查位于 的第二个 X Server 的日志。
- 运行 xrandr 以把 VIRTUAL 显示器设置成正确的大小和位置,例如:
- 请注意在 xrandr 输出列表中的 VIRTUAL 显示器的位置。计数从零开始,也就是说,如果它给出了第三个显示器,你会指定 作为参数传递给 (注:这可能并不总是正确的。如果你看到内部的笔记本电脑显示屏克隆在监视器上,只管尝试 )。
- 克隆VIRTUAL显示器的内容到由Bumblebee创建的,经由NVIDIA的芯片连接到所述的DisplayPort显示器的X服务器:
这就行了,三个显示器都应该配置好并正常工作。
如 Windows 一般在集显和独显间切换
在 Windows 里,Optimus 的工作方式是NVIDIA有一个请求 Optimus 的程序的白名单,并且你可以按需添加。当你启动程序时,会自动选择使用哪一张显卡。
为了在Linux里模仿这一行为,你可以使用 .安装后,往 .xprofile 里添加:
为此,你需要往你希望启动程序的shell里添加 (我一般就加到 .xprofile 里)
export LD_LIBRARY_PATH=/tmp/libgl-switcheroo-$USER/fs/\$LIB${LD_LIBRARY_PATH+:}$LD_LIBRARY_PATH
全部完成后,你从该shell运行的每一个程序都会弹出一个GTK+窗口询问该使用哪一张卡(你也可以往配置文件的白名单里添加程序)。配置文件位于 $XDG_CONFIG_HOME/libgl-switcheroo.conf, 通常是
疑难问题
[VGL] ERROR: Could not open display :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驱动的话,一个该问题的解决方案是修改 把 Option 改为 CRT-0.
Xlib: extension "GLX" missing on display ":0.0"
从官网下载安装的NVIDIA驱动不会工作。
1. 卸载驱动:
# ./NVIDIA-Linux-*.run --uninstall
2. 删除生成的配置文件:
# rm /etc/X11/xorg.conf
3. 重新从源里安装: #安装
[ERROR]Cannot access secondary GPU: No devices detected
某些情况下,运行 会返回:
[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected. [ERROR]Aborting because fallback start is disabled.
这种情况下,你需要把 移动到别的地方, restart bumblebeed 守护进程,这样应该有效。如果你要改变一些 Intel 模块的特性,把 合并到 /etc/X11/xorg.conf 中。
也需要把 里的driver行注释掉。
如果你正在用 驱动你应该试着换成 驱动。
你需要把 NVIDIA 显卡定位到别的地方 (例如文件 /etc/X11/xorg.conf.d),使用根据 lspci 的输出确定的 :
NVIDIA(0): Failed to assign any connected display devices to X screen 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.
你要修改 里的这行:
Option "ConnectedMonitor" "DFP"
为:
Option "ConnectedMonitor" "CRT"
systemd-logind: failed to get session: PID XXX does not belong to any known session
如果终端输出如下 (PID会有所不同):
[ERROR]Cannot access secondary GPU - error: [XORG] (EE) systemd-logind: failed to get session: PID 753 does not belong to any known session [ERROR]Aborting because fallback start is disabled.
在 /etc/mkinitcpio.conf 里改变 MODULES 为:
MODULES="i915 bbswitch"
或:
MODULES="i915 nouveau bbswitch"
然后运行:
# mkinitcpio -p linux
每次内核更新之后你都要执行一次这个命令。
另外,如下 内核参数需要加到 boot loader配置中。
Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)
把 加到boot loader 配置的内核参数中。 (参考设置另见BBS post )
Could not load GPU driver
如果终端输出如下:
[ERROR]Cannot access secondary GPU - error: Could not load GPU driver
并且尝试加载 nvidia 模块时得到:
modprobe nvidia modprobe: ERROR: could not insert 'nvidia': Exec format error
你需要针对你的内核手动编译 nvidia 包,例如 或从 ABS 编译。
NOUVEAU(0): [drm] failed to set drm interface version
考虑切换到 nvidia 官方驱动。在此的评论说 nouveau 驱动在某些显卡和bumblebee上有问题。
[ERROR]Cannot access secondary GPU - error: X did not start properly
在 把 设置为 "true"(看 这里):
/dev/dri/card0: failed to set DRM interface version 1.4: Permission denied
这可以通过在 里添加几行解决(见 这里):
ERROR: ld.so: object 'libdlfaker.so' from LD_PRELOAD cannot be preloaded: ignored
你也许是想在64位系统上用bumblebee运行32位程序。见 "Note" box Installation.
Fatal IO error 11 (Resource temporarily unavailable) on X server
把 里的 KeepUnusedXServer 从 改为 .这是因为你的程序fork到了后台并且 bumblebee 对此一无所知。
视频撕裂
视频撕裂是 Bumblebee 上一个常见的问题,要修复这个问题,你需要启用 vsync。默认情况下,Intel 显卡已启用此设置,但是还是检查一下 Xorg 的日志,要检查 nvidia 是否启用了此设置,运行:
$ optirun nvidia-settings -c :8
以及 应该都是已经启用状态。 Intel 显卡通常有比较少的撕裂,所以应该作为视频回放设备。特别是使用 VA-API 编码视频的时候(比如: 以及 参数)。
参考Intel了解如何修复 Intel 显卡的视频撕裂。
如果仍然无效,尝试从桌面环境禁用 compositing。同时可尝试禁用 triple buffering.
Bumblebee cannot connect to socket
你可能会得到这样的输出:
$ optirun glxspheres64
或 (32位):
如果你已在 bumblebee 群组中 (),尝试 removing the socket /var/run/bumblebeed.socket.
Running X.org from console after login (rootless X.org)
Primusrun 鼠标延迟/禁用 VSYNC
对于 , 默认启用,因此会导致鼠标输入延迟甚至轻微降低性能。不用 来测试 :
$ vblank_mode=0 primusrun glxgears
如果你想使用它替代 ,新建文件:
让它可执行:
# chmod +x /usr/bin/optiprime
用法:
$ optiprime glxgears
总之它不会有重大性能提升,但会解决上述的鼠标延迟。
| Command | FPS | Score | Min FPS | Max FPS |
|---|---|---|---|---|
| optiprime unigine-heaven | 31.5 | 793 | 22.3 | 54.8 |
| primusrun unigine-heaven | 31.4 | 792 | 18.7 | 54.2 |
Tested with Asus N550JV laptop and benchmark app unigine-heavenAUR.
另见
Join us at #bumblebee at freenode.net.