Nvidia

Материал из ALT Linux Wiki

Настройка видеокарт Nvidia

Постановка вопроса

На сегодня видеокарты от Nvidia являются одними из самых распространённых. Поддержка карт Nvidia в Linux может осуществляться следующими «драйверами» — модулями Xorg.

  • Свободным модулем vesa — настолько, насколько данная видеокарта поддерживает спецификацию vesa.
  • Модулем поддержки фреймбуфера — fbdev.
  • Свободным модулем nv — поддерживаются не все видеокарты, нет поддержки аппаратного 3D (как и у vesa и у fbdev)
  • Свободным модулем nouveau с поддержкой 3D. Eсть в Сизифе, но модуль ещё сырой.
  • Проприетарные модули Nvidia.

На сегодняшний день политика компании Nvidia такова, что она разделила все свои видеокарты на 5 групп.

В зависимости от того, какая видеокарта, можно ставить один из поддерживающих её драйверов. Современный пакет kernel-modules-nvidia включает в себя несколько версий модулей ядра nvidia. Выбор того или иного ядра для соответствующей видеокарты осуществляется на основе содержимого файлов /usr/share/hwdatabase/videoaliases/nvidia-XXX.YYY.xinf, где XXX.YYY версия ядра nvidia, входящие в пакеты nvidia_glx_XXX.YYY и предоставляемые фирмой Nvidia.

В случае, если не одна из версий ядра не поддерживает вашу видеокарту, надо использовать свободный драйвер nouveau. Xorg автоматически пытается подобрать наилучший видеодрайвер. Для работы видеодрайвера nvidia необходимо, чтобы был загружен модуль ядра nvidia. Для работы видеодрайвера nouveau, нужно, чтобы был загружен модуль ядра nouveau. Если не загружен ни тот и не другой, то xorg будет пытаться использовать fbdev, vesa или nv, если ничто не получится, xorg (графика) отключится и надо будет в консоле от root исправить проблему.

Для того, чтобы посмотреть какие модули ядра загружены, можно использовать от root команду lsmod, например:

# lsmod | grep nvid
 
# lsmod | grep nouve

Для того чтобы посмотреть, какой видеодрайвер используется, можно выполнить команды (предварительно установив при необходимости одноимённые пакеты ):

# lshw - c Display

или

 $ inxi -G

Смена открытых драйверов на проприетарные

Примечание:

Для перехода с nouveau на nvidia рекомендуется сначала обновить ядро:

$ su -l root
# update-kernel

После перезагрузки выполнить команды:

$ uname -r

Убедиться, что это свежее ядро. После этого выполнить команды:

$ su -l root
# rpm -e $(rpm -qf `modinfo -F filename nouveau`)
# apt-get install nvidia_glx_common && nvidia-install-driver
# make-initrd
Внимание! Не следует запускать фирменный инсталятор драйвера NVIDIA из .run-файла!


После этого стоит перезагрузиться. Xorg сам пытается загрузить наилучший драйвер. Лог последнего запуска xorg находится в /var/log/Xorg.0.log.

Смена проприетарных драйверов на открытые

Шаг 0. Обновляем систему и ядро до текущего состояния репозитория, как описано выше.

Шаг 1. Заходим в терминале под пользователем root.

Шаг 2. Устанавливаем открытый драйвер в конфигурационном файле /etc/X11/xorg.conf.d/10-monitor.conf . Для этого можно воспользоваться утилитой xsetup-monitor.

Пользователям nvidia необходимо выполнить следующую команду

# xsetup-monitor -d nouveau

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

Шаг 3. Удаляем при необходимости файл /etc/modprobe.d/blacklist-alterator-x11

# rm -f /etc/modprobe.d/blacklist-alterator-x11

Шаг 4. Перезагружаем компьютер.

Шаг 5. Выполняем команду make-initrd

# make-initrd 

При следующей загрузке сплэш должен заработать.

Замена драйверов nouveau/nvidia "на лету"

Постановка задачи

Была поставлена задача загружать два ядра с разными модулями :

Ядро std-def c драйвером nvidia, а ядро un-def с драйвером nouveau.

В процессе исследования, выяснилось, что если загружен ядерный модуль nouveau или nvidia - xorg сам находит и загружает нужный видео драйвер, без указания его в конфигурационных файлах xorg.

Реализация

  • Устанавливаем в оба ядра модули nvidia и nouveau.
  • Создаём файл /etc/modprobe.d/blacklist-nvidia-x11.conf и записываем туда:
