无法再从Intel切换到NVIDIA GPU。

[Ubuntu 14.04 64位]
在切换Intel / NVIDIA图形和不同的NVIDIA驱动程序之后,我现在突然被困在了Intel GPU上。以前在两者之间切换没有任何问题 - 我不能确定是什么突然引起了这个问题。我想我最后做的事情是切换到了“X.Org X服务器”驱动程序 - 然后出了问题。切换是我尝试解决设置第二个屏幕问题的一部分

enter image description here

每次我尝试切换到NVIDIA时,都会出现一个非常明显的错误信息,然后又自动切回Intel :/
需要一些故障排除的帮助或建议,不知道还能尝试什么。
到目前为止,我已经(卸载/重新安装)了各种包括"nvidia-settings" / "nvidia-current" / "nvidia-current-updates" / "nvidia-331" / "nvidia-331-updates" 的软件包。但都没有效果。
> lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GK107GLM [Quadro K2000M] (rev a1)

/etc/apt/sources.list: 可能在 pastebin.com 找到


关于Qasim的建议:
raffael@raffael-GT60~> sudo prime-select nvidia
[sudo] password for raffael: 
Error: alternatives are not set up properly
Error: nvidia mode can't be enabled
raffael@raffael-GT60~> sudo prime-select intel
Error: alternatives are not set up properly
Error: intel mode can't be enabled

关于卡西姆的第二个建议:
sudo apt-get purge nvidia*
[reboot]
sudo apt-get install nvidia-319-updates nvidia-settings-319-updates nvidia-prime
[reboot]
[tried to switch to NVIDIA]

奇怪的是,这实际上第一次就起作用了!然后我切换回Intel - 注销/登录 - 再切换回NVIDIA - 注销/登录 -> 系统崩溃 - 出现如上所述的错误。
关于Louis Matthijssen的建议:
raffael@raffael-GT60:~$ sudo update-alternatives --set /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf /usr/lib/nvidia-331-updates-prime/ld.so.conf
update-alternatives: error: alternative name (/etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf) must not contain '/' and spaces
raffael@raffael-GT60:~$ ls -la /usr/lib/nvidia-331-updates-prime
total 44
drwxr-xr-x   2 root root  4096 Mai  2 22:45 .
drwxr-xr-x 196 root root 32768 Mai  3 10:57 ..
-rw-r--r--   1 root root     0 Apr  4 11:50 alt_ld.so.conf
-rw-r--r--   1 root root    60 Apr  4 11:50 ld.so.conf

重复算法两次 - 再次没有起作用 :/

现在看起来好像有效:

raffael@raffael-GT60:~$ sudo update-alternatives --set x86_64-linux-gnu_gl_conf /usr/lib/nvidia-331-updates-prime/ld.so.conf 
update-alternatives: using /usr/lib/nvidia-331-updates-prime/ld.so.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf (x86_64-linux-gnu_gl_conf) in manual mode

raffael@raffael-GT60:~$ sudo update-alternatives --set i386-linux-gnu_gl_conf /usr/lib/nvidia-331-updates-prime/alt_ld.so.conf
update-alternatives: using /usr/lib/nvidia-331-updates-prime/alt_ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_GL.conf (i386-linux-gnu_gl_conf) in manual mode

随后我可以切换到NVIDIA - 但没有提供扩展的“NVIDIA X服务器设置” - 现在将重新启动并查看发生了什么。 跟进:重启后,它又切换回英特尔,并且无法像往常一样切换到NVIDIA。 对我来说,路易斯的方法似乎欺骗操作系统相信它使用NVIDIA,而实际上并非如此。

