RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Фактически видеокарты NVidia обладают лучшей поддержкой в FreeBSD, чем какие либо другие видеокарты. Чтобы воспользоваться всеми возможностями аппаратного ускорения и другими функциями - следует установить специальный драйвер. Для NVidia карт на данный момент существует три драйвера - nv, nouveau, nvidia. Первый драйвер - nv, является свободным драйвером и в данный момент устарел, использовать его на современных видеокартах не представляется возможным, к тому же, можно сказать, что драйвер не имеет реализации аппаратного ускорения. Драйвер nouveau является современной свободной реализацией драйвера nv, но с поддержкой аппаратного ускорения, драйвер пишется при помощи реверс-инжиниринга (NVidia не открывает спецификации своих чипов) и по своим функциям отстает от проприетарного драйвера (по крайней мере на момент написания статьи - отстает). Ну и собственно драйвер - nvidia, проприетарный драйвер от производителя видеокарт, поддерживающий на данный момент большинство функций для работы с графикой - его мы и будем рассматривать в этой заметке.
Драйвер представлен в системе портов четырьмя версиями и двумя утилитами: nvidia-driver-71, nvidia-driver-96, nvidia-driver-173, nvidia-driver. Утилиты: nvidia-xconfig, nvidia-settings. Все эти порты расположены в /usr/ports/x11. Несколько версий драйвера расположены в хронологическом порядке, для разных классов видеокарт, например: 71 драйвер используется для видеокарт типа Riva TNT2, 96 - GeForce 4 mx400, 173 - GeForce 7300, и просто nvidia-driver - это самый последний драйвер для современных видеокарт. Утилиты: nvidia-xconfig - требуется для формирования xorg.conf, nvidia-settings - утилита с графическим интерфейсом для тонкой настройки видеокарты.
Установка драйвера
Подразумевается, что перед началом работы с драйвером выполнена установка и конфигрурирование XORG по статье "Настройка XORG + HAL". Допустим что имеется современная видеокарта GeForce 250 GTS. Установим nvidia-driver из портов. Переходим в каталог, в котором содержится порт драйвера видеокарты:
# cd /usr/ports/x11/nvidia-driver
Перед установкой драйвера следует произвести загрузку модуля ядра для поддержки linux. Производим загрузку модуля:
# kldload linux
Затем произведем конфигурирование порта драйвера:
# make config
На дисплее появится следующее меню:
Следует обратить внимание на опцию FREEBSD_AGP. В нашем случае видеокарта имеет PCI-E реализацию и собственно AGP порта нет, значит можно смело снять этот параметр, однако если сборка порта производится на системе с AGP видеокартой (к примеру GeForce 5200) то в этом случае параметр нужно указывать. Опция ACPI_PM нужна видимо для возможности динамического отключения питания видеокарты, в нашем случае это совершенно не требуется, поэтому параметр тоже остается отключенным. Опция LINUX должна быть включена, иначе не удастся достичь аппаратного ускорения, по причине того что компоненты драйвера обращаются к специфическим процедурам, которые имеются только в режиме совместимости с linux. Опция WBINVD означает специальные операции с кешем, для какой цели она присутсвует я достоверно сказать не могу, поэтому оставляем этот параметр по умолчанию, т.е. отключенным. Запускаем процесс сборки драйвера:
# make install clean
В процессе сборки так же соберутся необходимые компоненты для поддержки linux. После сборки нужно вписать в /etc/fstab специализированную файловую систему для поддержки linux, отредактируем /etc/fstab:
# ee /etc/fstab
Часть файла /etc/fstab:
...
linproc /compat/linux/proc linprocfs rw 0 0
Затем смонтируем файловую систему:
# mount linproc
Для автоматического запуска поддержки linux при старте системы требуется отредактирвать /etc/rc.conf и вписать туда строку:
# ee /etc/fstab
Часть файла /etc/rc.conf:
...
linux_enable="YES"
Драйвер видеокарты присутсвует в системе в качестве модуля ядра, произведем его загрузку:
# kldload nvidia
Если все сделано правильно, то на дисплее появится сообщение об успешном обнаружении видеочипа. Для того, чтобы не приходилось загружать модуль каждый раз, пропишем его в автоматическую загрузку. Создадим файл /boot/loader.conf и отредактируем его:
# touch /boot/loader.conf
# ee /boot/loader.conf
Содержимое файла /boot/loader.conf:
nvidia_load="YES"
Сохраняем файл, установка драйвера на этом закончена, но если сейчас пробовать запустить графический интерфейс, то скорее всего будет запущен штатный драйвер nv собирающийся по умолчанию вместе с XORG, поэтому следующим шагом будет настройка XORG для правильного выбора драйвера и дополнительных установок.
Настройка XORG
При использовании XORG + HAL создавать xorg.conf не обязательно, однако для правильной настройки нам все равно придется прибегнуть к конфигурированию xorg.conf, с учетом того что часть оборудования будет определена автоматически - ненужные секции будут убраны и нужные параметры добавлены. Далее в заметке я выложу готовый вариант моего конфигурационного файла, который нормально работает. Если требуется разобраться более досконально, то следует читать документацию, генерировать xorg.conf при помощи утилиты nvidia-xconfig и производить требуемые настройки самостоятельно (именно таким способом и был получен требуемый результат). Итак создаем xorg.conf и приводим его к следующему виду:
# touch /etc/X11/xorg.conf
# ee /etc/X11/xorg.conf
Содержимое файла /etc/X11/xorg.conf:
Section "ServerLayout"
Identifier "X.org Configured"
Screen 0 "Screen0" 0 0
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
Section "Module"
Load "extmod"
Load "record"
Load "dbe"
Load "glx"
Load "dri"
Load "dri2"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor"
ModelName "TFT Panel"
Option "DPI" "96 x 96"
EndSection
Section "Device"
Identifier "Card0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSection "Display"
Viewport 0 0
Depth 24
EndSubSection
EndSection
Следует обратить внимание, что из конфига удалены секции описывающие загрузку шрифтов, настройки устройств ввода - клавиатуры и мыши. Данные секции автоматически отрабатываются современным XORG. Остальные параметры описаны с целью отключить энергосбережение дисплея, установить фиксированные DPI и указать XORGу, что следует использовать драйвер nvidia, а не что то иное. Эти строки выделены желтым цветом. На этом настройка закончена, и можно смело запускать иксы и работать.
Возникающие проблемы и сложности
Попробую описать вероятные сложности и проблемы, которые могут возникнуть даже если все сделано правильно. У меня имеется ноутбук RoverBook H470L, на котором постоянно, релиз от релиза, возникают странности - перестает нормально опеределяться и работать то одно, то другое оборудование. Попробуем решить возникающие сложности на его примере.
У ноутбука имеется видеоадаптер NVidia GeForce4 420, и первая ошибка которую совершит пользователь будет заключаться в том, что иксы не запустятся и старт XORG будет прерываться сообщением об ошибке:
No devices detected.
Fatal server error
no screens found
С точки зрения логики, совершенно непонятно в чем причина не определения видеоадаптера. Однако причина кроется в обычной невнимательности при загрузке модуля nvidia командой kldload. После выполнения этой команды на экране появляется сообщение от модуля - определена видеокатра или нет, в случае с установкой nvidia-driver на ноутбуке с адаптером GeForce4 420, при загрузке модуля на дисплее появляется сообщение:
NVRM: The NVIDIA GeForce4 420 Go GPU installed in this system is
NVRM: supported through the NVIDIA 96.43.xx Legacy drivers. Please
NVRM: visit http://www.nvidia.com/object/unix.html for more
NVRM: information. The 285.05.09 NVIDIA driver will ignore
NVRM: this GPU. Continuing probe...
Что в переводе означает - GeForce4 420 Go поддерживается драйвером версии 96.43.xx, а текущий драйвер версии 285.05.09 не поддерживает данный GPU. Фактически для такой видеокарты требовалось собирать nvidia-driver-96, а не текущий nvidia-driver. Следует выгрузить модуль ядра командой kldunload, удалить текущий драйвер, затем собрать драйвер nvidia-driver-96 и проблема будет решена.
Еще один вероятный источник проблем - неверное определение дисплея. Данная ситуация так же проявляется на RoverBook H470L, заключается она в том, что при старте XORG дисплей остается черным и ничего не происходит. Если при этом подключить к ноутбуку внешний монитор, то окажется что изображение выводится именно на него, а не на LCD матрицу ноутбука. Для того чтобы все работало нормально, придется принудительно указать порт дисплея. Для этого произведем изменения в /etc/X11/xorg.conf, в секцию Screen внесем изменения следующим образом:
Часть файла /etc/X11/xorg.conf:
...
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
Option "UseDisplayDevice" "DFP-0"
SubSection "Display"
Viewport 0 0
Depth 24
EndSubSection
EndSection
Данный параметр прямо указывает куда производить вывод изображения - DFP-0. Надеюсь что данные примеры помогут читателю правильно настроить графический интерфейс.