从主题中可以猜到,我有一台 Optimus 笔记本电脑。只要我运行的是 19.04,我就能够使用 Prime(通过命令prime-select {intel|nvidia}
)切换到 Nvidia dGPU 并返回。不过,升级到 19.10 后情况发生了变化:升级后的第二天,系统冻结,内核抱怨某些任务卡住了,例如一个。我设法通过在 chroot root 登录环境中rmmod
运行来恢复我的系统。prime-select nvidia
我不会过多地谈论细节,例如从 initramfs 中删除 iGPU/dGPU 驱动程序(这些驱动程序与 initramfs 有什么关系?),但现在它至少可以启动,无论是否激活 dGPU prime。
这就是我遇到的问题:如果我的系统在 intel 配置文件激活的情况下启动,则切换到 nvidia 配置文件不起作用,因为硬件中未检测到 dGPU。事实上,它不在 lspci 列表中。我必须重新启动才能再次检测到 dGPU。因此,当我关闭系统时,我应该始终考虑事先激活 nvidia 配置文件,否则我将不得不重新启动才能在下次使用它。
这是我的主要问题。另一个不太烦人的问题是,从 nvidia 切换到 intel 时,我总是必须重新启动 gdm 服务。我可以忍受,但这是我在 19.04 中没有遇到的问题。
欢迎就此问题提出建议!要么防止 dGPU 从硬件列表中消失,要么让系统再次检测到它,而无需重新启动。
Fwiw,我的 iGPU 是 Intel HD Graphics 4600,我的 dGPU 是 Nvidia GTX 880M。
编辑 : @Syfer Polski,感谢您的宝贵回复!
我注意到有一个按需配置文件,但我将其丢弃,因为这可能是一些无用的尝试,因为不久前我读到过,真正有效的 Optimus 实现不会很快出现......我应该读一下那个自述文件!
所以我立即尝试了那个按需配置文件。起初它不起作用,因为我的 430 驱动程序不支持它。应该有一些驱动程序检查拒绝为未运行支持版本的用户启用该配置文件,我怀疑这就是我的系统崩溃的原因,因为该按需配置文件在升级过程中自动激活(只是假设,我当时没有检查)。
无论如何……所以我安装了 435 驱动程序,并且按需配置文件确实可以工作。但是,我发现它还不够令人满意,因为我的 GPU 在不使用时不会关闭,并且尝试自行关闭它不起作用。我尝试通过直接 ACPI 调用将其关闭,它确实关闭了,但是:
NVRM: GPU at PCI:0000:01:00: GPU-9b8a3387-4913-0c33-619e-da118e532a5f
NVRM: Xid (PCI:0000:01:00): 79, pid=29013, GPU has fallen off the bus.
NVRM: GPU 0000:01:00.0: GPU has fallen off the bus.
NVRM: A GPU crash dump has been created. If possible, please run
NVRM: nvidia-bug-report.sh as root to collect this data before
NVRM: the NVIDIA kernel module is unloaded.
因此,对我来说不幸的是,只要专有驱动程序无法在不使用时关闭我的 dGPU,我想我会坚持使用经典的 intel/nvidia 配置文件系统。
这让我回到我最初的问题,当我在启用英特尔模式的情况下启动时:如何在不重启的情况下恢复我的 dGPU?
重新扫描(echo 1 >/sys/bus/pci/rescan
)在日志中显示:
pci 0000:01:00.0: [10de:1198] type 00 class 0x030000
pci 0000:01:00.0: reg 0x10: [mem 0xf6000000-0xf6ffffff]
pci 0000:01:00.0: reg 0x14: [mem 0xe0000000-0xefffffff 64bit pref]
pci 0000:01:00.0: reg 0x1c: [mem 0xf0000000-0xf1ffffff 64bit pref]
pci 0000:01:00.0: reg 0x24: [io 0xe000-0xe07f]
pci 0000:01:00.0: reg 0x30: [mem 0xf7000000-0xf707ffff pref]
pci 0000:01:00.0: 32.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x16 link at 0000:00:01.0 (capable of 126.016 Gb/s with 8 GT/s x16 link)
pci 0000:01:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
但 lspci 保持沉默。我可以通过 ACPI 调用随意打开/关闭设备,内核在重新扫描时显示它,但驱动程序无法检测到它,因此无法加载。一定有什么事情要做,但做什么呢?
答案1
nvidia-prime
Ubuntu 19.04 和 19.10 之间再次发生了变化。
在 Ubuntu 16.04 和 Ubuntu 18.04 之间,Ubuntu 使用bbswitch
社区构建的内核模块来关闭 Optimus 笔记本电脑中的 Nvidia GPU。然而,该模块停止维护,因此在 Ubuntu 18.10(自移植到 Ubuntu 18.04 以来),GPU 之间的切换是通过加载开源nouveau
驱动程序来处理的。然而,这并没有完全关闭 GPU(它仍然使用约 2W)。
同时,Nvidia 终于开始着手与其他 GPU 驱动程序共存。GLVND(图形库供应商中立显示)在 Xorg 1.20 中成为现实,允许加载多个 GPU 驱动程序并为显示服务器供电。这允许精细控制 - 每个应用程序可以使用单独的驱动程序。实际上,Optimus 笔记本电脑几乎总是与英特尔和 Nvidia GPU 有关。现在有三种模式prime-select
可供您选择:
- 英特尔
- 一经请求
- 英伟达
intel
模式会物理关闭 Nvidia GPU,节省额外的电量,但需要重新启动才能打开,而不仅仅是注销。nvidia
则相反。
对于经常切换模式的用户,建议使用按需模式 - 在 中on-demand
,用于绘制程序的 GPU 由环境变量决定。OpenGL 和 Vulkan 应用程序有不同的环境变量,如果未设置,则使用集成(英特尔)GPU。请参阅Nvidia 的自述文件有关所涉及的环境变量的完整解释(__NV_PRIME_RENDER_OFFLOAD
,__GLX_VENDOR_LIBRARY_NAME
和__VK_LAYER_NV_optimus
)
根据支持您的 GPU 的驱动程序系列,按需配置文件可能不适合您 - 最老的受支持驱动程序似乎是 435 系列。
答案2
找到解决方案!我没有做某些事情命令。因此恢复 dGPU 的步骤如下:
将配置文件设置为
nvidia
或on-demand
(如果您的驱动程序支持):prime-select {nvidia|on-demand}
打开 dGPU。BIOS 通常会在启动时将其打开,因此这里应该没有问题。如果您在此期间将其关闭,我假设您知道如何将其重新打开。如果它因其他原因保持关闭状态,您可以尝试使用。
apt install acpi-call-dkms
您将在 中找到有用的示例/usr/share/doc/acpi-call-dkms/examples
。小心处理,因为它可能会严重崩溃您的系统!在我的情况下,以下 ACPI 调用打开了我的 dGPU:。\_SB_.PCI0.PEG0.PEGP._ON
我以我为例,您的可能完全不一样。如果有反斜杠,请不要忘记将其转义。重新扫描您的 PCI 总线:
echo 1 >/sys/bus/pci/rescan
。但可能只需重新扫描部分总线就足够了。(可能是可选的)加载 nvidia 模块:
modprobe nvidia
警告 :不要通过直接 ACPI 调用关闭你的 GPU,除非你确定它没有绑定到任何驱动程序(更简单地说,应该卸载 nvidia 模块),否则驱动程序将崩溃(问题中给出了崩溃示例)。
只要它已加载,它就是驱动 GPU 的驱动程序,而你出其不意地拿起方向盘通常不会带来多大的好处。
然而,Nvidia 驱动程序具有电源管理功能默认情况下,该功能是关闭的,但可以通过将以下参数传递给模块来激活它nvidia
:NVreg_DynamicPowerManagement=0x01
。不幸的是,它仅适用于 Turing 和较新的 GPU(即不是我的开普勒)...取自/usr/src/nvidia-435.21/nvidia/nv-reg.h
:
/*
* Option: DynamicPowerManagement
*
* This option controls how aggressively the NVIDIA kernel module will manage
* GPU power through kernel interfaces.
*
* Possible Values:
*
* 0: Never allow the GPU to be powered down (default).
* 1: Power down the GPU when it is not initialized.
* 2: Power down the GPU after it has been inactive for some time.
*/