Intro
Recently, I’ve installed Arch Linux on my laptop with GNOME as the desktop environment. But I noticed that it was using Xorg as the display server instead of Wayland . So I decided to switch to Wayland with NVIDIA GPU . Here’s how I did it.
My System
- Laptop: ASUS TUF Gaming A15 (FX506IH)
- OS: Arch Linux x86_64
- Kernel: Linux 6.10.5-zen1-1-zen
- DE: GNOME 46
Steps
Kernel Mode Setting (KMS)
Configuration
Kernel mode setting (KMS) is a method for setting display resolution and depth in the kernel space rather than user space ). It can be used in conjunction with the framebuffer device. KMS also enables newer technologies (such as DRI2 ) which will help reduce artifacts and increase 3D performance, even kernel space power-saving.
ⓘ NOTE:
At first, note that for any method you use, you should always disable:
- Any vga= options in your bootloader as these will conflict with the native resolution enabled by KMS.
- Any video= lines that enable a framebuffer that conflicts with the driver.
- Any other framebuffer drivers (such as uvesafb).
Because I generated the grub config using the grub-mkconfig
tool and have the default configuration, I don’t have the vga=
or video=
neither drivers that make conflicts with native resolution enabled by KMS. So, I’m good to go.
Late KMS start
Intel , Nouveau , ATI and AMDGPU drivers already enable KMS automatically for all chipsets, but the proprietary NVIDIA driver does not. To enable KMS for the NVIDIA driver, we need to manually enabled it.
DRM kernel mode setting
To enable it, set the modeset=1
kernel module parameter
for the nvidia_drm
module.
sudo nano /etc/default/grub
Edit the GRUB_CMDLINE_LINUX_DEFAULT
line to include nvidia-drm.modeset=1
:
Save the file and regenerate the grub config:
sudo grub-mkconfig -o /boot/grub/grub.cfg
in my case the path is /boot/efi
so the command will be:
sudo grub-mkconfig -o /boot/efi/grub/grub.cfg
Early KMS start (Optional)
KMS is typically initialized after the initramfs stage. However, it is possible to enable KMS already during the initramfs stage. Add the required module for the video driver to the initramfs configuration file:
nvidia
nvidia_modeset
nvidia_uvm
nvidia_drm
for the out-of-tree nvidia
and nvidia-open drivers
.
mkinitcpio
Configure the mkinitcpio
to include the NVIDIA modules:
sudo nano /etc/mkinitcpio.conf
Add the nvidia
nvidia_modeset
nvidia_uvm
nvidia_drm
modules to the MODULES
array:
Save and regenerate the initramfs using mkinitcpio
, because I’m using the linux-zen
kernel, so the command will be:
sudo mkinitcpio -p linux-zen
Make sure to replace linux-zen
with your kernel name. Like linux
, linux-lts
, linux-hardened
, etc. You can check the kernel name using the uname -r
command.
For the full kernel list you can check in Arch Wiki Kernel page.
or you can use the -P
flag to regenerate all preset file in /etc/mkinitcpio.d
directory:
sudo mkinitcpio -P
pacman hook
To ensure that the initramfs is always updated when the NVIDIA driver is updated, create a pacman hook that will regenerate the initramfs automatically.
First, create the hook directory:
sudo mkdir -p /etc/pacman.d/hooks
Then create the hook file:
sudo nano /etc/pacman.d/hooks/nvidia.hook
Paste the following content:
[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
# Uncomment the installed NVIDIA package
Target=nvidia
#Target=nvidia-open
#Target=nvidia-lts
# If running a different kernel, modify below to match
Target=linux-zen
[Action]
Description=Updating NVIDIA module in initcpio
Depends=mkinitcpio
When=PostTransaction
NeedsTargets
Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'
Make sure to edit the Target
line to match your NVIDIA driver package and kernel name. In my case, I’m using the nvidia
package and linux-zen
kernel.
Install GNOME (If you haven’t)
sudo pacman -S gnome
In selection prompt, just press Enter
to install all the packages. (default=all)
GDM Configuration
/etc/gdm/custom.conf (Optional)
If you want to use Wayland as the default session, you can edit the /etc/gdm/custom.conf
file:
sudo nano /etc/gdm/custom.conf
Uncomment the WaylandEnable
line and set it to true
:
Symlink the gdm rules
This step is often skipped that will cause the GDM only to use Xorg. To fix this, you need to symlink the GDM rules:
sudo ln -s /dev/null /etc/udev/rules.d/61-gdm.rules
Reboot
After all the steps above, reboot your system:
sudo reboot
Check
After rebooting in the login screen, you can check if you’re using Wayland by clicking the gear icon and see if there’s a GNOME on Wayland
or just GNOME
but the old one is GNOME on Xorg
.
You can also check the XDG_SESSION_TYPE environment variable:
echo $XDG_SESSION_TYPE
Also you can check the about section in the settings.
Like this:
You can use tools like neofetch
, screenfetch
or fastfetch
to check the NVIDIA GPU.
fastfetch
Summary
Now you have successfully enabled Wayland on GNOME with NVIDIA GPU in Arch Linux. You can check the References for more information.