Hybrid graphics (Русский)
Гибридная графика - это концепция, предполагающая использование двух графических карт на одном компьютере. Производители ноутбуков разработали технологии, предусматривающие использование двух графических карт с разными возможностями и энергопотреблением на одном компьютере. Гибридная графика была разработана для поддержки как высокой производительности, так и энергосбережения за счет неактивности выделенного/дискретного графического процессора, если не требуется производительность 3D-рендеринга по сравнению с интегрированным графическим процессором.
Существует множество технологий, и каждый производитель разработал свое собственное решение этой проблемы. Эта технология хорошо поддерживается в Windows, но в дистрибутивах Linux она еще не получила должной поддержки. В этой статье мы попытаемся немного рассказать о каждом подходе и описать некоторые решения сообщества, связанные с отсутствием поддержки GNU/Linux систем производителями.
Динамическое переключение
Большинство новых технологий гибридной графики предполагают использование двух графических карт: выделенная и интегрированная карты подключаются к фреймбуферу, при этом аппаратный мультиплексор отсутствует. Интегрированная карта всегда включена, а выделенная карта включается/выключается, когда есть необходимость в энергосбережении или рендеринге производительности. В большинстве случаев нет возможности использовать только выделенную карту, и все переключения и рендеринг контролируются программно. При запуске ядро Linux начинает использовать видеорежим и устанавливать низкоуровневые графические драйверы, которые будут использоваться приложениями. Большинство дистрибутивов Linux затем используют X.org для создания графической среды. Наконец, запускается несколько других программ, сначала менеджер входа в систему, затем оконный менеджер и так далее. Эта иерархическая система была разработана для использования в большинстве случаев на одной графической карте.
Полное отключение питания дискретного GPU
Вы можете отключить высокопроизводительный графический процессор для экономии заряда батареи.
Использование 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 в списке.
Использование bbswitch
С графическим процессором NVidia это можно сделать более безопасно, используя bbswitch, который состоит из пакета ядра, автоматически выдающего правильные вызовы ACPI для отключения дискретного GPU, когда он не нужен, или автоматически при загрузке.
Использование acpi_call
В противном случае, а также для GPU, не поддерживаемых bbswitch, это можно сделать вручную, установив пакет 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, и теперь отключил чип. Чтобы подтвердить это, оставшееся время работы батареи должно увеличиться.
Автоматическое выключение графического процессора
В настоящее время чип включается при следующей перезагрузке. Чтобы обойти это, добавьте модуль ядра в массив модулей, загружаемых при загрузке:
/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-сервера
В некоторых системах отключение дискретного GPU до инициализации X-сервера может привести к зависанию системы. В таких случаях лучше отключить GPU после инициализации X-сервера, что возможно с некоторыми экранными менеджерами. В LightDM, например, параметр конфигурации места display-setup-script можно использовать для выполнения скрипта от имени root, который отключает GPU.
System76
Некоторые ноутбуки System76 (например, Oryx Pro) имеют собственную уникальную опцию гибридной графики. Чтобы воспользоваться ею, установите system76-powerAUR, включите system76-power.service
и запустите system76-power graphics hybrid
.