Перевод документации драйвера NVIDIA для Linux, часть 2

Глава 7. Часто задаваемые вопросы

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

Утилита NVIDIA-INSTALLER

Вопрос: Как мне извлечь содержимое .run пакета без установки драйвера?

Ответ: Запустите установку как показано ниже:

# sh NVIDIA-Linux-x86-ХХХ.XХ.run --extract-only

Будет создан каталог NVIDIA-Linux-x86-ХХХ.XХ с распакованным содержимым .run файла.

Вопрос: Как посмотреть исходный текст модуля интерфейса ядра?

Ответ: Исходный текст размещен в каталоге kernel распакованного .run файла. Для получения исходного текста выполните:

# sh NVIDIA-Linux-x86-ХХХ.XХ.run --extract-only
# cd NVIDIA-Linux-x86-ХХХ.XХ/kernel/

Вопрос: Как и где создаются файлы устройств NVIDIA?

Ответ: В зависимости от конфигурации системы файлы устройств NVIDIA создаются одним из трех способов:

  • во время установки, используя mknod;
  • во время загрузки модуля, через devfs (Linux device file system);
  • во время загрузки модуля, посредством hotplug/udev;

В текущих версиях драйвера NVIDIA файлы устройств создаются или модифицируются драйвером Х-интерфейса когда запущен сервер Х-интерфейса.

По-умолчанию, драйвер NVIDIA пытается создать файлы устройств со следующими атрибутами:

UID: 0 — 'root'
GID: 0 — 'root'
Mode: 0666 — 'rw-rw-rw-'

 Имеющиеся файлы устройств изменяются, если их атрибуты не совпадают с умолчаниями. Если вы хотите, чтобы драйвер NVIDIA создавал файлы устройств с отличными от умолчаний атрибутами, вы можете задать их с помощью параметров модуля ядра NVIDIA NVreg_DeviceFileUID (пользователь), NVreg_DeviceFileGID (группа) и NVreg_DeviceFileMode.

Например, драйвер NVIDIA может быть настроен создавать файлы устройств с UID=0 (root), GID=44 (video) и Mode=0660 применением следующих настроек:

NVreg_DeviceFileUID=0
NVreg_DeviceFileGID=44
NVreg_DeviceFileMode=0660

 Параметр NVreg_ModifyDeviceFiles отключает динамическое управление файлами устройств, если его значение 0.

Вопрос: Почему NVIDIA больше не предлагает RPM пакеты?

Ответ: Не все дистрибутивы Linux используют RPM, NVIDIA старается предложить единое решение, должное работать со всеми дистрибутивами. NVIDIA призывает разработчиков дистрибутивов Linux переупаковывать и распространять драйвер NVIDIA в принятых в их системах форматах пакета. Такие перепакованные драйверы лучшим образом соответствуют технологии управления компонентами дистрибутива Linux. По этой же причине NVIDIA приветствует использование конечными пользователями пакетов дистрибутива, содержащих драйвер NVIDIA, при их доступности.

Вопрос: Может ли «nvidia-installer» использовать прокси-сервер?

Ответ: Да, поскольку поддержка FTP в nvidia-installer реализована через «snarf», то утилита понимает переменные среды FTP_PROXY, SNARF_PROXY и PROXY.

Вопрос: В чем смысл суффикса -no-compat32 в имени .run файла, предназначенного для 64-разрядных версий Linux?

Ответ: Для разделения пакетов драйвера для 64-разрядных систем Linux по признаку наличия/отсутствия 32-разрядных компонентов для обеспечения совместимости, суффикс «-no-compat32» добавляется к имени файлов в последнем случае. Пакет NVIDIA-Linux-x86-XXX.XX.run содержит и 64-, и 32-разрядные версии компонентов, а из пакета NVIDIA-Linux-x86-ХХХ.ХХ-no-compat32.run 32-разрядные компоненты исключены..

Вопрос: Могу я добавить скомпилированный модуль интерфейса для моей версии ядра в '.run' файл?

Ответ: Да, использование ключа запуска .run файла --add-this-kernel распакует файл, соберет и скомпилирует новый модуль интерфейса для выполняющегося в данный момент ядра, и запакует в .run файл, добавив -custom к имени файла. Это может быть полезным, например, если вы администрируете множество компьютеров с Linux, выполняющих ядро одной и той же версии.

Вопрос: Где найти исходный текст для утилиты «nvidia-installer»?

Ответ: Утилита «nvidia-installer» выпущена под лицензией GPL. Исходные тексты доступны на FTP сервере NVIDIA в файлах вида nvidia-installer-ХХХ.ХХ.tar.bz2, где ХХХ.ХХ соответствует версии драйвера NVIDIA.

Драйвер NVIDIA

Вопрос: С чего начать при обнаружении проблем с изображением?

Ответ: Одним из наиболее полезных инструментов является файл журнала Х-интерфейса, расположенный в /var/log. Строки, начинающиеся с (II), содержат информацию, с (WW) содержат предупреждения, с (EE) — ошибки. Необходимо удостоверится, что используется нужный файл конфигурации Х-интерфейса (тот, что вы редактируете); обратите внимание на строку, начинающуюся с:

(==) Using config file:

Также, убедитесь, что используется драйвер NVIDIA, а не встроенный «nv» или «vesa».

(II) LoadModule: "nvidia"

Сообщения драйвера должны начинаться с:

(II) NVIDIA(0)

Вопрос: Как расширить объем информации, записывающийся в файл журнала Х-интерфейса?

Ответ: По-умолчанию, драйвер NVIDIA отправляет только необходимый минимум сообщений в stderr и файл журнала. При необходимости решения проблем возможно задействовать расширенный вывод информации, используя ключи запуска сервера Х-интерфейса -verbose и -logverbose, для установки уровня выводимой информации в «stderr» и сообщения в журнале. Драйвер NVIDIA выводит больше сообщений при уровне 5 и больше (по-умолчанию, X-интерфейс использует уровень 1 для stderr и уровень 3 для файла журнала). Так что для увеличения объема информации от драйвера NVIDIA как в файле журнала, так и в stderr, вам надо запускать сервер Х-интерфейса с уровнем выводимой информации 5 следующим образом:

