Но версия от NVIDIA той же библиотеки помимо реализации OpenGL ещё содержит код драйвера, именно по этой причине очень сложно для начинающего пользователя установить драйвер. Нужно соблюсти все тонкости, а если ещё учеть что драйвер ставится в систему которая сама контролирует что должно быть (это я про dpkg) то начинаются проблемы.
Теперь детали.
командой
Код:
$ find /lib/modules/`uname -r`/ -iname \*nvidia.ko\*
можно узнать сколько модулей у нас в директории ядра. должен быть один
неважно в какой именно директории, но обычно
если в /lib/modules/`uname -r`/volatile/nvidia.ko то это драйвер из пакета linux-restricted-modules
для нормальной работы драйвера от NVIDIA его там быть не должно
поскольку инсталлятор от NVIDIA обычно ставит модуль в
/lib/modules/`uname -r`/kernel/drivers/video/nvidia.ko
т.е. если у вас два модуля то будет грузиться тот кто выше прописан в файле
/lib/modules/`uname -r`/modules.dep rfr правило если возникает такая ситуация то первым грузится модуль из volatile
об этом говорит ошибка в логе /var/log/Xorg.0.log
Код:
API mismatch: the NVIDIA kernel module has the version 1.0-9755, but this X module has the version 1.0-9631.
скорее всего номера версий будут конечно другие.
Итак модуль должен быть только один! поэтому нужно отклучить модуль из пакета linux-restricted-modules
делается это изменением файла
/etc/default/linux-restricted-modules-common
там нужно исправить строчку на вот такую
DISABLED_MODULES="nvidia nvidia_legacy nvidia_new"
DISABLED_MODULES="nv nvidia_new"
если у вас там уже что то есть то нужно добавить nv и nvidia_new через пробел например
DISABLED_MODULES="ath_hal fc fglrx ltm nv nvidia_new"
действие вступит в силу после перезагрузки. Именно поэтому если не прописать эти строчки после перезагрузки даже если вы удалили руками модуль из /lib/modules/`uname -r` то после перезагрузки он снова будет в /lib/modules/`uname -r`/volatile
деталь номер два
как уже было сказано драйвер состоит из двух частей вторая это библиотека /usr/lib/libGL.so.1 (а также libGLcore ) как правило это ссылка. а вот на что она указывает нас и интересует. что то на подобии libGL.so.100.14.11 цифры это версия драйвера NVIDIA.
Версия из Mesa имеет номер поскромнее что то вроде libGL.so.1.2 проверить что есть что можно командой
$ dpkg -S libGL.so.1.2
libgl1-mesa-glx: /usr/lib/libGL.so.1.2
$ dpkg -S libGL.so.100.14.11
dpkg: файл *libGL.so.100.14.11* не найден.
Но как же устанавливается драйвер из репозитория!?
А очень просто модуль уже есть (мы с ним боролись он находится в /lib/modules/`uname -r`/volatile/nvidia.ko)
а вот при установке nvidia-glx (nvidia-glx-new или nvidia-glx-legacy) происходит подмена (делает это установочный скрипт deb пакета) версия от меса копируется в другую директорию а на её место встаёт версия от NVIDIA нужной версии.
Тут кроется ещё одна особенность dpkg умеет запоминать, что куда перенесли, поэтому когда переустанавливается пакет libgl1-mesa-glx, при установленном nvidia-glx (nvidia-glx-new или nvidia-glx-legacy), dpkg устанавливает библиотеку libGL.so от Mesa в новое место и в результате библиотека от NVIDIA остаётя не тронутой, именно по этому если драйвер был установлен вручную и работал, то после переустановки (обновлениии) пакета libgl1-mesa-glx библиотека от NVIDIA перетирается и драйвер не работает. В таких случаях нужно заново устанавливать драйвер NVIDIA вручную.
Ну теперь когда вы знаете где что и как должно быть, если у вас что то не работает:
проверяйте всё по двум пунктам (при условии что корректно настроен xorg.conf)
1 сколько модулей nvidia.ko и каких версий
2 какая версия libGL.so
3 если вы хотите поставить драйвер сами то предаврительно удалите пакеты sudo apt-get remove nvidia-glx nvidia-glx-new nvidia-glx-legacy