NVIDIA Optimus (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи NVIDIA Optimus. Дата последней синхронизации: 16 января 2017. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

NVIDIA Optimus - технология, которая дает интегрированной графике Intel и дискретной Nvidia работать сообща в лаптопах. Чтобы заставить Optimus работать в Arch Linux потребуется сделать несколько непростых шагов, описанных ниже. Вот доступные решения:

  • #Отключить один из GPU в BIOS, что увеличит продолжительность работы батареи, если отключить чип Nvidia. Но это невозможно сделать в некоторых BIOS.
  • Использование официальной поддержки Optimus включенной в проприетарный драйвер Nvidia, который предоставит хороший опыт работы, в сравнении с nouveau, с картами Nvidia, но не поддерживает переключения GPU и содержит больше ошибок.
  • #Используя PRIME Render Offload - официальный метод NVIDIA для поддержки переключаемой графики.
  • #Используя nouveau - эти драйвера поддерживают переключение GPU, но предоставляют более низкую производительность, чем проприетарный драйвер Nvidia, также, до сих пор, не реализовано никакого энергосбережения. Не работают с новейшими Nvidia GPU.
  • #Используя Bumblebee - решения сторонних разработчиков для реализации функционала подобного Optimus, поддерживающего переключение GPU и энергосбережение, но требующего более тонкой настройки.

Отключить один из GPU

Если требуется использовать только один из видеоадаптеров, проверьте опции BIOS. Найдите опцию, отключающую один из них. Некоторые лаптопы поддерживают отключение только одного из чипов. Если необходимо использовать обе видеокарты или невозможно отключить ту, что не нужна ищите решение ниже.

Используя драйвера Nvidia

Проприетарный драйвер Nvidia не поддерживает динамического переключения в отличие от nouveau. В наличии проблемы с тирингом, о которых Nvidia знает, но не спешит исправлять. Однако, эти драйвера предоставляют более высокую производительность в сравнении с драйверами nouveau.

Первым делом, установите пакеты nvidia, nvidia-libgl и xorg-xrandr из официальных репозиториев. После настройте xorg.conf. Узнайте PCI адрес карты Nvidia, для этого введите:

$ lspci | grep -E "VGA|3D"

PCI адрес выглядит примерно так 01:00.0. В xorg.conf, отредактируйте 01:00.0 на 1:0:0.

Примечание: Начиная с Xorg-server 1.17-1 FS#43830 связана с модулем modesetting сохраняющимся в конфигурациях Optimus. Решением для некоторых систем является установка Option "AccelMethod" в "none" как описано ниже. Для других же подойдет "sna", смотреть #Альтернативная конфигурация.
Примечание: В некоторых системах эта настройка нарушает автоматическое определение параметров монитора драйверами nvidia через файл EDID. В таком случае смотрите #EDID errors in Xorg.log.

Если X.ORG X сервер версии 1.17.2 и выше:

/etc/X11/xorg.conf
Section "Module"
    Load "modesetting"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "тут>"
    Option "AllowEmptyInitialConfiguration"
EndSection

Для более старых версий X сервера:

/etc/X11/xorg.conf
Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia"
    Inactive "intel"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    # При необходимости измените BusID.
    BusID "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Option "AllowEmptyInitialConfiguration" "Yes"
EndSection

Section "Device"
    Identifier "intel"
    Driver "modesetting"
    # При необходимости измените BusID.
    BusID "PCI:0:2:0"
    Option "AccelMethod" "none"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Далее добавьте в начало ~/.xinitrc две строки:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Теперь перезагрузитесь для запуска драйверов и X. Если dpi дисплея не верный добавьте строку:

xrandr --dpi 96

Если при загрузке X появился черный экран, удостоверьтесь, что в файле ~/.xinitrc нет & перед xrandr. Если & есть, то видимо оконный менеджер запускается раньше, чем команда xrandr завершает выполнение, что и приводит к черному экрану.

Если черный экран еще есть, смотрите #Альтернативная конфигурация ниже.

Альтернативная конфигурация

Если возникли сбои в работе Xorg-server 1.17.1 и выше с описанной выше конфигурацией, измените раздел для Intel в /etc/X11/xorg.conf как показано ниже:

/etc/X11/xorg.conf
Section "Device"
    Identifier "intel"
    Driver "modesetting"
    BusID "PCI:0:2:0"
    Option "AccelMethod" "sna"
    #Option "TearFree" "True"
    #Option "Tiling" "True"
    #Option "SwapbuffersWait" "True"
EndSection

Как указано выше BusID должен совпадать с выводом lspci. Найдите строку с "VGA compatible controller", которая содержит "Intel". Например: $ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)