% startx -- -verbose 5 -logverbose 5

Вопрос: Какова политика NVIDIA в отношении версий ядра Linux, находящихся на стадии разработки?

Ответ: NVIDIA официально не поддерживает версии, находящиеся на стадии разработки. Однако, все исходные тексты модулей уровня ядра, взаимодействующих с ядром Linux, доступны в каталоге kernel/ файла .run. NVIDIA поощряет членов сообщества Linux, разрабатывающих патчи к этим исходным текстам для поддержки версий ядра, находящихся на стадии разработки. Поиск в сети, скорее всего, найдет некоторые разработанные сообществом патчи.

Вопрос: Где взять тарболлы (файлы в формате .tar.gz)?

Ответ: Такие файлы в чистом виде больше недоступны. Файл .run представляет собой тарболл со сценарием-оболочкой. Вы можете извлечь тарболл путем запуска файла .run с ключом --extract-only.

Вопрос: Как мне посмотреть, что исходные тексты ядра были установлены?

Ответ: Если используется дистрибутив с поддержкой RPM (Red Hat, Mandriva, SuSE), вы можете использовать «rpm». В командной строке введите:

% rpm -qa | grep kernel

 и посмотрите вывод. Вы должны увидеть пакет, соответствующий вашему ядру (обычно имеет название вида kernel-2.6.15-7), и пакет исходных текстов с тем же номером версии (обычно имеет название вида kernel-devel-2.6.15-7 или kernel-source-2.4.18-3). Если ни одна из строк не относится к пакету исходных текстов, то вам надо установить эти пакеты. Если отображаемые версии не совпадают (например, kernel-2.6.15-7 и kernel-devel-2.6.15-10), тогда вам нужен обновленный пакет «kernel-devel», соответствующий установленному ядру. Если установлено несколько ядер, нужно установить пакет исходных текстов, соответствующий ядру, выполняющемуся в данный момент (или убедитесь, что уже установленный пакет ему соответствует). Вы можете это сделать, посмотрев вывод команды uname -r и сравнивая версии.

Вопрос: Что такое SELinux и как это влияет на драйвер NVIDIA?

Ответ: Linux с повышенной безопасности (SELinux) – это набор модификаций ядра и ряда утилит Linux, вносящих архитектуру политик безопасности. При использовании требуется, чтобы тип доступа ко всем общим библиотекам был установлен в shlib_t. Инсталлятор драйвера определяет, когда необходимо выставить тип доступа и выставляет его ко всем общим библиотекам, которые устанавливает. Ключ запуска --force-selinux для .run файла отключает обнаружение требования выставления типа доступа.

Вопрос: Почему X-интерфейс использует столько памяти?

Ответ: При любом измерении использования приложениями памяти следует разграничивать использование физической оперативной памяти и виртуальных отображений общих ресурсов. Например, большинство общих библиотек загружены в оперативную память в единственном экземпляре, но отображаются во множество процессов. Эта память должна быть учтена лишь единожды при подсчете общего использования оперативной памяти. Аналогично, видеопамять или регистры любого устройства могут отображаться во множество процессов. Эти отображения не потребляют обычную оперативную память.

Это часто обсуждаемая тема в рассылках XFree86; например Marc.info. Описываемая там утилита «pmap» доступна в составе пакета «procps», входящего в состав большинства современных дистрибутивов Linux, и является полезным средством для разграничения видов использования памяти. Например, когда показатель «top» может показать, что X-интерфейс использует несколько сот мегабайт памяти, последняя строка в отчете pmap (обратите внимание, что pmap может потребоваться с правами root) покажет: 

# pmap -d `pidof X` | tail -n 1
mapped: 161404K writeable/private: 7260K shared: 118056K

что на самом деле Х-интерфейс использует всего около 7 Mб оперативной памяти («writable/private» значения).

Обратите также внимание, что X-интерфейс занимает ресурсы в зависимости от количества и вида клиентов (менеджер окон, веб-броузер и т.д.); потребление памяти сервером X-интерфейса возрастет при увеличении числа затребованных клиентами ресурсов, таких как иконки, и уменьшится после закрытия Х приложений).

Использование опции конфигурации X-интерфейса IndirectMemoryAccess может приводить к резервированию дополнительного виртуального адресного пространства.

Вопрос: Почему использующие DGA приложения не запускаются?

Ответ: Драйвер NVIDIA не поддерживает графический компонент расширения ХFree86-DGA (Direct Graphics Access). Приложения могут использовать вызов XDGASelectInput() для отслеживания перемещения указателя, но такие функции как XDGASetMode() и XDGAOpenFramebuffer(), работать не будут.

Графический компонент ХFree86-DGA не поддерживается, поскольку требует отображения буфера кадров с использованием центрального процессора. В связи с непрерывным увеличением объема видеопамяти на видеокартах драйвер Х-интерфейса NVIDIA перешел на новый механизм динамического использования памяти, несовместимый с DGA. Дополнительно, DGA не взаимодействует с другими графическими библиотеками, такими как Xlib и OpenGL, поскольку те обращаются к ресурсам графического процессора напрямую.

Приложениям лучше использовать OpenGL или Xlib вместо DGA для отображения изображения. Использование графических библиотек, отличных от DGA, позволит несколько улучшить производительность и обеспечит лучшую совместимость с другими Х приложениями.

Вопрос: Журнал событий ядра содержит сообщения, начинающиеся с "Xid", что это значит?

Ответ: Сообщения "Xid" показывают, что произошла общая ошибка в работе GPU, чаще всего из-за ошибки драйвера в программировании GPU или из-за порчи команд, посланных в GPU. Эти сообщения содержат информацию, которая может помочь NVIDIA в поиске и устранении сообщаемых проблем.

Вопрос: Я пользуюсь интерфейсом разгона Coolbits для изменения частот видеокарты, но частоты сбрасываются на умолчания после перезапуска Х-интерфейса. Как сделать изменения постоянными?

