Ubuntu12.04更新后Unity 3D无法工作,运行以下命令
1 | $ /usr/lib/nux/unity_support_test -p
|
得到如下结果:
1 2 3 4 5 6 | X Error of failed request: BadWindow (invalid Window parameter) Major opcode of failed request: 138 (NV-GLX) Minor opcode of failed request: 4 () Resource id in failed request: 0x26f Serial number of failed request: 41 Current serial number in output stream: 41 |
这是因为更新过xserver-xorg-core这个软件包所致。此包包含以下文件:
1 | /usr/lib/xorg/modules/extensions/libglx.so |
如果使用的是自己从NVIDIA官网上下载的驱动,那么此文件必须是一个软链接,指向以下文件:
1 | /usr/lib/xorg/modules/extensions/libglx.so.XXX.YY |
这里,XXX和YY给出的是驱动版本。因此,每当xserver-xorg-core这个软件包更新后,就把这个软链接文件给覆盖掉了,导致GLX相关的应用程序无法使用Nvidia驱动。
解决方法当然是重新创建这个软链接:
1 2 | $ sudo mv /usr/lib/xorg/modules/extensions/libglx.so /usr/lib/xorg/modules/extensions/libglx.so_backup $ sudo ln -s /usr/lib/xorg/modules/extensions/libglx.so.XXX.YY /usr/lib/xorg/modules/extensions/libglx.so |
然后,重启图形界面服务就可以看到Unity 3D正常工作了。
1 | $ sudo service lightdm restart
|
以后,每次更新过xserver-xorg-core这个软件包,就要记得进行以上操作。
还有另外一种情况,也会导致Unity 3D无法工作,那就是更新过libgl1-mesa-glx,unity测试结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ /usr/lib/nux/unity_support_test -p OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce 7300 GT/PCIe/SSE2 OpenGL version string: 1.4 (2.1.2 NVIDIA 295.59) 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 |
运行命令
1 | $ ldd /usr/bin/glxinfo
|
你会看到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | linux-vdso.so.1 => (0x00007ffffe7d9000) libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f7ff5442000) libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f7ff510e000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ff4d50000) libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f7ff4b2b000) libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f7ff491a000) libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f7ff4716000) libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f7ff4510000) libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f7ff430e000) libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f7ff40f6000) libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7ff3ed8000) libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f7ff3cd3000) libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f7ff3ac7000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ff38aa000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ff36a6000) /lib64/ld-linux-x86-64.so.2 (0x00007f7ff56c3000) libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f7ff34a2000) libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f7ff329c000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7ff3093000) |
其中,libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f7ff5442000)
表示GL模块使用的是开源的mesa驱动,而非Nvidia驱动。
用ls -l
命令查看此文件
1 2 | $ ls -l /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
lrwxrwxrwx 1 root root 12 9月 11 07:40 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 -> libGL.so.1.2
|
得知,它是指向/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2
的软链接文件。只要删掉这两个文件,再运行ldconfig就可以啦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ sudo rm /usr/lib/libGL.so.1 /usr/lib/libGL.so.1.2 $ sudo ldconfig $ ldd /usr/bin/glxinfo linux-vdso.so.1 => (0x00007fff240f8000) libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f9bb976a000) libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f9bb9436000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9bb9078000) libnvidia-tls.so.295.59 => /usr/lib/tls/libnvidia-tls.so.295.59 (0x00007f9bb8e75000) libnvidia-glcore.so.295.59 => /usr/lib/libnvidia-glcore.so.295.59 (0x00007f9bb6b3b000) libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f9bb6929000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9bb6725000) libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f9bb6507000) /lib64/ld-linux-x86-64.so.2 (0x00007f9bb9aa3000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9bb620c000) libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f9bb6009000) libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f9bb5e03000) |
重启图形界面服务,Unity 3D就可以正常工作了。
本作品由 Yysfire 创作,采用进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/linux/unity-3d-does-not-work-after-upgrade-on-ubuntu-12.04.html