blacklist nvidia
blacklist nouveau
  • Удаляем, если есть в файлах конфигурации все упоминания о том, какой драйвер применяется — nvidia или nouveau.[1]
  • Создаём файл /etc/rc.d/rc.local следующего содержания:
#!/bin/bash


if [ -n `uname -r | grep std-def` ];then
    modprobe nvidia
else
    modprobe nouveau
fi

Всё - можно перезагружаться - при выборе ядра un-def у нас теперь используется свободный драйвер nouveau, при использовании std-def используется проприетарный модуль nvidia.[2] [3] [4]

Ссылки по теме:

  1. Если в файле ничего кроме этого ценного нет, то можно и сам файл удалить
  2. Теоретически этот метод можно применять и в других случаях, например с fflrx/radeon
  3. Это можно применять и с одним ядром, для быстрого перехода с свободного драйвера на проприетарный и обратно, просто отредактировав файл /etc/rc.d/rc.local
  4. Это можно применять и совсем в другом случае, например при подборе нужного модуля Wifi из серии v43 / b44 / wl

Краткий алгоритм установки драйверов серии legacy

Данный алгоритм устарел. В современном Сизифе всё это делается скриптами, но если произошёл сбой в их работе, вы можете сделать эти операции за них.

С недавнего времени xorg-x11-server-1.4 модули legacy вошли в основной пакет Nvidia. Как поменять текущий модуль ядра (все операции требуют прав root)?

  • Выключаем X-ы, например telinit 3,
  • Выгружаем модуль nvidia: rmmod nvidia,
  • Меняем символическую ссылку, например ln -s /lib/modules/nvidia/{версия ядра} /lib/modules/{версия ядра}/nVidia/nvidia.ko,
  • Прописываем в /lib/modules/{версия ядра}/.versions/nvidia: 1.0.9639,
  • depmod -a,
  • modprobe nvidia,
  • Проверяем, что в xorg.conf прописан модуль nvidia,
  • x11setupdrv, (начиная с ALT 5.0 и выше не нужно, т.к. скрипт встроен в запуск X-сервера)
  • Запускаем X-ы, например telinit 5.
{версия ядра} — это та версия, в которой вы хотите настроить работу драйверов Nvidia.


Возможные баги

Иногда (при смене версий пакетов и расхождении ABI ) xorg-x11-server требует, чтобы в /etc/X11/xinit/xserverrc было прописано:

X_server='X -nolisten tcp -ignoreABI'

вместо

X_server='X -nolisten tcp'

Второй способ — в /etc/x11/xorg.conf добавить опцию:

Section "ServerFlags"
  Option         "IgnoreABI" "true"
EndSection

Третий, и наиболее правильный способ в дистрибутивах на основе бранча p7 и выше в /etc/sysconfig/xserver раскомментировать IGNORE_ABI=yes:

# The Xorg server checks the ABI revision levels of each module that it loads.
# It will normally refuse to load modules with ABI revisions that are newer
# than the server's.
# See Xorg(1) for more information about option.
# Value: yes/no
IGNORE_ABI=yes

Видеокарты типа Optimus

В последнее время появились ноутбуки с несколькими видеокартами (Nvidia+Intel или Radeon+Intel).

Для таких видеокарт существует инструкция по подключению и следующая информация:

  • По умолчанию монитор показывает картинку с Intel GPU.
  • В зависимости от реализации может быть или отсутствовать возможность переключения сигнала между GPU, при этом в новых ноутбуках обычно её нет физически
  • Если переключение физически есть, соответствующая настройка может быть или отсутствовать в BIOS (в последнем случае может пригодиться всякое switcheroo).
  • Отсутствие переключателя в BIOS заменяется программным Bumblebee или собратьями.
  • Задействовать Optimus (чип nvidia или ati) можно через VirtualGL.

В нормальных ноутах в BIOS может быть 3 положения переключателя видеокарты: встроенная, optimus и дискретная (nvidia,ati). Здесь достаточно прикрутить программный переключатель, если устроит перезагрузка для переключения X-ов на другую видеокарту (без optimus вообще).

Проприетарный libGL/libglx и память

История вопроса: в списке рассылки Community и altbug #25609.

Суть: при установке проприетарных драйверов происходит подмена GL-библиотек на проприетарные. По непонятной причине многие скомпилированные с libGL программы и библиотеки (в особенности libcairo) потребляют на 10-20 мегабайт (!) RSS больше. Вот небольшой кусок для сравнения (смотрим на gimp, script-fu и nm-appleti, вторая колонка — это RSS):