Ответ: Частоты не сохраняются/восстанавливаются автоматически по-умолчанию, воизбежание проблем со стабильностью работы системы и прочих проблем, могущих наступить при отходе от частот, установленных производителем. Вы можете включить приведенную ниже строку в файл ~/.xinitrc для автоматического применения разгона при старте сервера Х-интерфейса:

# nvidia-settings -a GPUOverclockingState=1 -a GPU2DClockFreqs=<GPU>,<MEM> -a GPU3DClockFreqs=<GPU>,<MEM>

 где <GPU> и <MEM> – желаемые частоты графического процессора и видеопамяти (в МГц) соответственно.

Вопрос: Почему утилиты, использующие расширение Х-интерфейса XRandR (например, панель «Screen Resolution Preferences» интерфейса GNOME, команда xrandr -q и т.д.) неправильно показывают частоту обновления изображения?

Ответ: Расширение XRandR не учитывает возможность отображения на нескольких дисплеях одного экрана X-интерфейса; оно обращается только к значению параметра MetaMode, в котором может содержаться описание одного или нескольких текущих видеорежимов. Это означает, что если несколько метарежимов описано в одном параметре MetaModes, расширение XRandR не в состоянии их различить между собой.

Для поддержки DynamicTwinView драйвер Х-интерфейса NVIDIA должен каждый метарежим сделать уникальным для расширения XRandR. В настоящее время драйвер использует значение частоты обновления изображения в качестве уникального идентификатора. Вы можете воспользоваться командой nvidia-settings -q RefreshRate для просмотра текущей частоты обновления на каждом дисплее. Это поведение драйвера может быть отключено выставлением опции DynamicTwinView конфигурации Х-интерфейса в FALSE. За дополнительной информацией обратитесь к Главе 13.

Вопрос: Почему при запуске некоторых приложений появляются сообщения об ошибках Xlib, сообщающие об отсутствии расширений наподобие XFree86-VidModeExtension или SHAPE?

Ответ: Если ваш файл конфигурации X-интерфейса содержит секцию "Module", в которой не пeречислен модуль "extmod", некоторые расширения X-интерфейса могут отсутствовать, приводя к сообщаениям об ошибках вида:

Xlib: extension "SHAPE" missing on display ":0.0"
Xlib: extension "XFree86-VidModeExtension" missing on display ":0.0"
Xlib: extension "XFree86-DGA" missing on display ":0.0"

 Вы можете исправить эту проблему, добавив в файл конфигурации X-интерфейса в секцию "Module" строку:

Load "extmod"

Вопрос: Где я могу найти драйверы прежних версий?

Ответ: На FTP сервере NVIDIA.

Вопрос: Каков формат идентификатора шины PCI (Bus ID)?

Ответ: Разные программы используют различные форматы представления идентификатора Bus ID устройств PCI.

Опция файла конфигурации BusID сервера X-интерфейса представляет строку идентификатора BusID в формате «шина@область:устройство:функция» (часть «@domain» используется только при ненулевой области шины PCI) в десятичной системе, точнее:

 "%d@%d:%d:%d", bus, domain, device, function

 в printf(3). Журнал драйвера Х-интерфейса NVIDIA, утилиты nvidia-xconfig и nvidia-settings используют тот же формат BusID, что и конфигурация Х.

