суббота, 14 февраля 2015 г.

Повесть о Linux и графическом интерфейсе (NVIDIA edition).


Одна из не стареющих проблем в Linux - это проблемы с драйверами видео. Как и все проприетарные элементы уровня ядра, драйверы для видеокарт зачастую требуют некой снаровки и большой удачи, т.к. проблемы возникают порой на пустом месте. Обновил систему, перезагрузился - фигак и чёрный экран.


Раньше полнейший ад творился в основном с драйверами от ATI/AMD, однако, позднее вышли более-менее вменяемые версии свободных драйверов с поддержкой 3D ускорения и проблема как бы отодвинулась на второй план. Никуда, в прочем, не девшись, если речь заходит о приложениях в которых необходимо использовать возможности видеокарты на полную.

С картами от NVIDIA проблем было меньше (спасибо программистам из этой конторы), но и тут не всё было гладко. Так, проблемы рандомным образом могли (и могут) возникнуть при очередном обновлении ядра. Официальные дрова необходимо каждый раз пересобирать, что не удобно, а дрова из репозиториев иногда выкидывают внезапные финты (см. ниже).

В то же время, положить болт на официальные дрова, как в случае с AMD/ATI не получится, т.к. открытые дрова с нечитаемым наименованием nouveau в большинстве случаев могут вызвать только боль и сожаление.

Именно за закрытость и отсутствие содействия в разработке открытых дров и наезжал некогда Линус Торвальдс на NVIDIA (знаменитое "F*CK YOU NVIDIA"). На этот выпад все, кому так или иначе приходится работать с графикой под Linux могут сказать "F*ck you Linus Torvalds", т.к. полноценные драйвера от NVIDIA позволяют работать и даже на профессиональном уровне.

Ну, так вернёмся к проблемам.
По некоторым причинам, у меня установлено несколько операционных систем, среди которых к семейству Linux относятся Ubuntu 14.10, KXStudio и OpenSUSE 13.2 и я умудрился в один день поймать баги всеми тремя. Причём баги разные. 

1. Ubuntu Unity и отсуствие признаков интерфейса.

Начало как всегда прозаично - я обновился. Бесхитростно, без кучи сторонних репок, с родными + стим. После перезагрузки на экране появился курсор и... всё. Космический вакуум с курсором.

Переустановка дров для видеокарты дала некоторые продвижения - появился рабочий стол, без элементов управления и оболочки. Стало ясно, что проблема в Unity или том, с чем связан Unity. Ответ нашёлся довольно быстро - проблема оказалась в Compiz, который не стал выводить юнити.

Рецепт лекарства прост до безобразия:
#dconf reset -f /org/compiz/
#compiz --replace ccp &
setsid unity


Вуаля, все прочие атрибуты графической оболочки проявились.

2. Nouveau и мифический монитор.

Второй привет мне передала KXStudio, которую я использую по назначению - для работы со звуком (да, вот угораздило нелёгкая возжелать пописать музыку и обзавёлся я интерфейсами разными и замечательной клавиатуркой Novation Launchkey 49), а посему проприетарный драйвер для моей старушки GeForce GTX260 мне был ни к чему.

Всё бы хорошо, но после обновления я увидил чёрный экран и мигающую лампочку на мониторе, обозначающую наличие отсутствия всякого присутствия сигнала. Перейдя в TTY1 (Alt+Ctrl+F1) обнаружил там вполне живую консоль. Мало того, обнаружил, что графическая система вроде как там где-то работает и вполне нормально себя чувствует.

$xrandr выдал мне интересную информацию: оказывается у меня из видеокарты глядит в мир 4 условных выхода:  DVI-0-1, VGA-0, VGA-1, HDMI-0, как это видится системе. Тут стоит заметить, что DVI объединён потому, что монитор имеет разрешение 2560x1440, что выходит за спецификации DVI-I и требует двойного DVI-D, то есть один физический выход DVI расслоить на два не получится - оба подключения требует отдин монитор.

Так вот, система удивительным образом решила, что монитор подключен по... VGA-0. Ну типа - провод DVI-D включает аналоговый канал VGA/Dsub и чисто технически воткнут в тот же монитор. Превед весёлый драйвер Nouveau (отдельный превед лягушатникам за не читаемое название "нуво", в котором дохера лишних букв).

Попытка заставить мою систему выводить изображение на нужный порт методом
#xrandr --output DVI-0-1
привели к посылу меня системой по известным координатам.

Из-за того, что меня люто ломало напрягать мозг и изучать интернет (при беглом его осмотре лекарства не нашёл), я выдернул провод DVI-D, воткнул HDMI, система, естественно показала личико, а уж там через графический интерфейс, подключив обратно DVI, я заставил выводить изображение на нужный мне экран.

Радость моя была не долгой. До первой перезагрузки. Потом - снова VGA. Тут уж не выдержала моя психика - установил проприетарный драйвер NVIDIA и всё заработало. Удалил - всё осталось работать. Сплюнул, выдохнул.

Теперь могу снова спокойно музицировать, с минимальными задержками (благодаря low-lattency ядру) и без всяких покрякиваний и потрескиваний в звуке (как это обычно происходит в Windows).

3. OpenSUSE и не совместимые дрова.

Самая оригинальная картина наблюдалась в OpenSUSE. Она заключалась в том, что в официальных репозиториях, находился драйвер NVIDIA не совместимый с текущей сборкой ядра.
В итоге после загрузки система тупо вываливалась в консоль, а попытка вызвать иксы командой startx (полезно, когда хочешь узнать из-за чего иксы мертвы) выдавала строку:

This server has a video driver ABI version of 15.0 that is not
supported by this NVIDIA driver. Please check
http://www.nvidia.com/
for driver updates or downgrade to an X
server with a supported driver ABI.


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

После этого официальный драйвер наконец-то встал как надо и всё заработало.

Есть, однако в этом решении полуправда - а именно то, что теперь после сборок ядра придётся пересобирать дрова.

Есть альтернативное решение, которое описывается в этих ваших интернетах, которое у меня на OpenSUSE не заработало, но может кому-то поможет. А именно - добавить в /etc/X11/xorg.conf строку:

Section "ServerFlags"
    Option         "IgnoreABI" "True"
EndSection


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

В общем, вот так и живём. За то теперь всё работает, пока я снова всё не поломал. А ломать я буду уже в ближайшем будущем - хочу поэкспериментировать с системой DUET. Для тех, кто в бункере - это костыли, позволяющие на материнской плате с BIOS поставить на хард UEFI и с него грузить всё в режиме UEFI с поддержкой GPT и портируемостью драйверов между системами.

Всем добра.

Комментариев нет:

Отправить комментарий