Konfiguracja karty graficznej na ubuntu

Ktoś kiedyś powiedział, że Linux jest darmowy dla ludzi których czas nie jest nic warty. I mówiąc szczerze, jest w tym dość dużo prawdy. Szczególnie jeśli chce się korzystać z tego systemu do zastosowań „domowych” – czyli i do pracy i do zabawy. A jedną z sytuacji gdzie to widać jest poprawne skonfigurowanie karty graficznej w laptopie.

Zanim jednak przejdziemy do sedna sprawy musimy mieć kontekst. W „nowoczesnych laptopach” możemy często znaleźć dwie karty graficzne – szczególnie jeśli mówimy o high-endzie czy laptopach gamingowych – „wbudowaną” w procesor, często nazywaną kartą zintegrowaną, czy kartą dedykowaną / zewnętrzną. Takie rozdzielenie ma sens jeśli chodzi o laptopy i ich pracę na baterii. Karta zintegrowana jest wolniejsza i słabsza, ale dzięki temu pobiera o wiele mniej prądu czy też nie nagrzewa aż tak jak karta zewnętrzna. A karta dedykowana jest zaś silniejsza, ale skraca czas pracy na baterii i mocniej nagrzewa laptopa.

Idealnie by było gdybyśmy mogli uruchamiać gry czy inne aplikacje multimedialne na dedykowanej karcie graficznej, zaś całą resztę na zintegrowanej. I tak działa obsługa kart na Windowsie – przy uruchamianiu aplikacji możemy wybrać z którego procesora graficznego ma korzystać. A w niektórych przypadkach system sam wybierze najlepszą opcje.

Jak można się domyślić, tak to nie działa na Linuksie. Po części pewnie dlatego że system graficzny w każdej dystrybucji (czyli X Windows) pierwsze wydanie miał w 1984 roku, czyli 35 lat temu. Innym winowajcą będzie też słaba obsługa takiego mechanizmu przez sterowniki, dlatego że producenci kart graficznych nie uważają Linuksa za platformę gamingową czy też domową.

Kończąc wstęp, posiadam laptopa Dell Inspiron (którego nie polecam) z dwoma kartami graficznymi: zintegrowaną od Intela i dedykowaną od Nvidi.

Problem

Out of the box, zamknięte sterowniki do karty graficznej pozwalają na przełączanie się między nią a zintegrowaną. Takie rozwiązanie ma jednak trzy problemy, pierwsze – by zmienić kartę należy się co najmniej wylogować, drugie – gdy mam odpaloną kartę graficzną laptop się nagrzewa nawet gdy nic się nie jest uruchomione (na przykład jest wyświetlany tylko pulpit), trzeci – czas baterii jest mocno skracany.

Sterowniki otwarto źródłowe, czyli nouveau, nie są wcale lepsze w tym względzie. Dlatego na potrzeby tego artykułu je pominę i będę stosował tylko i wyłącznie oficjalne od Nvidii.

Co chcemy więc zrobić? Chcemy by można było uruchamiać per aplikacja dedykowaną kartę graficzną bez obawy o to że laptop będzie się niepotrzebnie nagrzewał czy skracał czas baterii.

Rozwiązanie

Oczywiście jak to już w ekosystemie Linuksa bywa, ktoś pomyślał że dobrze by było gdyby można było przełączać się między kartami bez potrzeby przelogowywania się. I tak z pomocą przychodzi nam program Bumblebee. Ten sam projekt o którym zrobiło się głośno gdy jeden z programistów pomylił się w i skrypcie odinstalowującym usuwał katalog /usr.

Nie nudząc jednak dalej, przejdźmy do tego jak to skonfigurować na Ubuntu. Po pierwsze będziemy potrzebowali zainstalować sam program z jego zależnościami. Do tego skorzystamy ze standardowego apt:

sudo apt-get install bumblebee bumblebee-nvidia primus linux-headers-generic

By przetestować czy oprogramowanie działa, należy wykonać następujące polecenie:

optirun -b primus glxinfo | grep vendor

Przy czym możemy nie mieć zainstalowanego programu glxinfo (który pokaże nam informacje o aktualnej karcie graficznej), by go zainstalować należy wgrać paczkę: mesa-utils:

sudo apt install mesa-utils

Wracając jednak do glxinfo, aktualnie w/w polecenie pokazuje następującą informacje:

server glx vendor string: SGI
client glx vendor string: Mesa Project and SGI
OpenGL vendor string: Intel Open Source Technology Center