Утилита lspci напротив, сообщает идентификатор шины PCI в формате «область:шина:устройство.функция» в шестнадцатеричной системе, точнее

 "%04x:%02x:%02x.%x", domain, bus, device, function

 в printf(3). Значение параметра «Bus Location» в файлах /proc/driver/nvidia/cards/* соответствует формату lspci.

Глава 8. Типичные проблемы

Эта глава содержит решения типовых проблем, возникающих при использовании драйвера NVIDIA для Linux.

Вопрос: Сервер Х-интерфейса не запускается, файл журнала Х-интерфейса содержит следующие ошибки:

(EE) NVIDIA(0): The NVIDIA kernel module does not appear to be receiving
(EE) NVIDIA(0): interrupts generated by the NVIDIA device PCI:x:x:x.
(EE) NVIDIA(0): Please see the COMMON PROBLEMS section in
(EE) NVIDIA(0): the README for additional information.

Ответ: Это может быть вызвано многими причинами, как то: ошибками маршрутизации прерываний PCI, проблемами с расширенным контроллером прерываний (I/O APIC), конфликтами устройств, использующих общую линию прерываний (или их драйверов).

Если возможно, сконфигурируйте систему так, чтобы видеокарта не использовала линию прерываний (IRQ) совместно с другими устройствами (переместите карту в другой слот, выгрузите/отключите драйвер устройства, которое использует линию прерываний видеокарты, или отключите/удалите само устройство).

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

ОпцияДействие
pci=noacpiне использовать ACPI для маршрутизации прерываний PCI
pci=biosirqиспользовать вызовы PCI BIOS для построения таблицы маршрутизации прерываний
noapicне использовать I/O APIC, имеющийся в системе
acpi=offотключить ACPI

Вопрос: Сервер Х-интерфейса не запускается, файл журнала Х-интерфейса содержит следующие ошибки:

(EE) NVIDIA(0): The interrupt for NVIDIA graphics device PCI:x:x:x
(EE) NVIDIA(0): appears to be edge-triggered. Please see the COMMON
(EE) NVIDIA(0): PROBLEMS section in the README for additional information.

Ответ: Сообщение об «edge-triggered interrupt» означает, что ядро операционной системы настроено на обнаружение прерываний по фронту сигнала, а не по уровню сигнала в расширенном программируемом контроллере прерываний (APIC). При обнаружении прерываний по фронту сигнала невозможно разделение линии прерываний между несколькими устройствами, в этом случае должно использоваться обнаружение по уровню сигнала. При обнаружении прерываний по фронту сигнала возможна ситуация, когда драйвер устройства не сможет получать сигнал о прерывании. Для пользователя это выглядит как отказ устройства, и может привести к аварийной остановке работы компьютера. Особенно вероятность возникновения таких проблем велика, когда несколько устройств совместно используют одну линию прерываний. Такая ситуация возникает, если ля программирования обработки прерываний в APIC не используется интерфейс ACPI. Это обычная проблема с ядрами операционной системы Linux версий 2.4, поддерживающих ACPI не в полном объеме, или ядрами версий 2.6, если интерфейс ACPI отключен или возник сбой при попытке его инициализации. В этом случае ядро Linux использует таблицы прерываний, предоставляемые BIOS материнской платы. Иногда в BIOS подразумевается использование ACPI для обработки прерываний, и в таблицах прерываний все прерывания ошибочно помечаются как распознаваемые по фронту сигнала. Текущую настройку прерываний можно посмотреть в /proc/interrupts.

Возможные решения включают в себя: обновление BIOS материнской платы, использование ядра операционной системы версий 2.6 с включенным интерфейсом ACPI, или включение опции ядра noapic для обработки всех прерываний в устаревшем программируемом контроллере прерываний (PIC). Новые версии ядра также содержат механизм отложенной обработки прерываний в качестве пути обхода данной проблемы. Этот механизм можно включить опцией ядра irqpoll. В настоящее время драйвер NVIDIA проверяет обнаружение прерываний по фронту сигнала и останавливает запуск сервера Х-интерфейса в этом случае (чтобы избежать проблем со стабильностью системы). Это поведение драйвера может быть отключено с помощью опции NVreg_RMEdgeIntrCheck модуля уровня ядра драйвера NVIDIA для Linux. По-умолчанию значение этого параметра 1, определение обнаружения прерываний по фронту сигнала включено. Установите значение опции в 0 для отключения данного обнаружения.

Вопрос: Х-интерфейс загружается, но OpenGL приложения завершают работу сразу после запуска.

Ответ: Если Х-интерфейс работает, но имеются проблемы с OpenGL, то это, скорее всего, проблема с прочими используемыми библиотеками или имеются устаревшие символические ссылки (symlinks). Обратитесь к Главе 5 за дополнительной информацией. Иногда достаточно просто перезапустить «ldconfig». Вам также необходимо проверить наличие правильных расширений. Команда:

% xdpyinfo

 должна показать, что расширения «GLX» и «NV-GLX» присутствуют в системе. Если этих двух расширений нет, вероятно, имеют место быть проблемы с запуском модуля glx, или же невозможно неявное исполнение GLcore. Проверьте файл конфигурации Х-интерфейса и убедитесь, что в нем содержится строка загрузки glx (см. Главу 6). Если файл конфигурации корректен, проверьте файл журнала Х-интерфейса на предмет предупреждений/ошибок, связанных с GLX. Также проверьте наличие всех требуемых символических ссылок (обратитесь к Главе 5).

Вопрос: При использовании Xinerama, мои стереоочки работают только если стерео-приложение отображается на одном конкретном Х-дисплее. Если приложение отображается на других дисплеях, очки перестают работать.

Ответ: Эта проблема возникает с каналом DDC и стереоочками типа «blue line», которые получают стереосигнал из одного выхода видеокарты. Когда Х-дисплей не отображает информации, пригодной для вывода в стереорежиме, вывод стереосигнала на этот выход карты прекращается.

Принудительное использование стереопереключения позволяет очкам работать непрерывно. Это возможно путем задействования опции OpenGL «Force Stereo Flipping» в утилите «nvidia-settings», или путем добавления в файл конфигурации Х-интерфейса строки "ForceStereoFlipping" со значением "1".

Вопрос: Стереоизображение не синхронизировано между несколькими дисплеями.

Ответ: Есть две возможных причины этого. Если дисплеи подсоединены к одному и тому же GPU, и один из них потерял синхронизацию со стереоочками, вам нужно настроить мониторы на одинаковые параметры временной синхронизации; обратитесь к Главе 19 за дополнительной информацией.

Если дисплеи подключены к разным GPU, то единственный способ синхронизировать их – использовать специальное устройство G-Sync, поддерживаемое некоторыми видеокартами Quadro. Обратитесь к Главе 26 за дополнительной информацией. Это относится как к случаю отдельных GPU на отдельных видеокартах, так и к случаю нескольких GPU на одной видеокарте, такой как Quadro FX 4500 X2. Обратите внимание, что видеокарта Quadro FX 4500 X2 имеет только один DIN разъем для подключения стереоочков, принадлежащий нижнему GPU. Для синхронизации стереооизображения со вторым GPU нужно использовать специальное устройство G-Sync.

Вопрос: Я обновил ядро операционной системы, и теперь модуль NVIDIA не загружается. Что не так?

Ответ: Интерфейс уровня ядра должен быть скомпилирован специально для используемого ядра операционной системы. Если ядро изменилось, проще всего переустановить драйвер.

ДОПОЛНИТЕЛЬНО: Вы можете установить модуль ядра для неактивного ядра (например, если вы только что собрали и установили новое ядро, но еще не перезагрузились) с помощью команды наподобие:

 # sh NVIDIA-Linux-x86-ХХХ.XХ.run --kernel-name='KERNEL_NAME'

 где 'KERNEL_NAME' – то же, что выдает команда uname -r если ядро уже выполняется.

Вопрос: Сервер Х-интерфейса не запускается, файл журнала Х-интерфейса содержит следующие ошибки:

(EE) NVIDIA(0): Failed to load the NVIDIA kernel module!

Ответ: Драйвер Х-интерфейса выдает такую ошибку, если модуль уровня ядра драйвера NVIDIA не загрузился. При получении такой ошибки вам необходимо проверить вывод команды dmesg на наличие ошибок ядра операционной системы и/или попыток явной загрузки модуля modprobe nvidia. Если сообщается о «unresolved symbols», то, вероятнее всего, модуль собран с использованием исходных текстов (заголовков) для версии/конфигурации ядра операционной системы, не совпадающей с используемым ядром.

Вы можете задать расположение исходных текстов (заголовков) ядра при установке драйвера NVIDIA используя ключ запуска --kernel-source-path (смотрите команду sh NVIDIA-Linux-x86-ХХХ.XХ.run --advanced-options для получения дополнительной информации).

Старые версии пакета «module-init-tools» включают исполняемые файлы утилиты «modprobe», сообщающие об ошибке при запуске модуля, который уже включен в ядро операционной системы. Обновите пакет module-init-tools, если вы получаете сообщения об ошибке в данном случае.

Сервер Х-интерфейса обращается к /proc/sys/kernel/modprobe, определяя местоположение утилиты «modprobe», и к /sbin/modprobe, если файл не был найден. Проверьте, что этот адрес правильный, и ведет к исполняемому файлу утилиты modprobe, совместимому с используемым ядром операционной системы.

Вопрос: Установка модуля уровня ядра драйвера NVIDIA выдает сообщения об ошибке вида:

#error Modules should never use kernel-headers system headers
#error but headers from an appropriate kernel-source

Ответ: Вам необходимо установить исходные тексты ядра операционной системы. В большинстве случаев достаточно установить пакет «kernel-source» из дистрибутива.

Вопрос: Приложения OpenGL аварийно завершаются со следующей ошибкой:

WARNING: Your system is running with a buggy dynamic loader.
This may cause crashes in certain applications. If you
experience crashes you can try setting the environment
variable __GL_SINGLE_THREADED to 1. For more information
consult the FREQUENTLY ASKED QUESTIONS section in
the file /usr/share/doc/NVIDIA_GLX-1.0/README.txt.

Ответ: Динамический загрузчик в вашей системе имеет ошибку, приводящую к аварийному завершению приложений, собранных с помощью «pthreads» и многократно выполняющих запрос dlopen() libGL. Эта ошибка присутствует в старых версиях динамического загрузчика. К дистрибутивам, включающим в себя эту версию загрузчика, относятся (но ими не ограничивается) Red Hat Linux 6.2 и Mandrake Linux 7.1. Версии динамического загрузчика 2.2 и более поздние работают нормально. Если приложение не использует многопоточность, присвоение переменной среды __GL_SINGLE_THREADED значения 1 позволит избежать ошибки. В диалоге утилиты «bash» надо ввести:

% export __GL_SINGLE_THREADED=1

и в утилите «csh» и ее производных:

% setenv __GL_SINGLE_THREADED 1

 Предыдущие версии драйвера NVIDIA для Linux содержали способ обхода данной проблемы. К сожалению, этот способ приводил к проблемам с другими приложениями, и был удален в драйверах после версии 1.0-1541.

Вопрос: Игра Quake3 аварийно завершается при смене видеорежима.

Ответ: Вероятно, вы столкнулись с проблемой, описанной в предыдущем вопросе. Проверьте текстовый вывод приложения на предмет вышеупомянутого сообщения "WARNING". Присвоение переменной среды __GL_SINGLE_THREADED значения 1 должно устранить неполадку.

Вопрос: Я не могу собрать модуль интерфейса ядра драйвера NVIDIA, или же модуль собирается, но modprobe/insmod не могут загрузить его в ядро.

Ответ: Проблема обычно вызвана сборкой с неправильными файлами заголовков ядра (т.е. используемые при сборке файлы заголовков предназначены для версии ядра, отличной от используемой в данный момент). Стандартно файлы заголовков лежат в /usr/include/linux/, но путь /lib/modules/RELEASE/build/include (где RELEASE – результат выполнения команды uname -r) имеет преимущество. Утилита «nvidia-installer» должна сама определить их размещение в системе, однако, при возникновении затруднений, вы можете задать сборку с использованием определенных файлов заголовков путем ключа запуска --kernel-include-dir установки. Для того чтобы это сработало, вам необходимо наличие подходящих файлов заголовков в системе. Обратитесь к документации используемого дистрибутива, в некоторых дистрибутивах файлы заголовков не устанавливаются по-умолчанию, или же устанавливаются заголовки, не подходящие к используемому ядру.

Вопрос: Я не могу собрать модуль интерфейса ядра драйвера NVIDIA, или же модуль собирается, но modprobe/insmod не могут загрузить его в ядро.

Ответ: Проблема обычно вызвана сборкой с неправильными файлами заголовков ядра (т.е. используемые при сборке файлы заголовков предназначены для версии ядра, отличной от используемой в данный момент). Стандартно файлы заголовков лежат в /usr/include/linux/, но путь /lib/modules/RELEASE/build/include (где RELEASE – результат выполнения команды uname -r) имеет преимущество. Утилита «nvidia-installer» должна сама определить их размещение в системе, однако, при возникновении затруднений, вы можете задать сборку с использованием определенных файлов заголовков путем ключа запуска --kernel-include-dir установки. Для того чтобы это сработало, вам необходимо наличие подходящих файлов заголовков в системе. Обратитесь к документации используемого дистрибутива, в некоторых дистрибутивах файлы заголовков не устанавливаются по-умолчанию, или же устанавливаются заголовки, не подходящие к используемому ядру.

Вопрос: Проблемы с запуском игры Heretic II.

Ответ: Игра Heretic II по-умолчанию создает символическую ссылку под названием libGL.so в каталоге игры. Вам надо удалить или переименовать эту ссылку, так как система дальше найдет и будет использовать стандартную libGL.so (которую драйвер устанавливает в /usr/lib). После этого вы сможете выставить используемым рендером OpenGL в меню «Video» игры. Также существует патч для игры от lokigames.

Вопрос: Система зависает при переключении в виртуальный терминал, если используется «rivafb».

Ответ: Использование «rivafb» и модуля уровня ядра NVIDIA одновременно невозможно. Использование двух независимых драйверов для одного и того же оборудования – изначально плохая идея.

Вопрос: Компилирование модуля уровня ядра NVIDIA выдает следующую ошибку:

You appear to be compiling the NVIDIA kernel module with
a compiler different from the one that was used to compile
the running kernel. This may be perfectly fine, but there
are cases where this can lead to unexpected behavior and
system crashes.
If you know what you are doing and want to override this
check, you can do so by setting IGNORE_CC_MISMATCH.
In any other case, set the CC environment variable to the
name of the compiler that was used to compile the kernel.

Ответ: Вам надо скомпилировать модуль, используя ту же версию компилятора, которая использовалась при компилировании ядра. Некоторые структуры данных ядра Linux зависят от версии компилятора gcc, используемой для их компиляции, например, в include/linux/spinlock.h:

...
* Most gcc versions have a nasty bug with empty initializers.
*/
#if (__GNUC__ > 2)
typedef struct { } rwlock_t;
#define RW_LOCK_UNLOCKED (rwlock_t) { }
#else
typedef struct { int gcc_is_buggy; } rwlock_t;
#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
#endif

