混合显卡
混合显卡 (Hybrid-graphics) 是指同一台计算机上配备两个显卡的概念。笔记本电脑制造商开发了在单台计算机上结合不同能力和功耗的两种显卡的技术。混合显卡旨在通过在不需要独立显卡的 3D 渲染性能时将其保持在非活动状态,而使用集成显卡,从而同时支持高性能和省电两种使用场景。
目前存在多种技术,每个制造商都开发了自己的解决方案。这项技术在 Windows 上得到了很好的支持,但在 Linux 发行版中仍然不够完善。本文将尝试简要解释每种方法,并描述针对供应商缺乏 GNU/Linux 系统支持的一些社区解决方案。
动态切换
大多数新型混合显卡技术涉及两块显卡:独立显卡和集成显卡都连接到一个帧缓冲 (framebuffer),且没有硬件多路复用器。集成显卡始终开启,而独立显卡则根据省电或性能渲染的需求而开启/关闭。在大多数情况下,无法仅使用独立显卡,所有的切换和渲染都由软件控制。在启动时,Linux 内核开始使用一种视频模式并设置底层的图形驱动程序,供应用程序使用。大多数 Linux 发行版随后使用 X.org 来创建图形环境。最后,启动其他一些软件,首先是登录管理器,然后是窗口管理器,依此类推。这种分层系统在大多数情况下被设计为在单块显卡上运行。
完全关闭独立显卡电源
您可能希望关闭高性能图形处理器以节省电池电量。
使用 BIOS/UEFI
一些笔记本电脑制造商在 BIOS 或 UEFI 中提供了一个开关,用于完全禁用独立显卡。
使用 udev 规则
确保删除了所有针对 NVIDIA 的显示管理器配置。
通过创建以下文件将 nouveau 驱动程序加入黑名单
/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau options nouveau modeset=0
然后创建
/etc/udev/rules.d/00-remove-nvidia.rules
# Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
# Remove NVIDIA USB Type-C UCSI devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"
# Remove NVIDIA Audio devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"
# Remove NVIDIA VGA/3D controller devices
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1"
重启并运行 lspci,查看您的 NVIDIA GPU 是否仍列在其中。
检查功耗以确保您的 GPU 没有耗电,如果仍在耗电,#使用 acpi_call 可能是完全关闭电源的另一种选择。
使用 bbswitch
对于 NVIDIA GPU,可以使用 bbswitch 更安全地完成此操作。它包含一个内核包,可以在不需要独立显卡时或在启动时自动发出正确的 ACPI 调用来禁用它。
使用 acpi_call
除此之外,对于 bbswitch 不支持的 GPU,可以通过手动安装 acpi_call 包来实现同样的效果。
安装完成后,加载内核模块
# modprobe acpi_call
加载内核模块后,执行脚本 /usr/share/acpi_call/examples/turn_off_gpu.sh
该脚本将遍历所有已知的数据总线并尝试关闭它们。您将获得类似于以下内容的输出
# /usr/share/acpi_call/examples/turn_off_gpu.sh
Trying \_SB.PCI0.P0P1.VGA._OFF: failed Trying \_SB.PCI0.P0P2.VGA._OFF: failed Trying \_SB_.PCI0.OVGA.ATPX: failed Trying \_SB_.PCI0.OVGA.XTPX: failed Trying \_SB.PCI0.P0P3.PEGP._OFF: failed Trying \_SB.PCI0.P0P2.PEGP._OFF: failed Trying \_SB.PCI0.P0P1.PEGP._OFF: failed Trying \_SB.PCI0.MXR0.MXM0._OFF: failed Trying \_SB.PCI0.PEG1.GFX0._OFF: failed Trying \_SB.PCI0.PEG0.GFX0.DOFF: failed Trying \_SB.PCI0.PEG1.GFX0.DOFF: failed Trying \_SB.PCI0.PEG0.PEGP._OFF: works! Trying \_SB.PCI0.XVR0.Z01I.DGOF: failed Trying \_SB.PCI0.PEGR.GFX0._OFF: failed Trying \_SB.PCI0.PEG.VID._OFF: failed Trying \_SB.PCI0.PEG0.VID._OFF: failed Trying \_SB.PCI0.P0P2.DGPU._OFF: failed Trying \_SB.PCI0.P0P4.DGPU.DOFF: failed Trying \_SB.PCI0.IXVE.IGPU.DGOF: failed Trying \_SB.PCI0.RP00.VGA._PS3: failed Trying \_SB.PCI0.RP00.VGA.P3MO: failed Trying \_SB.PCI0.GFX0.DSM._T_0: failed Trying \_SB.PCI0.LPC.EC.PUBS._OFF: failed Trying \_SB.PCI0.P0P2.NVID._OFF: failed Trying \_SB.PCI0.P0P2.VGA.PX02: failed Trying \_SB_.PCI0.PEGP.DGFX._OFF: failed Trying \_SB_.PCI0.VGA.PX02: failed
看到 "works" 了吗?这意味着脚本找到了您的 GPU 所在的总线,并且现在已经关闭了芯片。为了确认这一点,您的电池剩余使用时间应该有所增加。
自动关闭 GPU
目前,芯片在下次重启时会重新开启。为了解决这个问题,请在启动时加载模块
/etc/modules-load.d/acpi_call.conf
#Load 'acpi_call.ko' at boot. acpi_call
在启动时
要在启动时关闭 GPU,可以使用 systemd-tmpfiles。
/etc/tmpfiles.d/acpi_call.conf
w /proc/acpi/call - - - - \\_SB.PCI0.PEG0.PEGP._OFF
上述配置将在启动时由 systemd 加载。它的作用是将特定的 OFF 信号写入 /proc/acpi/call 文件。显然,请将 \_SB.PCI0.PEG0.PEGP._OFF 替换为您系统中有效的信号(请注意,您需要对反斜杠进行转义)。
在 X server 初始化之后
在某些系统上,在 X server 初始化之前关闭独立显卡可能会导致系统挂起。在这种情况下,在 X server 初始化之后禁用 GPU 可能会更好,某些显示管理器可以实现这一点。例如,在 LightDM 中,可以使用 display-setup-script seat 配置参数来以 root 身份执行禁用 GPU 的脚本。如果您使用 SDDM,则可以根据您使用 Wayland 还是 Xorg,将 echo "\_SB.PCI0.PEG0.PEGP._OFF" > /proc/acpi/call 这一行添加到 /usr/share/sddm/scripts/wayland-session 或 /usr/share/sddm/scripts/Xsession 中,并将 \_SB.PCI0.PEG0.PEGP._OFF 替换为您系统中有效的信号。
System76
某些 System76 笔记本电脑(如 Oryx Pro)拥有独特的混合显卡选项。要使用它,请安装 system76-powerAUR,启用 system76-power.service,并运行 system76-power graphics hybrid。
完全关闭独立显卡电源
首先通过运行 system76-power graphics integrated 并重启,确保您处于集成显卡模式。进入集成模式后,运行 system76-power graphics power off 以关闭独立显卡电源。此命令是非持久性的,每次启动后都需要运行。
故障排除
某些应用程序的启动时间延迟 30 秒
当被调用时,Vulkan 会尝试初始化在 /usr/share/vulkan/icd.d/nvidia_icd.json 中指定的安装客户端驱动程序 (ICD)。nvidia-utils 包配置此文件以引用 libGLX_nvidia 驱动程序,从而向 Vulkan 提供 GPU 驱动程序的路径信息。然而,如果 GPU 被禁用,此驱动程序的初始化将失败,导致某些应用程序(例如基于 Chromium/Electron 的程序)启动延迟,直到达到 30 秒的超时时间。为了防止 Vulkan 尝试加载驱动程序,从而缓解此超时,您可以使用 VK_DRIVER_FILES 环境变量 覆盖 ICD JSON 文件的位置。要取消设置它,请使用
$ export VK_DRIVER_FILES=
禁用 NVIDIA 独立显卡后功耗仍然很高
如果在禁用独立 GPU 总线 #使用 acpi_call 后功耗仍然很高,请使用 lsmod 检查 nouveau 内核模块是否已加载。如果没有加载,请确保它已安装,且 /etc/modprobe.d/ 中任何将 Nouveau 列入黑名单的 .conf 文件条目已被删除,并且 Nouveau 内核模块在启动时被自动加载。重启后,功耗应该会降低。