NVIDIA-PRIME:无法切换到英特尔

C11*_*235 10 nvidia xorg drivers nvidia-prime

每当我从我的 gpu (gtx 1060) 切换到我的 igpu (Intel 530) 时,我都无法启动。加载屏幕卡住了以下消息:

[失败] 无法启动 NVIDIA Persistence Daemon。有关详细信息,请参阅“systemctl status nvidia-persistenced.service”。

但是,当我切换回 Nvidia gpu 并切换到我的 igpu 时,我可以启动,而无需重新启动。我使用的是 Kubuntu 16.10 并且只有我的内部笔记本电脑显示器。这是我切换到 igpu 时的输出:

sudo prime-select intel
Info: the current GL alternatives in use are: ['nvidia-378', 'nvidia-378']
Info: the current EGL alternatives in use are: ['nvidia-378', 'nvidia-378']
Info: selecting nvidia-378-prime for the intel profile
update-alternatives: using /usr/lib/nvidia-378-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-378-prime/ld.so.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf (x86_64-linux-gnu_egl_conf) in manual mode
update-alternatives: using /usr/lib/nvidia-378-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
update-alternatives: using /usr/lib/nvidia-378-prime/alt_ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_EGL.conf (i386-linux-gnu_egl_conf) in manual mode

sudo prime-select nvidia
Info: the current GL alternatives in use are: ['nvidia-378-prime', 'nvidia-378-prime']
Info: the current EGL alternatives in use are: ['nvidia-378-prime', 'nvidia-378-prime']
Info: selecting nvidia-378 for the nvidia profile
update-alternatives: using /usr/lib/nvidia-378/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-378/ld.so.conf to provide /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf (x86_64-linux-gnu_egl_conf) in manual mode
update-alternatives: using /usr/lib/nvidia-378/alt_ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_GL.conf (i386-linux-gnu_gl_conf) in manual mode
update-alternatives: using /usr/lib/nvidia-378/alt_ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_EGL.conf (i386-linux-gnu_egl_conf) in manual mode
Run Code Online (Sandbox Code Playgroud)

lspci -k 的结果 | grep -EA2 'VGA|3D'

00:02.0 VGA compatible controller: Intel Corporation HD Graphics 530 (rev 06)
        DeviceName:  Onboard IGD
        Subsystem: CLEVO/KAPOK Computer HD Graphics 530
--
01:00.0 VGA compatible controller: NVIDIA Corporation GP106M [GeForce GTX 1060] (rev a1)
        Subsystem: CLEVO/KAPOK Computer Device 6a03
        Kernel driver in use: nvidia
Run Code Online (Sandbox Code Playgroud)

我试图自己解决这个问题一个多星期,但不知道该怎么做。我尝试的一切都失败了。

请你帮助我好吗?

2017 年 2 月 5 日更新:

我今天再次测试它并意识到切换到 intel gpu 对 375 和 378 根本不起作用。注销会冻结屏幕。那么为什么它一次起作用呢?如果我在删除旧驱动程序后再次安装所有驱动程序,然后使用 prime-select intel(无需重新启动!),prime-select 不会更新主要配置文件 -> 它选择旧的非 nvidia 配置文件之一(mesa 配置文件)而不是 nvidia),它的工作原理。但是一旦我切换到 nvidia 配置文件或重新启动,主要配置文件就会更新并且不再起作用。所以我猜英特尔 GPU 的 EGl 替代品有问题吗?任何不便敬请谅解。

2017 年 2 月 12 日更新:

昨天修改了nvidia-prime软件,修复了bug。我将很快发布(可能在下周)我的修改版本并在此处粘贴链接,但我仍然遇到一个问题:当我执行后关闭我的电脑时sudo prime-select intel

ksmserver 崩溃(我使用的是 Kubuntu,Ubuntu 可能没有问题)

-> PC 无法完全关闭,英特尔 GPU 的旧(错误)更新替代品已恢复

-> 我无法启动。

但是,如果我sudo prime-select intel在恢复模式下关机后运行,一切正常,我可以使用英特尔 GPU。

2017 年 2 月 17 日更新:

我发布了我的解决方法,并且仍在尝试修复官方存储库中的错误。然而,这可能是更新替代方案中的一个错误,所以接下来我必须在那里发布错误报告。

同时,享受我的解决方法!我希望它也适用于你。如果有任何问题,请发表评论。

2017 年 2 月 26 日更新

正如@whizzkid 指出的那样,应用我的补丁后,nvidia 显卡仍然保持活动状态。但是,今天我能够解决这个问题。下周我可能会更新我的答案以包括我的第二个补丁。以下是我运行的一些测试:

英伟达:43-45W

英特尔(nvidia on):29-31W

英特尔(关闭 nvidia):15-17W

C11*_*235 3

这是我对错误的修复/解决方法:

如果您想使用 bumblebee 而不是 nvidia-prime,请查看 下面@whizzzkid提供的答案。

使用 KDE Plasma Version.7.5 和 KDE Frameworks Version 5.26.0 在Kubuntu 16.10 64 位上进行测试。以下步骤对我有用。我希望他们也能为你工作,但我不能保证这一点,如果他们不这样做,我不承担任何责任。但如果您发表评论,我很高兴为您提供帮助。

就我而言,问题是更新替代方案 /usr/lib/nvidia-XYZ-prime/ 根本不起作用。它应该将调用重定向到 intel-mesa 驱动程序,但由于某种原因它没有。那么这可能毕竟是更新替代方案中的一个错误?我仍然没有找到报告更新替代方案错误的地方。如果您能帮助我,请发表评论。

我基本上对 nvidia-prime 进行了一些修改,将 update-alternatives 直接更改为 intel-mesa 驱动程序,而不是 /usr/lib/nvidia-XYZ-prime/。

重要的:

在应用任何这些步骤之前,请确保了解如何在电脑上访问恢复模式。如果您由于本指南而无法再启动,您仍然可以使用本指南最后一部分中的命令撤消恢复模式中的更改。请参阅此网站了解如何访问恢复模式以获取更多信息。

如果您使用32 位操作系统,则必须省略步骤 4和如何撤消所有这些修改部分中包含x86_64 的所有命令。


步骤1:

使用 @whizzzkid 在下面的回答中提供的简单方法安装我的补丁:

cd /usr/bin
sudo mv prime-select prime-select.bkup
sudo wget https://raw.githubusercontent.com/C11235/nvidia-prime-bugfix/master/prime-select
sudo chmod 755 prime-select
Run Code Online (Sandbox Code Playgroud)

第2步:

应用我的第二个补丁来降低英特尔模式下的功耗:

检查您拥有的 nvidia 驱动程序版本。例如使用以下命令:

$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  378.13  Tue Feb  7 20:10:06 PST 2017
GCC version:  gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,nvidia-XYZ 是 nvidia-378。请参阅此Stackoverflow 线程

创建一个包含以下内容的 bash 文件,例如名为 poweroff.sh

#!/bin/bash
line=$(</etc/prime-discrete)
if [ "$line" == "off" ] 
   then
   rmmod nvidia-drm
   rmmod nvidia-modeset
   rmmod nvidia
   bash -c 'echo OFF > /proc/acpi/bbswitch'
fi 
Run Code Online (Sandbox Code Playgroud)

创建第二个 bash 文件,其中包含以下内容,例如命名为 poweron.sh,并将 XYZ 替换为您的 nvidia 驱动程序版本号。

#!/bin/bash
modprobe nvidia-XYZ
modprobe nvidia-XYZ-modeset
modprobe nvidia-XYZ-drm
modprobe nvidia-XYZ-uvm
echo ON > /proc/acpi/bbswitch
Run Code Online (Sandbox Code Playgroud)

在 Intel 模式下,您必须在使用 sudo 登录后运行第一个脚本,在使用 sudo 注销之前运行第二个脚本 (否则您的笔记本电脑可能会崩溃,就像我的情况一样)。我只是用 执行它们sudo bash FILENAME

到目前为止,我无法在登录时和注销之前以 root 身份自动启动这些脚本。然而,正如@Fiximan指出的那样,对于暴发户来说这可能是可能的。如果我能做到的话,我可能会在将来的某个时候再次更新这个答案。


(可能)KDE Plasma 特定错误:

KDE Plasma 中仍然存在一个我无法修复的错误:每当我在 nvidia 模式下启动 PC 后从 Nvidia 切换到 Intel 时,ksmserver就会崩溃并且 PC 无法使用,我必须按按住电源按钮约 5-10 秒。这有时会导致更新替代方案更改为 nvidia-prime 而不是 intel-mesa,从而导致启动时出现黑屏

如果您碰巧受到 ksmserver bug 的影响,请为bugs.kde.org 上的官方错误报告做出贡献。

但是,即使您使用 nvidia 模式,在关机前始终选择 intel 模式也可以避免PC 无法关机的问题。如果您这样做,一切都会正常工作,并且您不必通过长按电源按钮来关闭电脑,除非您在 nvidia 模式下应用本指南。

针对启动时黑屏错误的一个简单解决方法是完全删除不起作用的更新替代方案:

步骤1:

进入恢复模式后,您可以再次访问您的电脑,选择 root 命令 shell 并执行以下 2 个命令:

mount -o remount,rw /
prime-select nvidia
Run Code Online (Sandbox Code Playgroud)

第2步:

执行以下命令:

sudo update-alternatives --remove i386-linux-gnu_gl_conf /usr/lib/nvidia-XYZ-prime/alt_ld.so.conf
sudo update-alternatives --remove i386-linux-gnu_egl_conf /usr/lib/nvidia-XYZ-prime/alt_ld.so.conf
sudo update-alternatives --remove x86_64-linux-gnu_gl_conf /usr/lib/nvidia-XYZ-prime/ld.so.conf
sudo update-alternatives --remove x86_64-linux-gnu_egl_conf /usr/lib/nvidia-XYZ-prime/ld.so.conf
Run Code Online (Sandbox Code Playgroud)

如何撤消所有这些修改

只需执行以下命令:

sudo rm /usr/bin/prime-select
sudo mv /home/YOUR-USERNAME/prime-select.backup /usr/bin/prime-select
sudo update-alternatives --install /etc/ld.so.conf.d/i386-linux-gnu_GL.conf i386-linux-gnu_gl_conf /usr/lib/nvidia-XYZ-prime/alt_ld.so.conf 8603
sudo update-alternatives --install /etc/ld.so.conf.d/i386-linux-gnu_EGL.conf i386-linux-gnu_egl_conf /usr/lib/nvidia-XYZ-prime/alt_ld.so.conf 8603
sudo update-alternatives --install /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf x86_64-linux-gnu_gl_conf /usr/lib/nvidia-XYZ-prime/ld.so.conf 8603
sudo update-alternatives --install /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf x86_64-linux-gnu_egl_conf /usr/lib/nvidia-XYZ-prime/ld.so.conf 8603
Run Code Online (Sandbox Code Playgroud)


小智 2

@C11235 的补丁有效,现在我可以在 nvidia 和 intel 之间切换,但这并不能降低功耗。:-/ 这意味着两者仍在运行。

顺便说一句,这是一种更简单的方法。

cd /usr/bin
sudo mv prime-select prime-select.bkup
sudo wget https://raw.githubusercontent.com/C11235/nvidia-prime-bugfix/master/prime-select
sudo chmod 755 prime-select
Run Code Online (Sandbox Code Playgroud)