Если ядро компилировалось с «gcc» версии 2.x, но для компилирования модуля интерфейса ядра использовался «gcc» версии 3.x (и наоборот), размер rwlock_t будет различаться, и такие вызовы как ioremap приведут к сбою. Для выяснения версии gcc, использованной при компиляции вашего ядра, просмотрите вывод команды:

% cat /proc/version

Для проверки версии gcc, доступной в данный момент по переменной $PATH, просмотрите вывод команды:

% gcc -v

Вопрос: Х-интерфейс завершается с ошибкой:

Failed to allocate LUT context DMA

Ответ: Это один из возможных примеров компилирования модуля уровня ядра NVIDIA с использованием версии «gcc», отличной от версии gcc, использовавшейся для компилирования ядра (см. выше).

Вопрос: Я недавно обновил версии различных библиотек, используя утилиту обновления Linux, включенную в дистрибутив, и драйвер NVIDIA перестал работать.

Ответ: Конфликтующие версии библиотек могли быть установлены в процессе обновления, обратитесь к Главе 5 за дополнительной информацией по определению проблемы.

Вопрос: Я пересобрал модуль уровня ядра NVIDIA, но теперь при попытке его интеграции выдается сообщение об unresolved symbols.

Ответ: Сообщение «Unresolved symbols» чаще всего вызвано различием между исходными текстами ядра и используемым ядром. Они должны полностью совпадать для правильной сборки модуля. Убедитесь, что установлены и используются исходные тексты, совпадающие с используемым ядром операционной системы.

