NVIDIA on Linux

[ ← Back Home ]


Last modified on January 1, 2023

Table of Contents

NVIDIA GPUs are notoriously hard to setup on Linux. This comprehensive guide aims to make this relatively difficult process streamlined and easy, to maximize either performance or battery life.

This guide is aimed specifically at Arch Linux systems. The steps described here may not work on other distributions, but still remain indicative of the general setup required to get NVIDIA working.

NVIDIA Optimus (Laptops)

Optimus refers to the underlying system in laptops that allows them to manage both an Intel iGPU and an NVIDIA (dedicated) GPU. There are various ways of managing Optimus, and this section of the guide will run through various options.

By running the following command, one can check what GPU is currently rendering their screen:

glxinfo | grep "renderer"

If no configuration has been done, this should default to the **open-source Mesa driver. **This means your NVIDIA card is not rendering the screen at the moment;

Prerequisites

To setup NVIDIA cards on laptops, the following packages are required:

Manual setup

This section covers the process of manually creating and editing config files to setup your system the way you want.

PCI Bus

These sections will require you to determine the PCI bus of your NVIDIA card. This can be accomplished by running:

lspci | grep -i nvidia | awk '{print $1}'

This guide will assume your PCI bus is PCI:1:0:0. Please change this according to your setup.

Only use NVIDIA

Firstly, remove any blacklists or previous NVIDIA Optimus configuration:

sudo rm -rf /etc/modprobe.d/blacklist-nvidia.conf /lib/udev/rules.d/50-remove-nvidia.rules

Write this to /etc/X11/xorg.conf.d/90-nvidia.conf:

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia"
    Inactive "intel"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Option "AllowEmptyInitialConfiguration"
EndSection

Section "Device"
    Identifier "intel"
    Driver "modesetting"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Then create /etc/modprobe.d/nvidia.conf:

options nvidia-drm modeset=1

Xinit and Display Managers

To actually enable the use of the NVIDIA card, global Xorg configuration is often not enough. The individual display/login mangers (or your ~/.xinitrc file) have to be configured to properly enable NVIDIA rendering.

If using Xinit, add the following to your ~/.xinitrc file at the beginning:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

If using any display managers, change the following configuration files:

LightDM

Create a script, /etc/lightdm/display_setup.sh, and add the following:

#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Make the script executable by running:

sudo chmod +x /etc/lightdm/display_setup.sh

Then, edit /etc/lightdm/lightdm.conf to execute this script when launching LightDM:

[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

SDDM

SDDM has a convenient Xsetup file located in /usr/share/sddm/scripts/Xsetup that can be modified to add any parameters you wish. Add the following to enable NVIDIA:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

Firstly, ensure GDM is launching Xorg sessions and not Wayland sessions by editing /etc/gdm/custom.conf:

WaylandEnable=false

Then create two new files, /usr/share/gdm/greeter/autostart/optimus.desktop and /etc/xdg/autostart/optimus.desktop, and write the following contents to them:

[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

Only use the iGPU

Firstly, remove any custom NVIDIA Xorg configuration:

sudo rm -rf /etc/X11/xorg.conf.d/90-nvidia.conf /etc/modprobe.d/nvidia.conf

Ensure any display manager or Xinit configuration for NVIDIA is also removed!

Begin by blacklisting the NVIDIA card by creating /etc/modprobe.d/blacklist-nvidia.conf:

blacklist nouveau
blacklist nvidia
blacklist nvidia_drm
blacklist nvidia_uvm
blacklist nvidia_modeset

alias nouveau off
alias nvidia off
alias nvidia_drm off
alias nvidia_uvm off
alias nvidia_modeset off

Then create /lib/udev/rules.d/50-remove-nvidia.rules and add the following:

= Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"

= Remove NVIDIA USB Type-C UCSI devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"

= Remove NVIDIA Audio devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"

= Finally, remove the NVIDIA dGPU
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1"

Finally, remove any NVIDIA configuration in your display manager or your ~/.xinitrc file, if applicable.

Hybrid system

While your Linux system will automatically run Xorg on your iGPU by default, this doesn’t prevent the NVIDIA GPU from drawing select windows on your system. This can be achieved through NVIDIA PRIME, a hybrid graphics technology.

On Arch Linux, the following package can be installed:

sudo pacman -S nvidia-prime

After installing this, one can run any Xorg program with prime-run to run it under the NVIDIA GPU.

EnvyControl

There are multiple simple and easy-to-use scripts one can install to make managing NVIDIA Optimus a breeze. One such example is Envycontrol, a minimal python script which can automatically switch the GPU modes and disable/blacklist the NVIDIA GPU to save power, all on demand.

Installation

EnvyControl can be installed from source:

git clone https://github.com/geminis3/envycontrol.git
cd envycontrol
sudo pip install .

Alternatively, EnvyControl is available in the AUR:

paru -S envycontrol

Usage

EnvyControl automatically supports and can configure the following login managers:

If using Xinit, one can always add these lines to your ~/.xinitrc whenever NVIDIA is in use:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
xrandr --dpi 96

To actually switch between graphics modes, simply run EnvyControl as such:

sudo envycontrol --switch nvidia

After this, you will be prompted to reboot, and your system will be running under your specified GPU.

Please note: Disabling the NVIDIA GPU using envycontrol --switch integrated will cause the script to be unable to switch back to NVIDIA unless the system is switched back to hybrid mode.