Если X запустился, но на экране ничего не происходит, проверьте содержит ли /var/log/xorg.conf подобную строку:

/var/log/xorg.conf
[ 16112.937] (EE) Screen 1 deleted because of no matching config section.

Если да, проблема может исчезнуть при добавлении раздела ServeLayout в /etc/X11/xorg.conf

/etc/X11/xorg.conf
Section "ServerLayout"
    Identifier "layout"
    Screen 1 "nvidia"
    Inactive "intel"
EndSection

Экранные менеджеры

При использовании менеджеров входа, создайте или отредактируйте скрипт настройки вместо использования ~/.xinitrc.

LightDM

Для LightDM:

/etc/lightdm/display_setup.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Сделайте этот скрипт выполняемым:

# chmod +x /etc/lightdm/display_setup.sh

Теперь настройте LightDM для запуска скрипта, отредактировав раздел [Seat:*] в /etc/lightdm/lightdm.conf:

/etc/lightdm/lightdm.conf
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

Теперь перезагрузитесь и DM запуститься.

SDDM

/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

Для GDM создайте новый файл .desktop:

/usr/share/gdm/greeter/autostart/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

Удостоверьтесь, что GDM использует X как стандартный бэкенд.

Проверка 3D

Для проверки работает ли чип Nvidia установите mesa-demos и запустите:

$ glxinfo |grep NVIDIA

Проблемы

Тиринг и неработающий VSync

Для решения проблемы необходим xorg-server 1.19 или выше, ядро linux 4.5 или выше и nvidia 370.23 или выше. Затем включите "DRM kernel mode setting", что, в свою очередь, включит синхронизацию PRIME и исправит разрывы изображения.

См. также подробности в обсуждении на официальном форуме.

Также есть отчёт, что ядро linux 5.4 нарушает синхронизацию PRIME.

EDID errors in Xorg.log

Эта ошибка возникает когда драйвер nvidia не определяет EDID для дисплея. Необходимо вручную указать путь к файлу EDID или предоставить ту же информацию подобным образом.

Для предоставления пути к файлу EDID отредактируйте раздел "Device" для NVIDIA в Xorg.conf, добавив эти строки. Не забудьте изменить поля в соответствии с вашей системой:

/etc/X11/xorg.conf
Section "Device"
    Option "ConnectedMonitor" "CRT-0"
    Option "CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
    Option "IgnoreEDID" "false"
    Option "UseEDID" "true"
EndSection

Если Xorg не запускается попробуйте поменять ссылки CRT на DFB. card0 это идентификатор чипа Intel, который подключен к дисплею с помощью LVDS. Если расположение аппаратных средств отличается, значение пользовательского EDID может быть другим. Путь же будет начинаться с /sys/class/drm.

Используя nouveau

Свободные драйвера nouveau (xf86-video-nouveau)могут динамически переключаться с драйвером Intel (xf86-video-intel) используя технологию PRIME. Для более подробной информации смотрите PRIME.

Используя Bumblebee

Если хотите использовать Bumblebee, который поддерживает энергосбережение и другие полезные функции, смотрите Bumblebee.

Используя PRIME Render Offload

С выходом драйвера NVIDIA версии 435.17 появилась возможность использовать PRIME Render Offload. xf86-video-modesetting, xf86-video-amdgpu (450.57), и xf86-video-intel (455.38) официально поддерживаются как iGPU драйвера.

Использование

Чтобы запустить программу на карточке от NVIDIA, вы можете использовать prime-run - скрипт из nvidia-prime:

$ prime-run glxinfo | grep "OpenGL renderer"
$ prime-run vulkaninfo

