Ubuntu 20.04: Cursor blinking at boot after installing nvidia drivers

I am using nvidia-driver-460 version 460.39-0ubuntu0.20.04.1.

The GDM screen would only appear after typing Ctrl+Alt+F2 followed by Ctrl+Alt+F1.

Please comment and let me know if the following resolves the problem for you? Also, please mark yourself as affected by Bug #1811023 in Launchpad so this issue gets fixed.


Solution

The following seems to have fixed the issue for me, and the GDM screen now appears without having to resort to the above "trick".

  1. Edit the file /lib/udev/rules.d/61-gdm.rules.

    sudo nano /lib/udev/rules.d/61-gdm.rules
    

    The original file looks like this:

    # disable Wayland on Hi1710 chipsets
    ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", RUN+="/usr/lib/gdm3/gdm-disable-wayland"
    # disable Wayland when using the proprietary nvidia driver
    DRIVER=="nvidia", RUN+="/usr/lib/gdm3/gdm-disable-wayland"
    

    Comment all of the lines as shown:

    # disable Wayland on Hi1710 chipsets
    # ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", RUN+="/usr/lib/gdm3/gdm-disable-wayland"
    # disable Wayland when using the proprietary nvidia driver
    # DRIVER=="nvidia", RUN+="/usr/lib/gdm3/gdm-disable-wayland"
    

    Type Ctrl+X to exit, then Y, and then Enter to save the file.

  2. Ensure that the Wayland is not disabled in GDM.

    sudo nano /etc/gdm3/custom.conf
    

    Comment the "WaylandEnable" line, if it is not already commented, as shown:

    # WaylandEnable=false
    

    Type Ctrl+X to exit. If you made changes, type Y, and then Enter to save the file.

  3. Finally, reboot.


Explanation

The /lib/udev/rules.d/61-gdm.rules file is supposed to prevent GDM from displaying the Wayland session option when the NVIDIA proprietary drivers are installed, since NVIDIA does not support Wayland.

However, in Ubuntu 20.04, there seems to be another redundant mechanism or rule that also prevents GDM from displaying the Wayland session option. I suspect this, because even after making the above change, the Wayland session option is still not displayed in GDM. (Setting WaylandEnable=true in /etc/gdm3/custom.conf has no effect).

Therefore, I have a hunch that there are two conflicting rules, and disabling one of the rules (i.e. /lib/udev/rules.d/61-gdm.rules) seems to remove the conflict.

Here is the journalctl boot log before making the above changes. You can see there is an error loading the "fb" module.

/usr/lib/gdm3/gdm-x-session[964]: (II) Loading sub module "fb"
/usr/lib/gdm3/gdm-x-session[964]: (II) LoadModule: "fb"
/usr/lib/gdm3/gdm-x-session[964]: (II) Loading /usr/lib/xorg/modules/libfb.so
/usr/lib/gdm3/gdm-x-session[964]: (II) Module fb: vendor="X.Org Foundation"
/usr/lib/gdm3/gdm-x-session[964]:         compiled for 1.20.9, module version = 1.0.0
/usr/lib/gdm3/gdm-x-session[964]:         ABI class: X.Org ANSI C Emulation, version 0.4
/usr/lib/gdm3/gdm-x-session[964]: Xorg: ../../../../dix/privates.c:384: dixRegisterPrivateKey: Assertion `!global_keys[type].created' failed.
/usr/lib/gdm3/gdm-x-session[964]: (EE)
/usr/lib/gdm3/gdm-x-session[964]: (EE) Backtrace:

Here is the journalctl boot log after making the above changes. You can see the "fb" module loads successfully.

/usr/lib/gdm3/gdm-x-session[1357]: (II) Loading sub module "fb"
/usr/lib/gdm3/gdm-x-session[1357]: (II) LoadModule: "fb"
/usr/lib/gdm3/gdm-x-session[1357]: (II) Loading /usr/lib/xorg/modules/libfb.so
/usr/lib/gdm3/gdm-x-session[1357]: (II) Module fb: vendor="X.Org Foundation"
/usr/lib/gdm3/gdm-x-session[1357]:         compiled for 1.20.9, module version = 1.0.0
/usr/lib/gdm3/gdm-x-session[1357]:         ABI class: X.Org ANSI C Emulation, version 0.4
/usr/lib/gdm3/gdm-x-session[1357]: (II) Loading sub module "wfb"