从主题中可以猜到,我有一台 Optimus 笔记本电脑。只要我运行的是 19.04,我就可以使用 Prime(通过prime-select {intel|nvidia}
命令)切换到 Nvidia dGPU 并返回。升级到 19.10 后情况发生了变化:升级后的第二天,系统冻结,内核抱怨某些任务被卡住,例如一个任务rmmod
。prime-select nvidia
我设法通过在 chroot root 登录环境中运行来取回我的系统。
我不会过多介绍诸如从 initramfs 中删除 iGPU/dGPU 驱动程序的细节(无论如何,这些对 initramfs 有什么作用?),但现在它至少可以启动,无论是否激活了 dGPU 启动.
这就是我遇到问题的地方:如果我的系统启动并激活了 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 驱动程序。应该有一些驱动程序检查拒绝为没有运行支持版本的人启用配置文件,我怀疑这就是我的系统崩溃的原因,因为在升级期间自动激活了按需配置文件(仅假设我没有t 检查时间)。
无论如何......所以我安装了 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,我想我会坚持使用经典的英特尔/英伟达配置文件系统。
当我在启用英特尔模式的情况下启动时,这让我回到了最初的问题:如何在不重新启动的情况下恢复我的 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 调用随意打开/关闭设备,内核在重新扫描时显示它,但驱动程序没有检测到它,因此不会加载。一定有事可做,但怎么办?
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(Graphics Library Vendor Neutral Display)成为 Xorg 1.20 中的一个东西,允许加载多个 GPU 驱动程序并为显示服务器供电。这允许精细控制 - 每个应用程序都可以使用单独的驱动程序。实际上,它几乎总是与 Optimus 笔记本电脑中的 Intel 和 Nvidia GPU 有关。现在有三种模式
prime-select
可供您选择:intel
模式以物理方式关闭 Nvidia GPU,节省额外电量,但需要重新启动才能将其打开,而不仅仅是注销。nvidia
是相反的。对于频繁切换模式的人,推荐使用按需模式——在 中
on-demand
,用于绘制程序的 GPU 是由环境变量决定的。OpenGL 和 Vulkan 应用程序有不同的环境变量,如果未设置,则使用集成 (Intel) GPU。有关所涉及的环境变量的完整说明,请参阅Nvidia 的自述__NV_PRIME_RENDER_OFFLOAD
文件(__GLX_VENDOR_LIBRARY_NAME
和__VK_LAYER_NV_optimus
)根据支持您的 GPU 的驱动程序系列,按需配置文件可能不适合您 - 支持的最旧驱动程序似乎是 435 系列。
找到解决方案!我没有按顺序做一些事情。所以恢复 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
警告:除非您确定它没有绑定到任何驱动程序(更简单地说,应该卸载 nvidia 模块),否则不要使用直接 ACPI 调用关闭 GPU,否则驱动程序将崩溃(问题中给出的崩溃示例)。
只要它被加载,它就是驱动 GPU 的驱动程序,而你意外地握住方向盘通常不会有什么好处。
但是,Nvidia 驱动程序具有默认关闭的电源管理功能,但可以通过将以下参数传递给
nvidia
模块来激活它NVreg_DynamicPowerManagement=0x01
:不幸的是,它仅适用于图灵和更新的 GPU(即不是我的开普勒)......取自/usr/src/nvidia-435.21/nvidia/nv-reg.h
: