Ubuntu 18.04, Steam and nvidia 390
After a lot of struggles I managed to get
nvidia-driver-390
work with bumblebee and Steam on Ubuntu 18.04. This post is an attempt to summarize my findings before I forget it all and then have to struggle with it again in the future.
Before upgrading to Ubuntu 18.04, my discreet Nvidia card had been running just fine with bumblebee, I could run games on steam using optirun
and life was good. After the upgrade things went south and even though I managed to get optirun
to work again, games on Steam would not start. Lots of googling later, I managed to fix it
My setup
I have Dell Inspiron 17 (7746), which comes with Intel HD Graphics 5500 (rev 09) and Nvidia GM108M [GeForce 845M] (rev ff). My desktop runs on the Intel card and I mainly use Nvidia to run games on Steam. To get the drivers and friends I use the awesome repo ppa:graphics-drivers/ppa, which I find very reliable.
nvidia-driver-390 installation
The installation is pretty straightforward and it has been covered in many other blogs, so I'll go over it quickly for completeness.
sudo apt-get purge nvidia* bumblebee*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install \
nvidia-driver-390 \
nvidia-modprobe \
bumblebee \
bumblebee-nvidia \
primus \
linux-headers-generic
The purging (first step) is recommended to avoid any dodgy leftovers which could screw up your evening. Then we add the graphics-drivers repo and finally install the packages.
Some of the packages are pretty obvious - nvidia-driver-390
, bumblebee
and bumblebee-nvidia
are pretty obvious. linux-headers-generic
are necessary for the driver to be built. primus
because first of all, it supposedly offers better performance than VirtualGL, and secondly - because I could only make Steam work on primus bridge. nvidia-modprobe
because my bumblebee was having a hard time loading the nvida module.
Important service changes for bumblebee and nvidia
Now we need to make sure that the bumblebee
service will start at the boot time, that nouveau
won't be loaded as a fallback and that the Intel card will be used by default. You may also disable the gpu-manager
service, which overwrites xorg.cong on each boot. Here we go:
sudo systemctl enable bumblebeed
sudo systemctl disable nvidia-fallback.service
sudo systemctl disable gpu-manager.service
sudo prime-select intel
Bumblebee and modules configuration
Once the packages are installed, appropriate services switched either on or off, it's time to apply a few tweaks here and there in the configuration. Let's start with bumblebee.
bumblebee.conf
Using your favourite editor open the file /etc/bumblebee/bumblebee.conf
, like so:
sudo nano /etc/bumblebee/bumblebee.conf
There is just a handful of changes required.
Driver
In the section [bumblebeed]
, should be line 22, change the driver to nvidia, because you don't want to use nouveau (I always have troubles spelling it):
Driver=nvidia
Bridge
In the section [optirun]
, should be line 32, change the bridget to primus. I'm suggesting this step, because virtualGL does not work for me in Steam anymore and none of the games wants to start:
Bridge=primus
Library Path
In the section [driver-nvidia]
, should be line 60, change the library path. It has changed for the new drivers (nvidia-driver-390):
LibraryPath=/usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu
Xorg Module Path
Again in the section [driver-nvidia]
, should be line 63, change the Xorg module path. Again, it has changed for the new drivers (nvidia-390):
XorgModulePath=/usr/lib/x86_64-linux-gnu/nvidia/xorg,/usr/lib/xorg/modules,/usr/lib/xorg/modules/input
environment
As explained by clover, there was a major change in the nvidia drivers, which now use glnvd. That prevents bumblebee from working with primus bridge. The fix is simple, you just need to:
sudo nano /etc/environment
and add the following line:
__GLVND_DISALLOW_PATCHING=1
modules
bbswitch and i915
We want to make sure that the bbswitch module and Intel card module are loaded upon boot.
sudo nano /etc/modules
and make sure you have the following two lines in there:
i915
bbswitch
Blacklisting
There is one more thing, which needs to be taken care of, otherwise the nvidia module either won't be loading or unloading when the Nvidia card is not in use.
sudo nano /etc/modprobe.d/blacklist-nvidia.conf
There is a warning at the top of the file, which discourages modifications. This can be safely ignored, because otherwise things won't work. We're acting on behalf of the greater good here. You need to make sure, that setting the alias for nvidia
is commented out or the module won't load. Also, the alias for nvida-drm
has to be set to off
or bumblebee won't be able to unload the module and switch off the Nvidia card when it is not in use. nvidia-modeset
is not harmful, so can be spared the alias as well. In essence, make sure you have the following three lines in this file:
#alias nvidia off
alias nvidia-drm off
alias nvidia-modeset off
Does nvidia-driver-390 work with bumblebee?
After all of that configuration you can now reboot your laptop and check if everything works correctly. First of all, none of the discreet GPU modules should be loaded, and the following commands should not yield any output.
lsmod | grep nvidia
lsmod | grep nouveau
If you want to see if optirun
works correctly, glxspheres64
included in the package virtualgl
does quite a good job.
optirun glxspheres64
It should open a window with lots of colourful, rotating spheres, and the output in the console should be similar to the following:
optirun glxspheres64
Polygons in scene: 62464 (61 spheres * 1024 polys/spheres)
Visual ID of window: 0x129
Context is Direct
OpenGL Renderer: GeForce 845M/PCIe/SSE2
61.676735 frames/sec - 68.831237 Mpixels/sec
60.006045 frames/sec - 66.966746 Mpixels/sec
60.023603 frames/sec - 66.986340 Mpixels/sec
60.037726 frames/sec - 67.002102 Mpixels/sec
If it doesn't work, the best advice I can give is this. First of all, try to understand the error message and see if it relates to any of the changes I have discussed above. It might have happened that you skipped something by accident. Secondly, ask Google and please let me know in the comments.
(small) caveat
primusrun
doesn't work for me at all, but I don't care that much, because optirun
does the job just as well with the primus
bridge. Most importantly, I can run my Steam games on the Nvidia card again.
If you found this post useful, please share.
Edit 2018.07.27: As Roland rightly pointed out, the nvidia-390
is a transitional package, and nvidia-driver-390
is the actual driver. I changed that throughout the text.
Edit 2018.07.28 As Roland figured out, if bbswitch does not switch off the Nvidia card when its not active it's worth checking if your GRUB_CMDLINE_LINUX
defined in /etc/default/grub
contains acpi_osi=Linux
. If you need to add it, remember to run sudo update-grub
afterwards.
Thanks for reading,
Jacek