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 optirun
a, ale w najnowszej wersji klienta nie jest to obsługiwane.
Źródła
- https://wiki.archlinux.org/index.php/Bbswitch
- https://wiki.ubuntu.com/Bumblebee#Setup_for_14.04_and_later
- https://github.com/Bumblebee-Project/Bumblebee/issues/951#issuecomment-379512353
- https://askubuntu.com/questions/1029169/bumblebee-doesnt-work-on-ubuntu-18-04/1042950#1042950
- https://askubuntu.com/questions/669011/what-is-the-difference-between-optirun-and-primusrun
- https://wiki.archlinux.org/index.php/PRIME
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=922821
- https://forum.manjaro.org/t/bumblebee-error-could-not-enable-discrete-graphics-card/63310
- https://github.com/Bumblebee-Project/Bumblebee/issues/971
- https://askubuntu.com/questions/813826/what-does-gpu-manager-do
- https://github.com/Bumblebee-Project/Bumblebee/issues/526
- https://support.steampowered.com/kb_article.php?ref=6316-GJKC-7437