Вопрос: Я не могу загрузить модуль уровня ядра NVIDIA, который скомпилировал для ядра операционной системы Red Hat Linux 7.3 2.4.18-3bigmem kernel.

Ответ: Файлы заголовков ядра, которые Red Hat включала в дистрибутивы для Red Hat Linux 7.3 2.4.18-3bigmem kernel, неправильно настроены. Предварительно скомпилированный модуль уровня ядра NVIDIA может быть загружен, но если вы хотите сами его скомпилировать для этого ядра, вам необходимо проделать следующие действия:

# cd /lib/modules/`uname -r`/build/
# make mrproper
# cp configs/kernel-2.4.18-i686-bigmem.config .config
# make oldconfig dep

Обратите внимание: Red Hat Linux содержит файлы заголовков ядра, настроенные для всех ядер, включенных в дистрибутивы операционной системы с одним номером версии. Файл заголовка, создаваемый во время загрузки системы, устанавливает ряд параметров для выбора правильной конфигурации. Пересоздание заголовков ядра с помощью приведенных выше команд создаст файлы, подходящие только для ядра Red Hat Linux 7.3 2.4.18-3bigmem kernel, делая их непригодными для других вариантов.

Вопрос: Приложения OpenGL приводят к утечкам памяти в моей системе!

Ответ: Если ядро системы собиралось с использованием -rmap VM, система может терять память в связи с улучшениями в механизме управления памятью, введенными в -rmap14a. Опция -rmap VM используется в некоторых популярных дистрибутивах, утечка памяти присутствует в некоторых распространяемых версиях ядра. Проблема исправлена в -rmap15e.

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

Вопрос: Некоторые OpenGL приложения (такие как Quake3 Arena) аварийно завершаются при запуске их в Red Hat Linux 9.0.

Ответ: Некоторые версии пакета «glibc», включенные в дистрибутивы Red Hat, поддерживающие TLS, неправильно используют вызов dlopen() для доступа к общим библиотекам, использующим TLS модели. Эта проблема наблюдается, например, когда Quake3 Arena делает вызов dlopen() к библиотеке «libGL» NVIDIA. Установите пакет версии как минимум glibc-2.3.2-11.9, доступный в качестве обновления от Red Hat.

Вопрос: Я установил драйвер, но опция «Enable 3D Acceleration» по-прежнему недоступна.

Ответ: Многие утилиты конфигурирования, поставляемые в составе дистрибутивов, не определяют наличие драйвера NVIDIA с аппаратным ускорением, и не обновляют свое состояние после установки драйвера. Ваш драйвер, в случае правильной установки, должен работать в полном объеме.

Вопрос: При изменении настроек в играх типа Quake 3 Arena или Wolfenstein Enemy Territory, игра аварийно завершается со следующим сообщением:

...loading libGL.so.1: QGL_Init: dlopen libGL.so.1 failed:
/usr/lib/tls/libGL.so.1: shared object cannot be dlopen()ed:
static TLS memory too small

Ответ: Эти игры закрывают и запускают заново драйвер OpenGL NVIDIA (посредством вызовов dlopen() / dlclose()) при изменении настроек. С некоторыми версиями библиотеки «glibc» (например, с поставляемой в дистрибутиве Red Hat Linux 9), возникает ошибка, связанная с утечкой статических записей TLS. Эта ошибка glibc приводит к аварийному завершению OpenGL драйвера при его последующих перезагрузках. Это исправлено в более поздних версиях glibc; посмотрите отчет Red Hat об ошибке bug #89692.

Вопрос: X-интерфейс аварийно завершается во время startx, и файл журнала содержит следующее сообщение об ошибке:

(EE) NVIDIA(0): Failed to obtain a shared memory identifier.

Ответ: Драйвер OpenGL NVIDIA и драйвер Х-интерфейса NVIDIA требуют наличие общей памяти для обмена информацией, опция CONFIG_SYSVIPC должна быть включена в ядре операционной системы.

Вопрос: Когда я пытаюсь установить драйвер, установщик сообщает, что Х-интерфейс запущен, даже если я вышел из Х.

Ответ: Установщик определяет присутствие сервера Х-интерфейса, проверяя наличие его временных файлов в /tmp/.Xn-lock, где n – номер Х-дисплея (инсталлятор проверяет номера от 0 до 7). Если вы вышли из Х-интерфейса, но один из временных файлов остался, вам необходимо удалить его вручную. Не удаляйте этот файл, если Х-интерфейс еще работает!

