我有一台配备可怕的 Optimus 的 Sony VAIO S 笔记本电脑,最后设法让 Bumblebee 在 Ubuntu 12.04 上完全运行,这样我就可以通过 optirun 和/或 bumble-app-settings 利用英特尔芯片组的硬件加速以及 Nvidia 的硬件加速。
但是桌面效果不起作用。不过它们应该可以,我依稀记得在我安装 Bumblebee 之前它们能用一段时间。
这是我通过支持测试获得的结果:
:~$ /usr/lib/nux/unity_support_test -p
Xlib: extension "NV-GLX" missing on display ":0".
OpenGL vendor string: Tungsten Graphics, Inc
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
OpenGL version string: 1.4 (2.1 Mesa 8.0.2)
Not software rendered: yes
Not blacklisted: yes
GLX fbconfig: yes
GLX texture from pixmap: yes
GL npot or rect textures: yes
GL vertex program: yes
GL fragment program: yes
GL vertex buffer object: no
GL framebuffer object: yes
GL version is 1.4+: yes
Unity 3D supported: no
首先,我有点怀疑该芯片组不支持 VBO(基本上是 GL 中的标准功能)。
Xorg.0.log 和 Xorg.8.log 都没有显示任何特定错误。
至于 Nvidia 驱动程序:为了让它们工作,我必须安装 304.22 驱动程序(旧版本无法工作)。它们破坏了 libglx.so,因此我将 xserver-xorg-core libglx.so 恢复到其原始位置,将 Nvidia 的 libglx.so 移动到 nvidia 特定的文件夹,并在 bumblebee.config 中指定该文件夹。这似乎有效,不应该导致我在此处看到的问题。
为了好玩,我尝试将 Nvidia 芯片组用于 Unity,但也没有成功:
~$ optirun /usr/lib/nux/unity_support_test -p
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GT 640M LE/PCIe/SSE2
OpenGL version string: 4.2.0 NVIDIA 304.22
Not software rendered: yes
Not blacklisted: yes
GLX fbconfig: yes
GLX texture from pixmap: no
GL npot or rect textures: yes
GL vertex program: yes
GL fragment program: yes
GL vertex buffer object: yes
GL framebuffer object: yes
GL version is 1.4+: yes
Unity 3D supported: no
答案1
问题出在 libGL.so.1 - 显然,Nvidia 安装程序也已删除英特尔的产品,并用自己的产品替换它。
所以我从 libgl1-mesa-glx 中检索它并更改 /usr/lib 中的符号链接以指向它。
我不会详细介绍如何设置 Bumblebee,但有一些关键部分尚未真正记录下来:
Nvidia 驱动程序安装程序可能会破坏您现有的 libglx.so(位于 /usr/lib/xorg/modules/extensions 中)和 libGL.so(位于 /usr/lib 中)。请在安装驱动程序之前备份它们。如果您已经丢失了它们,您可以通过重新安装 xserver-xorg-core 和 libgl1-mesa-glx 来找回它们,但当我第一次尝试这样做时,它让我的笔记本电脑处于不良状态(登录后黑屏,必须进入恢复状态),所以我建议通过 dpkg-deb 手动获取它们。
安装 Nvidia 驱动程序后,您会注意到 Nvidia 将上面列出的两个文件替换为指向 Nvidia 库的符号链接。例如,在我的情况下,libglx.so 是指向 libglx.so.304.22 的符号链接。
由于 Bumblebee 需要这两种驱动程序,而且它只能通过目录来区分,因此让我们将每个图形适配器的驱动程序移动到单独的目录中。我使用的 Nvidia 安装程序将一些驱动程序安装到 /usr/lib/nvidia-current 中,让我们使用它。请记住,我们需要分离库和 Xorg 模块。以下是我将相关文件放在的位置:
在 /usr/lib 中:
libGL.so.304.22 -- Nvidia's driver (unchanged where the installer put it)
libGL.so -- symlink to libGL.so.1
libGL.so.1 -- symlink to /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1,
i.e. the libgl1-mesa-glx driver
在 /usr/lib/x86_64-linux-gnu/mesa 中:
libGL.so.1 -- symlink to libGL.so.1.2
libGL.so.1.2 -- The normal driver from libgl1-mesa-glx
在 /usr/lib/nvidia-current 中:
libGL.so -- symlink to libGL.so.1
libGL.so.1 -- symlink to /usr/lib/libGL.so.304.22 (i.e. Nvidia's driver)
在 /usr/lib/nvidia-current/xorg 中:
libglx.so -- symlink to /usr/lib/xorg/modules/extensions/libglx.so.304.22
在 /usr/lib/xorg/modules/extensions 中:
libglx.so.1 -- symlink to libglx.so.xserver
libglx.so.304.22 -- Nvidia's driver (unchanged from where the installer put it)
libglx.so.xserver -- I renamed the original libglx.so to that and put it here
最后,我们需要修改 /etc/bumblebee/bumbleebee.conf 来告诉系统在哪里可以找到 Nvidia 驱动程序。我使用的是 nvidia 驱动程序(而不是 nouveau),因此在 nvidia 部分中,我使用以下内容:
KernelDriver=nvidia
Module=nvidia
PMMethod=auto
# colon-separated path to the nvidia libraries
LibraryPath=/usr/lib/nvidia-current:/usr/lib32/nvidia-current
# comma-separated path of the directory containing nvidia_drv.so and the
# default Xorg modules path
XorgModulePath=/usr/lib/nvidia-current/xorg,/usr/lib/xorg/modules
请注意 LibraryPath 和 XorgModulePath 如何指向 Nvidia 驱动程序,因此如果 Bumblebee 正在寻找它们,它就会找到它们。如果 Unity 正在寻找它们,它会在 /usr/lib 和 /usr/lib/xorg/modules/extensions 中查找,我们确保这些符号链接到非 Nvidia 驱动程序。
这可能在某些地方有点笨拙,但我能说什么呢?它运行完美:
Unity 3D 可实现完整的桌面效果,速度快如闪电,但仍使用节能的较慢的 Intel 芯片组。VirtualBox 等应用程序可以使用常规 3D 加速。optirun 可运行,我可以选择运行“glxspheres”(约 60 fps)或“optirun glxspheres”(约 120 fps)。