Можно писать всё вручную, к примеру, запуск Firefox:

$ __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME="nvidia" __VK_LAYER_NV_optimus="NVIDIA_only" firefox

Тот же запуск, но с использованием nvidia-prime:

$ prime-run firefox

Также доступен пакет primeAUR, который содержит в себе уже настроенный файл xorg.conf (Русский). Пример использования:

$ prime firefox

Решение проблем

Если по какой-либо причине автоматическая конфигурация не работает, то отредактируйте файл xorg.conf:

/etc/X11/xorg.conf.d/20-nvidia.conf
Section "ServerLayout"
    Identifier     "Layout0"
    Option         "AllowNVIDIAGPUScreens"
    Screen      0  "iGPU" 0 0
EndSection

Section "Device"
    Identifier     "iGPU"
    Driver         "modesetting"
    BusID          "PCI:0:2:0" #Проверьте BusID
EndSection

Section "Device"
    Identifier     "dGPU"
    Driver         "nvidia"
    BusID          "PCI:1:0:0" #Проверьте BusID
EndSection

Section "Screen"
    Identifier     "iGPU"
    Device         "iGPU"
    DefaultDepth    24
    SubSection     "Display"
    Viewport        0 0
    EndSubSection
EndSection

Section "OutputClass"
    Identifier     "iGPU"
    MatchDriver    "i915"
    Driver         "modesetting"
EndSection

Section "OutputClass"
    Identifier     "dGPU"
    MatchDriver    "nvidia-drm"
    Driver         "nvidia"
    Option         "AllowEmptyInitialConfiguration"
    Option         "PrimaryGPU" "yes"
    ModulePath     "/usr/lib/nvidia/xorg"
    ModulePath     "/usr/lib/xorg/modules"
EndSection

Проверьте, что загрузились оба модуля видеокарт:

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x29d cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 2 associated providers: 0 name:modesetting
Provider 1: id: 0x278 cap: 0x0 crtcs: 0 outputs: 0 associated providers: 0 name:NVIDIA-G0

См. официальную инструкцию по настройке для получения более подробной информации.

Если у вас установлен пакет bumblebee, вам следует убрать его, потому что он блокирует драйвер nvidia_drm, который необходим для загрузки драйвера nvidia X сервером для разгрузки (offloading).

Не запускается модуль Nvidia

$ grep /var/log/Xorg.0.log -e "EE" -e "WW"
(EE) NVIDIA(0): Use the -ignoreABI option to override this check.
(EE) Failed to load module "nvidia" (module requirement mismatch, 0)

Это можно решить, добавив в xorg.conf следующие строки:

Section "ServerFlags"
    Option         "IgnoreABI" "1"
EndSection

Некорректная работа графического окружения

Иногда возникают различные ошибки связанные с использованием драйвера modesetting. Для решения таких проблем можно использовать драйвер intel или другие.

Основное требование к драйверу — использование и поддержка модуля Glamor.

Тогда блок конфигурации видеокарты Intel c драйвером intel будет выглядеть следующим образом.

/etc/X11/xorg.conf.d/20-nvidia.conf
Section "ServerLayout"
    Identifier     "Layout0"
    Option         "AllowNVIDIAGPUScreens"
    Screen      0  "iGPU" 0 0
EndSection

Section "Device"
     Identifier     "iGPU"
     Driver         "intel" # Предпочтительный драйвер
     BusID          "PCI:0:2:0" # Проверьте BusID
     Option         "AccelMethod"  "glamor" # Предпочтительный модуль
EndSection

Section "Device"
    Identifier     "dGPU"
    Driver         "nvidia"
    BusID          "PCI:1:0:0" # Проверьте BusID
EndSection

Section "Screen"
    Identifier     "iGPU"
    Device         "iGPU"
    DefaultDepth    24
    SubSection     "Display"
    Viewport        0 0
    EndSubSection
EndSection

Проверьте, что загрузились оба модуля видеокарт:

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x29d cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 2 associated providers: 0 name:modesetting (или Intel)
Provider 1: id: 0x278 cap: 0x0 crtcs: 0 outputs: 0 associated providers: 0 name:NVIDIA-G0