2我有完全相同的问题,事实上问题还扩大了,现在我的Nvidia显卡在Windows 8.1中无法工作,这意味着影响到操作系统之外的某些配置 :( 实际上,我尝试过干净安装Ubuntu,但它不再识别这张显卡。 - user5288
你能贴出你的/etc/apt/sources.list吗? - davidbaumann
@Raffael ... 我已经删除了答案,请尝试通过sudo apt-get install nvidia-319-updates nvidia-settings-319-updates nvidia-prime来卸载并重新安装NVIDIA Prime。 - Qasim
你是不是先卸载了NVIDIA?@Raffael - Qasim
我可以有TeamViewer访问权限吗?这样我就可以查看问题了。 - Qasim
首先移除NVIDIA驱动,然后重新启动电脑。之后按照我上面提到的方法安装NVIDIA驱动。使用命令"tail -f /var/log/syslog"来查看系统日志,检查"dmesg"命令的输出,还要检查"cat /proc/acpi/bbswitch"命令的输出,确保其显示为OFF。 - Qasim
@Qasim:请注意问题的编辑。 - Raffael
6个回答

你遇到了以下错误:
Error: alternatives are not set up properly

你可以尝试自己设置替代方案。
当我切换到Intel时,我看到:
update-alternatives: using /usr/lib/nvidia-331-prime/ld.so.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf (x86_64-linux-gnu_gl_conf) in manual mode
update-alternatives: using /usr/lib/nvidia-331-prime/alt_ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_GL.conf (i386-linux-gnu_gl_conf) in manual mode

当我切换到NVIDIA时,我看到:
update-alternatives: using /usr/lib/nvidia-331/ld.so.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf (x86_64-linux-gnu_gl_conf) in manual mode
update-alternatives: using /usr/lib/nvidia-331/alt_ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_GL.conf (i386-linux-gnu_gl_conf) in manual mode

所以你可以尝试这个方法来切换到英特尔:
sudo update-alternatives --set x86_64-linux-gnu_gl_conf /usr/lib/nvidia-331-prime/ld.so.conf
sudo update-alternatives --set i386-linux-gnu_gl_conf /usr/lib/nvidia-331-prime/alt_ld.so.conf

显然,你应该用你自己的版本替换331。

现在你可以尝试一些方法来触发开关:

  • 退出登录并重新登录

    像平常一样重新启动X服务器

  • 重启整个电脑

    与上述相同的目的

  • 执行sudo prime-select nvidia

    因为你的备选项现在已经设置为Intel,我希望这也能修复其他设置,使一切恢复正常(显然你仍然需要重新启动X服务器)

我希望我正确解释了错误。

此外,你可以使用prime-select query来检查当前选择的是哪张卡,并修复该卡的备选项(例如NVIDIA),因为你可能不小心设置了另一张卡(例如Intel)的备选项,但工具仍然认为你正在使用另一张卡(例如NVIDIA),从而导致错误提示备选项设置不正确。


不确定为什么你建议我应该切换到英特尔 - 但是调用第一个命令最终会被添加到我的问题中。 - Raffael
很抱歉,那些是错误的指令。我的意思是你可以尝试将当前的显卡(Intel)的备选项设置为prime-select所说的备选项已经损坏了。然后,你可以尝试再次切换到NVIDIA来看是否正常工作。我不确定这会不会起作用,你应该检查一下备选项当前指向的位置,以便在这种情况下恢复备选项。 - Louis Matthijssen
1我刚刚遇到了和你一样的问题,当我尝试切换到NVIDIA时。我在这里提供的命令对我有效。查看我的完整输出 - Louis Matthijssen
我猜我找到时间的时候就重新安装Ubuntu吧。 - Raffael
好的,你能告诉我这个方法是否有效吗?每次我尝试切换到NVIDIA时都会遇到同样的问题。我现在使用的是337版本,我会检查一下它是否有效。 - Louis Matthijssen
对337也不起作用,又显示为"未知"。我对此感到非常厌烦,因为我原以为它比Bumblebee更稳定且更易使用。 - Louis Matthijssen
对我来说,关键是sudo prime-select nvidia。在我从nvidia切换到intel之后,我无法再切换回nvidia,设置应用程序总是崩溃。感谢这个命令! - Arda
最近直到最近我根本没有这个问题,而且尽管你的修复方法有效(输入命令,重启,可以很好地在NVIDIA和Intel之间切换),但当我再次重启时,修复方法却不知何故丢失了,直到我重复执行命令并再次重启才能切换。有没有办法使这个修复方法永久生效? - Fern Moss
1对我来说,问题在于备选项指向了Mesa驱动程序,因此让prime-select产生了困惑。我所要做的就是将备选项重置为默认值:update-alternatives --auto i386-linux-gnu_gl_confupdate-alternatives --auto x86_64-linux-gnu_gl_conf。之后,nVidia面板又开始正常工作了。 - SnakE
我发现即使我更新了这个,如果我做了任何改变,我还是不得不一遍又一遍地重新做。 - Goddard

我想我至少找到了一个解决办法。
这完全是关于"update-alternatives"的。 我注意到两个都
sudo update-alternatives --config i386-linux-gnu_gl_conf

sudo update-alternatives --config x86_64-linux-gnu_gl_conf

返回包含/usr/lib/i386-linux-gnu/mesa/ld.so.conf或类似的列表。
不知何故,每次重新启动后,即使我之前手动更改过,/usr/lib/i386-linux-gnu/mesa/ld.so.conf仍然被设置为选择项。
我尝试改变列表中的顺序,但最终的解决办法是将其删除。
sudo update-alternatives --remove x86_64-linux-gnu_gl_conf /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf

sudo update-alternatives --remove i386-linux-gnu_gl_conf /usr/lib/i386-linux-gnu/mesa/ld.so.conf

那应该够了。 如果不够,可以将'i386'和'x86_64'都设置为相同的选项。
sudo update-alternatives --config x86_64-linux-gnu_gl_conf

并且

sudo update-alternatives --config x86_64-linux-gnu_gl_conf

重启后。
您可以随时通过以下方式将其恢复到原始状态:
sudo update-alternatives --install /etc/ld.so.conf.d/i386-linux-gnu_GL.conf i386-linux-gnu_gl_conf /usr/lib/i386-linux-gnu/mesa/ld.so.conf 500  

sudo update-alternatives --install /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf x86_64-linux-gnu_gl_conf /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf 500

希望这对您也有效。

1按照您的指示操作并重新启动后,我无法再登录。登录页面显示出来,输入密码并按下回车后会显示一个黑屏,然后又回到登录界面。我使用了CTRL+Alt+F1,并使用了您最后两个命令将其恢复到先前的设置。现在我可以登录,但我仍然无法使用我的Nvidia显卡。 - BourbonCreams
@BourbonCreams,很抱歉听到这个消息。我建议尝试sudo apt-get purge nvidia-*,重新启动,添加此ppa:ppa:graphics-drivers/ppa(来自http://www.webupd8.org/2016/06/how-to-install-latest-nvidia-drivers-in.html),并使用内置GUI应用程序安装所选驱动程序或运行`sudo apt-get install nvidia-<choosen driver version> nvidia-prime` - 这也应该有效。有时候我不得不做两次,出于某种原因(或者至少要重启两次)。老实说,我觉得这个答案的解决方法并不完美。 - kcpr
这个更新对我来说没有修复问题,但是对我来说,结果发现nvidia模块由于一些符号链接的错误而无法加载,正如在这里描述(并修复)的答案中所述:https://askubuntu.com/questions/900285/libegl-so-1-is-not-a-symbolic-link#answer-900714 - Scott

跟随之前的答案,这是我在我的Linux Mint 17.2上获得正确结果的方式。
首先我执行:
sudo update-alternatives --config x86_64-linux-gnu_gl_conf

选择带有'nvidia-prime'的那个:
sudo prime-select nvidia

然后重新启动:
sudo init 6

这是对我有效的方法,我仍在努力寻找他的帖子。我有很多我正在查看的帖子:
这就是对我有效的方法:
我尝试了:
sudo update-alternatives --config x86_64-linux-gnu_gl_conf
sudo ldconfig -n
sudo update-initramfs -u

重新启动了,但没有任何改变。所以我尝试了:
sudo apt-get purge libvdpau-va-gl1 bumblebee* nvidia*
sudo apt-get install linux-headers-generic
sudo apt-get install nvidia-331 nvidia-settings nvidia-prime

重新启动。然而,没有任何变化,当我尝试切换到我的NVIDIA显卡时,nvidia-settings显示相同的空白错误信息。
我尝试手动切换,使用"sudo prime-switch nvidia"命令,配置信息得到更新。我再次尝试,nvidia-settings要求我退出登录并重新登录,然后...哇!它终于可以工作了!
在我的情况下,似乎在能够使用nvidia-settings界面进行切换之前,我必须先以超级用户身份手动切换,以生成正确的配置!
幸好我尝试了这个方法,否则我还会一直摸索,安装其他驱动程序!希望这对其他人有所帮助!

我曾经遇到过同样的问题,答案是我仍然安装了bumblebee-nvidia

请注意,您使用sudo apt-get purge nvidia*清除“所有NVIDIA”内容,而上面的软件包不匹配该通配符。

因此,请运行以下命令:

apt-get purge bumblebee-nvidia nvidia*

重新启动后,安装相关的nvidia-xxx、nvidia-settings和nvidia-prime软件包(我目前使用的版本为340.24,来自xorg-edgers)。
在安装过程中,您应该会看到有关*gnu_gl_conf文件的相关update-alternatives消息。

:-/ ... 自从我上次尝试之后,没有什么愚蠢的东西需要清除了。 - Raffael

我找到了解决方案。
虽然我不确定问题具体是什么,但在重新安装16.04版本后,这个问题似乎已经消失了。可能他们在其中正确地更新了依赖关系?我不太确定。
但是我可以亲自确认,在16.04中这不再是一个问题。我以前在14.04中遇到过完全相同的问题。但现在在16.04中这不再是一个问题。

请原谅我提及一个旧答案,但我面临着完全相同的问题。 - Rakshith Ravi