Эта инфа есть в Gentoo Wiki и Arch Wiki, но всё равно тема с завидной регулярностью поднимается на ЛОРе. Поэтому я решил написать об этом здесь. Красивой переключалки не будет: только правкой конфигов.
Практическая часть
Убедитесь что версия вашего ядра Linux ≥ 3.13, X-Server ≥ 1.13, xrandr ≥ 1.4, драйвера NVIDIA ≥ 319.xx. Версию ядра Linux, минимально необходимую для NVIDIA Prime, подняли в драйвере 364.xx: раньше была 3.9.
Создайте /etc/X11/xorg.conf
со следующим содержимым:
Section "ServerLayout"
Identifier "layout"
Screen 0 "nvidia"
Inactive "intel"
EndSection
Section "Device"
Identifier "intel"
Driver "modesetting"
Option "AccelMethod" "none"
BusID "PCI:0:2:0"
EndSection
Section "Screen"
Identifier "intel"
Device "intel"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "1:0:0"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Screen"
Identifier "nvidia"
Device "nvidia"
Option "UseDisplayDevice" "none"
EndSection
Вместо PCI:1:0:0 и PCI:0:2:0 подставьте свои значения, узнав их с помощью lspci
. Чаще всего, значения именно эти.
Добавьте в конфиг-файл своего графического менеджера входа в систему эти команды:
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
GDM:
Файл /etc/X11/gdm/Init/Default
, просто добавьте в конец, перед «exit 0»
KDM:
Файл /usr/share/config/kdm/Xsetup
, просто добавьте в конец.
LightDM:
Создайте файл /etc/lightdm/display_setup.sh
со следующим содержимым:
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
Выполните chmod +x /etc/lightdm/display_setup.sh
.
В файле /etc/lightdm/lightdm.conf
найдите секцию [Seat:*]
, а в нём display-setup-script=
. Добавьте/раскомментируйте эту строку, затем приведите к виду:
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh
Остальные графические менеджеры входа в систему
https://wiki.gentoo.org/wiki/NVIDIA/Optimus#Display_manager_configuration,
https://wiki.archlinux.org/index.php/NVIDIA_Optimus#Display_Managers
Решение бага с обрезанным экраном в Minecraft
В Minecraft, при нажатии клавиши F11, включается полноэкранный режим. С приведённым мной конфигом, вы увидите прямоугольник 640x480, и чёрный экран на остальной площади. С другими полноэкранными играми такого бага нет.
Я нашёл решение проблемы, когда читал Xorg.0.log
. Виртуальный экран стартует с разрешением 640x480, затем пробрасывается на Intel, затем меняет размер на реальный. Нужно сделать так, чтобы виртуальный экран создался сразу с нужным разрешением.
В xorg.conf в секцию «„Screen“, Identifier „nvidia“», добавьте это (поменяв моё разрешение на ваше):
SubSection "Display"
Virtual 1600 900
EndSubSection
Теоретическая часть
В 2010 году появились ноутбуки с технологией NVIDIA Optimus. Это гибридная графика: в ноутбуке установлено два видеочипа - Intel и NVIDIA - работающие в связке. Когда нужен слабый 3D-рендеринг (эффекты рабочего стола, офисные игры, казуальные игры, опенсорсные игры) используется Intel. Когда нужен сильный 3D-рендеринг, используется NVIDIA. Работают они по-очереди: пока один выводит графику, другой «спит».↓ Вот вся суть в одной наклейке: если бы NVIDIA умела потреблять так мало энергии, то устанавливали бы только этот чип. Если бы Intel мог выдавать столько производительности, то ставили бы только его.
Это не первое поколение гибридной графики от NVIDIA: помните ещё был NVIDIA ION?↓
В Windows, чтобы использовать гибридную графику, необходим новый графический стек, который появился в Windows Vista. Помните такой? Как много было новостей в игровой и айти-прессе о том, как трудно на него переходят. Однако я ни разу не видел драйверов Optimus с поддержкой Vista: ION да, а Optimus - только 7 и новее.
А в Windows XP вам достаётся только видеочип Intel. На ноутбуках с ION можно было выбрать видеочип в BIOS, и пользоваться им в WinXP. Но в Optimus NVIDIA и не имеет физического вывода на монитор, а только записывает данные в видеопамять чипа Intel.
В Linux мы имели картину, аналогичную Windows XP. С тем лишь отличием, что в WinXP инсталлятор драйвера говорил, что чип не поддерживается в этой системе. А в Linux предлагал запустить себя с параметром --no-opengl-files
, чтобы пользоваться CUDA и OpenCL (фактически, использовать чип NVIDIA в качестве сопроцессора). Это отличие говорит о том, что NVIDIA имела планы реализовать Optimus в Linux. Намёк на это давался в этом интервью: «отсутствие разгона на последней серии видеокарт - это следствие расставления приоритетов. Нам важнее реализовать поддержку XRandr 1.2 и новее, чем это». Как выяснилось позже, XRandr 1.2 и новее был нужен NVIDIA именно для Оптимуса.
Затем появилась гибридная графика от AMD. Обычно это был Mobility Radeon 4250 + что-нибудь крутое. В Catalyst для Linux можно было выбрать, через какой из чипов выводить: энергосберегающий или производительный. Чтобы применить изменения, нужно было перезапустить X-Server.
В середине 2011 года появилась прога под названием Bumblebee. Это программа от сторонних разработчиков (не NVIDIA), реализующая Optimus очень просто. На чипе NVIDIA включается виртуальный дисплей. На него выводится игра, или что вам там нужно? С помощью проги VirtualGL прямоугольник с игрой пробрасывается на реальный экран, подключенный к чипу Intel. Всё просто.
NVIDIA изменила сообщение, выводимое официальным инсталлятором в Linux при попытке запустить его на ноутбуке с Optimus-ом. «Используйте Bumblebee».↓
В 2012 году появился целый ряд технологий, явно направленных на работу гибридной графики в Linux, и для NVIDIA Optimus в том числе. DRI3, DMA-BUF, DRI-PRIME.
В 2013 году состоялся релиз драйвера NVIDIA 319.xx, начиная с которого поддержка Optimus была официально. Однако многие остались на Bumblebee: технология NVIDIA Prime (назовём её так) поддерживала только использование второго GPU как основного, но не переключаемую графику. А Bumblebee поддерживает и переключаемую графику тоже.
А опенсорсные драйверы intel, radeon и nouveau поддерживают запуск игры таким образом:
$ glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on NV1
В настоящее время происходит внедрение в дистрибутивы Linux технологии glvnd, которая позволит делать то же самое с проприетарным драйвером NVIDIA.
А пока рассмотрим то, что есть. Итак, вам по какой-то причине не нравится Bumblebee, и вы решили попробовать NVIDIA Prime. Однако только в Ubuntu Linux это делается в один клик мышью (картинка очень похожа на Catalyst по ссылке выше, не находите?), а в остальных дистрибутивах Linux нужно конфиги править. Давайте разберёмся, какие и как.
Что почитать?
http://ru.download.nvidia.com/XFree86/Linux-x86_64/384.69/README/randr14.html
https://github.com/Bumblebee-Project/Bumblebee/wiki/History-of-the-project
https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/post/4964506/#4964506 Важная информация ↓
https://wiki.gentoo.org/wiki/NVIDIA/Optimus
https://wiki.archlinux.org/index.php/NVIDIA_Optimus