Вопрос: Система работает, но очень нестабильно.

Ответ: Если используется видеокарта AGP, проблемы со стабильностью могут быть вызваны проблемами с AGP шиной. Обратитесь к Главе 12 за дополнительной информацией.

Вопрос: Приложения OpenGL работают слишком медленно.

Ответ: Возможно, приложение продолжает использовать библиотеку OpenGL, отличную от установленной драйвером NVIDIA. Обратитесь к Главе 5 за дополнительной информацией.

Вопрос: Проблемы с игрой Quake2.

Ответ: Игра Quake2 требует дополнительной небольшой настройки перед запуском. В первую очередь, в каталоге игры при установке создается символическая ссылка libGL.so, ведущая к библиотеке libMesaGL.so. Эта ссылка должна быть удалена или переименована. Во вторых, для запуска игры с использованием OpenGL надо набирать:

% quake2 +set vid_ref glx +set gl_driver libGL.so

Quake2, похоже, не поддерживает ни в каком виде вывод на полный экран, но можно запустить Х-интерфейс с таким же разрешением, что и в игре, для имитации полноэкранного режима.

Вопрос: X-интерфейс слишком долго загружается (до нескольких минут).

Ответ: Большинство проблем с длительным запуском Х-интерфейса, как выяснилось, вызвано некорректными данными в BIOS видеокарт о возможных подключениях дисплеев и о порте шины i2c, используемом для определения. Вы можете обойти проблему с помощью опции IgnoreDisplayDevices файла конфигурации Х-интерфейса (см. описание в приложении B).

Вопрос: Шрифты имеют неправильные размеры после установки драйвера NVIDIA.

Ответ: Неправильные размеры шрифтов обычно вызваны некорректным значением разрешения DPI (точек на дюйм) в системе. Вы можете проверить, какое значение физического размера монитора подразумевается в Х-интерфейсе выполнением:

% xdpyinfo | grep dimensions

Будет сообщен размер в пикселях и миллиметрах.

Если эти значения неверны, их можно исправить изменением настроек разрешения DPI сервера Х-интерфейса. Обратитесь к приложению E за дополнительной информацией.

Вопрос: Общие проблемы с чипсетами Ali.

Ответ: Имеется ряд известных проблем с временной синхронизацией и целостностью сигнала в чипсетах ALi. Следующие советы могут помочь повысить стабильность проблемной системы:

  • отключите опцию «TURBO AGP MODE» в BIOS материнской платы;
  • если используется плата P5A обновите BIOS до версии Revision 1002 BETA2;
  • если используется версия BIOS 1007, 1007A или 1009, настройте опцию «IO Recovery Time» на 4 цикла;
  • возможности AGP отключены по-умолчанию при использовании некоторых чипсетов ALi (ALi1541, ALi1647) в целях избежать проблем со стабильностью системы. См. комментарии к опции EnableALiAGP в nv-reg.h для включения AGP в любом случае.

 Вопрос: Используя утилиты конфигурирования GNOME, я не могу установить разрешения выше 800x600. Что не так?

Ответ: Установка GNOME в дистрибутивах вроде Red Hat Enterprise Linux 4 содержит ряд путей для установки разрешения:

«System Settings» → «Display»

Что приводит к изменению файла конфигурации Х-интерфейса, и

«Applications» → «Preferences» → «Screen Resolution»

что определяет разрешение для каждого пользователя используя XRandR-расширение. Разрешение вашего рабочего стола определяется наименьшим из двух настроек. Убедитесь, что вы проверили их обе.

Вопрос: X-интерфейс не восстанавливает изображение графической консоли при запуске на ТВ. Я получаю следующее сообщение об ошибке в файле журнала Х-интерфейса:

Unable to initialize the X int10 module; the console may not be restored correctly on your TV.

Ответ: Драйвер NVIDIA для X-интерфейса использует модуль обработки прерывания Int10 Х-интерфейса для сохранения и восстановления состояния консоли на ТВ, и не может нормально восстановить изображение консоли, если не используется модуль обработки прерывания Int10. Если вы собирали сервер Х-интерфейса самостоятельно, убедитесь, что модуль обработки прерывания Int10 был также собран. Если используется готовая сборка сервера, включенная в дистрибутив Linux, и модуль обработки прерывания Int10 отсутствует, обратитесь к поставщику дистрибутива.

Вопрос: Приложения OpenGL не запускаются, в файл журнала записывается ошибка:

(EE) NVIDIA(0): Unable to map device node /dev/zero with read, write, and
(EE) NVIDIA(0): execute privileges. The GLX extension will be disabled
(EE) NVIDIA(0): on this X screen. Please see the COMMON PROBLEMS
(EE) NVIDIA(0): section in the README for more information.

Ответ: Драйвер OpenGL NVIDIA должен отобразить ветвь оборудования /dev/zero с разрешениями на чтение, запись и выполнение для корректной работы. Данная функция требуется драйверу для выделения исполняемой области памяти, используемой в оптимизациях, требующих создания программного кода «на лету». В настоящее время GLX не может исполняться без использования данных оптимизаций.

Проверьте, что файловая система оборудования «/dev» правильно установлена. Наиболее частая причина заключается в том, что файловая система /dev собрана с использованием опции noexec. Если вы сами не изменяли настройки системы /dev, обратитесь к поставщику дистрибутива операционной системы.

Вопрос: X-интерфейс не загружается и файл журнала содержит сообщение вида:

(EE) NVIDIA(0): Failed to allocate primary buffer: failed to set CPU access
(EE) NVIDIA(0): for surface. Please see Chapter 8: Common Problems in
(EE) NVIDIA(0): the README for troubleshooting suggestions.

Ответ: Драйверу Х-интерфейса NVIDIA требуется доступ к созданным им буферам обмена с центральным процессором, но получить этот доступ не удается. Такая ситуация может возникать при использовании виртуального рабочего стола больших размеров. Хотя графический процессор и может иметь достаточный объем видеопамяти для размещения буфера, объем доступной памяти может быть недостаточным при отключенной опции IndirectMemoryAccess или при недостаточном объеме зарезервированного адресного пространства для непрямого обмена с памятью (что случается в 32-разрядных системах). Если вы столкнулись с такой проблемой и используете 32-разрядную операционную систему, решить проблему можно переходом на 64-разрядную систему.

Обращение с драйвером Nouveau

Вопрос: Что такое Nouveau и почему я должен отключить его?

Ответ: Nouveau — драйвер для графических процессоров NVIDIA, разрабатываемый как проект с открытым исходным кодом путем обратного инжиниринга драйвера NVIDIA. Он включен в состав многих новых дистрибутивов Linux как драйвер по-умолчанию для видеокарт на базе NVIDIA. Он не разрабатывается и не поддерживается NVIDIA, и не имеет отношения к драйверу NVIDIA для Linux, кроме того факта, что также является драйвером для графических процессоров NVIDIA. В один момент времени только один драйвер может управлять графическим процессором, так что если используется драйвер Nouveau, он должен быть отключен перед установкой драйвера NVIDIA.

Драйвер Nouveau осуществляет операции изменения видеорежима через вызовы ядра операционной системы Linux. Это затрудняет отключение Nouveau, так как вызовы ядра используются для отображения полноэкранной консоли, и драйвер Nouveau будет использоваться даже при незапущенном Х-интерфейсе. Пока Nouveau активен, его модуль уровня ядра не может быть выгружен, что препятствует загрузке модуля уровня ядра драйвера NVIDIA. Вот почему важно отключить относящийся к Nouveau блок операций изменения видеорежима в ядре перед установкой драйвера NVIDIA.

Вопрос: Что надо сделать для отключения загрузки Nouveau и осуществления им операций смены видеорежима через ядро?

Ответ: Простой способ заключается в добавлении соответствующих инструкций загрузчику модуля в файле в /etc/modprobe.d/. Такие инструкции могут быть в принципе внесены в любой файл в /etc/modprobe.d/, но многие файлы в этом каталоге предоставляются и управляются поставщиком дистрибутива операционной системы, который может периодически распространять обновленные файлы, конфликтующие с вашими изменениями. В силу данного обстоятельства, рекомендуется создать новый файл, например /etc/modprobe.d/disable-nouveau.conf вместо редактирования уже имеющихся файлов вроде /etc/modprobe.d/blacklist.conf. Обратите внимание, что некоторые загрузчики модулей считывают инструкции только из файлов с расширением .conf, так что убедитесь, что имя созданного файла заканчивается на «.conf».

Вне зависимости от того, создаете ли вы новый файл или редактируете имеющийся, следующие строки должны быть добавлены в него:

blacklist nouveau
options nouveau modeset=0

Первая строка запрещает модулю Nouveau уровня ядра автоматически загружаться при загрузке операционной системы. Она не предотвратит загрузку модуля по требованию, как и загрузку модуля сервером Х-интерфейса, см. вопрос «Что надо сделать для отключения загрузки Nouveau сервером Х-интерфейса» ниже. Вторая строка запретит драйверу Nouveau осуществлять операции смены видеорежима через ядро. Без данной функции станет возможным выгрузить модуль Nouveau уровня ядра в случае его ошибочной загрузки. Вы должны перезагрузить систему после добавления данных инструкций для их действия.

Если установщик nvidia-installer обнаруживает активный драйвер Nouveau, он предложит создать подобный файл настроек modprobe для отключения Nouveau.

Вопрос: Что делать, если стартовый образ виртуального диска в оперативной памяти содержит Nouveau?

Ответ: В некоторых дистрибутивах, в частности в последних версиях Red Hat/Fedora, Nouveau включен в состав стартового образа виртуального диска в оперативной памяти (далее обозначаемого «initrd», также известного как «initramfs»), так что функции Nouveau смены видеорежима на уровне ядра могут быть активны на ранних стадиях процесса загрузки операционной системы. Это создает дополнительные трудности для их отключения, так как они активны еще на этапе исполнения системой initrd, до того как обрабатываются инструкции из /etc/modprobe.d. Если используется образ initrd, загружающий драйвер Nouveau, необходимо убедиться, что Nouveau в нем отключен. Если версия initrd воспринимает параметр rdblacklist, следует добавить опцию rdblacklist=nouveau к параметрам загрузки ядра операционной системы. Эти изменения должны быть внесены в файлы конфигурации загрузчика операционной системы, чтобы они применялись при каждом запуске системы. Обратитесь к документации дистрибутива за информацией о настройке загрузчика операционной системы, так как разные дистрибутивы используют разные файлы настроек.

В качестве альтернативы, можно пересобрать образ initrd без Nouveau. В этом случае также обратитесь к документации дистрибутива операционной системы за инструкциями по пересборке initrd, так как используемые средства сборки и модификации initrd могут различаться между дистрибутивами.

Вопрос: Что надо сделать для отключения загрузки Nouveau сервером Х-интерфейса?

Ответ: Внесение Nouveau в черный список лишь предотвращает автоматическую его загрузку при загрузке операционной системы. Если сервер Х-интерфейса использует драйвер Х-интерфейса Nouveau и запускается при старте системы, модуль Nouveau уровня ядра все равно будет загружен. Если это случилось и вы ранее приняли меры по отключению функций смены видеорежима через вызовы ядра, вы сможете выгрузить модуль Nouveau командой modprobe -r nouveau после остановки сервера Х-интерфейса, но лучше заранее удостовериться, что Х-интерфейс не загружает Nouveau.

Если система настроена не загружать Х-интерфейс, вы можете просто запустить установку драйвера NVIDIA после перезагрузки. В противном случае, проще всего отредактировать файл конфигурации Х-интерфейса так, чтобы сервер Х-интерфейса использовал драйвер без функций смены видеорежима через вызовы ядра, совместимый с вашей видеокартой, такой как vesa. Тогда вы сможете остановить Х-интерфейс и установить драйвер как обычно. Обратитесь к документации используемого сервера Х-интерфейса для нахождения местоположения файла конфигурации.

 /