Co oznacza, że program został uruchomiony przy pomocy karty zintegrowanej. Jeśli jednak u Ciebie działa to poprawnie (pokazuje się że korzystasz z karty NVIDIA) to możesz przejść do sekcji Uruchamianie aplikacji lub zweryfikować, poprzez uruchomienie glxinfo bez przedrostka optirun -b primus, czy dedykowana karta jest włączona cały czas.

Dlaczego bumblebee nie działa?

W wersji sterownika 390, nvidia zmieniła sposób w jaki on działa i poprzenosiła pliki które były wymagane do działania naszego programu. A gdy optirun nie potrafi uruchomić procesu dzięki bumblebee, to uruchamia proces bez zmiany czegokolwiek – czyli na aktualnie wykorzystywanej karcie zintegrowanej.

Jak to naprawić?

Przed przejściem do rozwiązania, zaznaczam że będzie ono przedstawione w postaci sekcji. Przy każdej sekcji należy sprawdzić czy optirun zaczął poprawnie działać, chociaż u mnie wymagane były wszystkie kroki.

Konfiguracja Bumblebee

W pliku /etc/bumblebee/bumblebee.conf, w sekcji driver-nvidia, należy poprawić ścieżki gdzie bumblebee ma szukać bibliotek:

LibraryPath=/usr/lib/x86_64-linux-gnu/nvidia-418/xorg:/usr/lib/x86_64-linux-gnu/nvidia-418:/usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu
XorgModulePath=/usr/lib/x86_64-linux-gnu/nvidia-418/xorg,/usr/lib/xorg/modules,/usr/lib/xorg/modules/input

Zwróćcie uwagę, że w nazwie katalogu mamy wersje sterownika więc po jego aktualizacji będzie trzeba powtarzać ten proces.

Nie jest to jednak cała konfiguracja. Potrzebujemy jeszcze zdefiniować dwie zmienne środowiskowe:

__GLVND_DISALLOW_PATCHING=1
PRIMUS_libGL=/usr/lib/x86_64-linux-gnu/libGL.so.1

Możemy dodać je do ~/.profile lub do /etc/environment (jeśli chcecie by każde konto mogło skorzystać z opcji uruchamiania karty dedykowanej).

Modprobe

Jedną z czynności jaką wykonuje bumblebee jest dynamiczne ładowanie modułów kernela. Domyślnie jednak wraz z załadowaniem modułu nvidia dostajemy dwa inne które mogą zepsuć nam możliwość załadowania i odłączenia go. Chodzi tutaj o moduł nvidia-drm, ale także o nvidia-modeset (blokowanie go według internetu nie jest jednak wymagane).

By to zrobić, należy zmodyfikować plik: /etc/modprobe.d/blacklist-nvidia.conf lub też go utworzyć z następującą zawartością:

# blacklist nvidia
blacklist nvidia-drm
blacklist nvidia-modeset
# alias nvidia off
alias nvidia-drm off 
alias nvidia-modeset off 

Po modyfikacji tego pliku należy zrestartować komputer.

Wyłączenie gpumanager

Kernel posiada funkcjonalność o nazwie gpumanager, z tego co rozumiem nadpisuje on domyślną konfiguracje X Window by odzwierciedlało to co potrafi wyświetlić aktualna karta graficzna. Jako że chcemy się przełączać między kartami, taka funkcjonalność może nam popsuć konfiguracje.

By ją wyłączyć należy dodać do parametrów uruchomieniowych kernela parametr nogpumanger. By to zrobić należy zmodyfikować plik /etc/default/grub:

GRUB_CMDLINE_LINUX="nogpumanager"

I zatwierdzić to przy pomocy polecenia:

update-grub

Oprócz tego należy zresetować komputer.

Uruchamianie aplikacji

Jeśli wszystko poszło dobrze, to teraz można odpalić dowolny program przy pomocy dedykowanej karty graficznej.

Dla przykładu u mnie odpalenie polecenia z początku artykułu wyświetla:

server glx vendor string: NVIDIA Corporation
client glx vendor string: primus
OpenGL vendor string: NVIDIA Corporation

Co oznacza że konfiguracja działa prawidłowo. Moglibyśmy teraz skonfigurować by Steam na Linuksa odpalał aplikacje przy pomocy optiruna, ale w najnowszej wersji klienta nie jest to obsługiwane.

Źródła

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s

Ta witryna wykorzystuje usługę Akismet aby zredukować ilość spamu. Dowiedz się w jaki sposób dane w twoich komentarzach są przetwarzane.