$ tail ps-e-n*
==> ps-e-nouveau <==
ahttpd           7180 145444  0.0
script-fu        7920 189864  0.0
polkitd         10560 505520  0.0
colord          11388 216252  0.0
nm-applet       17084 805108  0.1
X               28152 122200  0.1
gimp            63512 671152  0.3
==> ps-e-nvidia <==
ahttpd           7176 145444  0.0
colord           8900 216084  0.0
polkitd         10560 505520  0.0
script-fu       28404 227524  0.1
nm-applet       39252 846136  0.2
X               53104 149612  0.3
gimp            85412 1104308  0.5

По ссылке видно, что в XFCE может набежать порядка 300 Мб. Это может быть проблемой. Для экономии памяти проще всего использовать nouveau.

Обновление

Для обновления обеих частей драйвера (ядерной и иксовой) следует применять совокупность команд:

apt-get update && apt-get dist-upgrade && update-kernel


Борьба с "тирингом" при использовании официальных драйверов

При использовании "открытых" драйверов (nouveau), наблюдается "тиринг" (tearing) изображения, на официальных же драйверах эту проблему можно решить следующим образом (из терминала):

 nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceCompositionPipeline = On }"

Монитор может мерцать секунду-две. Если команда выполнилась без ошибок, нужно проверить, ушла ли проблема (если проблема сохраняется, можно попробовать указать опцию "ForceFullCompositionPipeline" вместо "ForceCompositionPipeline"). Если тиринга больше нет, пропишите данный режим в Xorg.conf, чтобы эта настройка видеокарты применялась при каждом запуске системы, предварительно сделав резервную копию файла xorg.conf:

 cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup

Затем откройте файл в текстовом редакторе с привилегиями суперпользователя - допустим, с помощью nano:

 # nano /etc/X11/xorg.conf

В разделе Section «Screen» должно быть примерно следующее:

 Section "Screen"
   Identifier     "Screen0"
   Device         "Device0"
   Monitor        "Monitor0"
   DefaultDepth    24
   Option         "Stereo" "0"
   Option         "metamodes" "nvidia-auto-select +0+0 { ForceCompositionPipeline = On }"
   SubSection     "Display"
       Depth       24
   EndSubSection
 EndSection

Если опции "metamodes" нет, добавьте ее с рабочим для себя вариантом. У некоторых уже есть опция «metamodes» в файле /etc/X11/xorg.conf, как в примере ниже для настройки с двойным монитором:

 Option "metamodes" "VGA-0: 1152x864_60 +0+0, DVI-D-0: 1680x1050_60 +0+864"

Если это так, просто измените строку так, чтобы она выглядела следующим образом:

 Option "metamodes" "VGA-0: 1152x864_60 +0+0, DVI-D-0: 1680x1050_60 +0+864 { ForceCompositionPipeline = On }"

Теперь перезагружаемся и наслаждаемся плавной картинкой.

Что делать, если у вас отсутствует файл /etc/X11/xorg.conf

Сейчас всё реже используется файл xorg.conf. Он становится ненужным. Вместо него используются файлы с расширением *.conf в каталоге /etc/X11/xorg.conf.d/  всё должно работать автоматом без участия человека.В этих файлах указываются отдельные параметры, которые надо подправить в настройках xorg.conf. Остальные параметры xorg выбирает автоматом. Но иногда бывает полезно создать файл xorg.conf, чтобы "посмотреть" какие параметры есть для этой видеокарты.


Для создания  xorg.conf для драйвера nvidia, открываем программу nvidia-settings и переходим в раздел X Server Display Configuration, нажимаем кнопку "Save to X Configuration File" (тем самым мы создадим необходимый для нас файл xorg.conf). Так же нужно снять галочку с Merge with existing file (совместить с существующим файлом). Проверьте наличие файла xorg.conf, после чегo можно или сохранить его, или удалить познакомившись с текущими настройками, а можно часть из настроек перенести в отдельный файл в каталоге /etc/xorg.conf.d.
В идеале задумано, что всё должно работать без участия оператора. После установки драйверов nvidia , если  они поддерживают карту, то после перезагрузки должны включиться они, если нет, то должна включиться  nouveau. Вмешательство человека только портит этот механизм - пытаются насильно включить nvidia через альтератор, а в результате и nvidia не грузится (из-за того что карту не поддерживает),  ни  nouveau, так как в xorg.conf.d насильно вписали  (альтератором) nvidia.

Ссылки