Ubuntu + zárt NVidia driver: frissítés után nincs X

Nvidia logo
Probléma: Nvidia videokártyád van, Nouveou helyett az Ubuntu által javasolt, de zárt gyári illesztőprogramot használod. Ubuntu 18.04 → 20.04 irányú disztribúció frissítés után vagy olykor egyszerű rendszerfrissítés után nincs grafikus felület. A képernyő villódzik pár percig, majd sötét marad. Videokártyád pedig régi, az Nvidia már nem támogatja.

A rendszernaplóban azt látod, hogy a Gnome nem tud elindulni, mert nem fut az X. De azért próbálkozik:

okt 26 23:50:39 K50IE gnome-session[359233]: gnome-session-check-accelerated: GLES Helper exited with code 256
okt 26 23:50:39 K50IE gnome-session-c[359235]: eglGetDisplay() failed
okt 26 23:50:39 K50IE gnome-session[359233]: gnome-session-check-accelerated: GL Helper exited with code 256
okt 26 23:50:39 K50IE gnome-session[359234]:   Current serial number in output stream:  20
okt 26 23:50:39 K50IE gnome-session[359234]:   Serial number of failed request:  19
okt 26 23:50:39 K50IE gnome-session[359234]:   Value in failed request:  0x0
okt 26 23:50:39 K50IE gnome-session[359234]:   Minor opcode of failed request:  3 (X_GLXCreateContext)
okt 26 23:50:39 K50IE gnome-session[359234]:   Major opcode of failed request:  151 (GLX)
okt 26 23:50:39 K50IE gnome-session[359234]: X Error of failed request:  BadValue (integer parameter out of range for operation)
okt 26 23:50:37 K50IE gnome-session-binary[359090]: WARNING: App 'org.gnome.Shell.desktop' exited with code 1
okt 26 23:50:37 K50IE gnome-session-binary[359090]: Unrecoverable failure in required component org.gnome.Shell.desktop
okt 26 23:50:37 K50IE gnome-session[359090]: gnome-session-binary[359090]: WARNING: App 'org.gnome.Shell.desktop' exited with code 1
okt 26 23:50:37 K50IE gnome-shell[359110]: Failed to create backend: No drm devices found
okt 26 23:50:36 K50IE at-spi-bus-launcher[359073]: X connection to :0 broken (explicit kill or server shutdown).
okt 26 23:50:36 K50IE gnome-session-binary[358976]: CRITICAL: We failed, but the fail whale is dead. Sorry....
okt 26 23:50:36 K50IE gnome-session-binary[358976]: WARNING: software acceleration check failed: A gyermekfolyamat a következő kóddal lépett ki: 1
okt 26 23:50:36 K50IE gnome-session[358976]: gnome-session-binary[358976]: CRITICAL: We failed, but the fail whale is dead. Sorry....
okt 26 23:50:36 K50IE gnome-session[358976]: gnome-session-binary[358976]: WARNING: software acceleration check failed: A gyermekfolyamat a következő kóddal lépett ki: 1

Az X pedig nem fér hozzá a videokártyához:

okt 26 23:50:38 K50IE /usr/lib/gdm3/gdm-x-session[359129]: (II) LoadModule: "fbdevhw"
okt 26 23:50:38 K50IE /usr/lib/gdm3/gdm-x-session[359129]: (II) Loading sub module "fbdevhw"
okt 26 23:50:38 K50IE /usr/lib/gdm3/gdm-x-session[359129]: (EE) open /dev/dri/card0: No such file or directory
okt 26 23:50:38 K50IE /usr/lib/gdm3/gdm-x-session[359129]: (WW) Falling back to old probe method for modesetting
okt 26 23:50:38 K50IE /usr/lib/gdm3/gdm-x-session[359129]: (EE) open /dev/dri/card0: No such file or directory
okt 26 23:50:38 K50IE /usr/lib/gdm3/gdm-x-session[359129]: (EE) [drm] Failed to open DRM device for pci:0000:02:00.0: -19

A hiba oka: nézzük meg közelebbről, próbáljuk meg kézzel feltelepíteni az illesztőprogramot. Ekkor ezt kapjuk:

# apt install nvidia-340 
Csomaglisták olvasása... Kész
Függőségi fa építése       
Állapotinformációk olvasása... Kész
nvidia-340 már a legújabb verzió (340.108-0ubuntu5.20.04.2).
0 frissített, 0 újonnan telepített, 0 eltávolítandó és 0 nem frissített.
1 nincs teljesen telepítve/eltávolítva.
A művelet után 0 B lemezterület kerül felhasználásra.
Folytatni akarja? [I/n] y
Beállítás: nvidia-340 (340.108-0ubuntu5.20.04.2) ...
dpkg: hiba: version '-' has bad syntax: revision number is empty
dpkg: hiba: version '-' has bad syntax: revision number is empty
update-initramfs: deferring update (trigger activated)
INFO:Enable nvidia-340
DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/put_your_quirks_here
DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/dell_latitude
DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/lenovo_thinkpad
Removing old nvidia-340-340.108 DKMS files...
 
------------------------------
Deleting module version: 340.108
completely from the DKMS tree.
------------------------------
Done.
Loading new nvidia-340-340.108 DKMS files...
Building for 5.11.0-38-generic
Building for architecture x86_64
Building initial module for 5.11.0-38-generic
ERROR: Cannot create report: [Errno 17] File exists: '/var/crash/nvidia-340.0.crash'
Error! Bad return status for module build on kernel: 5.11.0-38-generic (x86_64)
Consult /var/lib/dkms/nvidia-340/340.108/build/make.log for more information.
dpkg: hiba a csomag feldolgozásakor: nvidia-340 (--configure):
 installed nvidia-340 package post-installation script subprocess returned error exit status 10
Aktiválók feldolgozása: libc-bin (2.31-0ubuntu9.2) ...
Aktiválók feldolgozása: initramfs-tools (0.136ubuntu6.6) ...
update-initramfs: Generating /boot/initrd.img-5.11.0-38-generic
Hibák történtek a feldolgozáskor:
 nvidia-340
E: Sub-process /usr/bin/dpkg returned an error code (1)

Ha belekukkantunk a /var/lib/dkms/nvidia-340/340.108/build/make.log fájlba, akkor egy csomó warning után találunk egy (pár) errort is:

In file included from /var/lib/dkms/nvidia-340/340.108/build/nv-frontend.c:13:
/var/lib/dkms/nvidia-340/340.108/build/nv-linux.h: At top level:
/var/lib/dkms/nvidia-340/340.108/build/nv-linux.h:122:10: fatal error: asm/kmap_types.h: Nincs ilyen fájl vagy könyvtár
  122 | #include <asm/kmap_types.h>         /* page table entry lookup          */
      |          ^~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [scripts/Makefile.build:288: /var/lib/dkms/nvidia-340/340.108/build/nv-frontend.o] Error 1
make[2]: Target '__build' not remade because of errors.
make[1]: *** [Makefile:1849: /var/lib/dkms/nvidia-340/340.108/build] Error 2
make[1]: Target 'modules' not remade because of errors.
make[1]: Leaving directory '/usr/src/linux-headers-5.11.0-38-generic'
NVIDIA: left KBUILD.
nvidia.ko failed to build!
make: *** [Makefile:202: nvidia.ko] Error 1
make: Target 'module' not remade because of errors.

Ez röviden azt jelenti, hogy a 340.108-as Nvidia illesztőprogram teljes egészében inkompatibilis a jelenlegi kernellel. Nem mintha eddig nem lett volna sejthető.
[morgás on] Mivel ez a probléma nem tegnap ugrott ki a bokorból, ráadásul az alapértelmezett, hosszan támogatott Ubuntu HWE csomaggal jön elő, nem igazán értem, hogy miért nincs még javítva. Akár úgy is, hogy átlag felhasználó ne is tudja a zárt illesztőprogramok közül telepíteni az inkompatibilis illesztőprogramot. [morgás off]

Megoldás #1: Használhatod tovább a meglévő 5.11-es kerneledet, ugyanakkor be kell érned a Nouveou-val. Ezt az utat akkor javaslom, hogy van olyan hardvered, amit a Linux 5.11 támogat, de a korábbi 5.4 még nem. Ugyanakkor együtt tudsz élni azzal a tudattal, hogy a Nouveou sok esetben lassabb és bugosabb lehet mint a gyári illesztőprogram, illetve az energiagazdálkodás területén lévő hiányosságai miatt előfordulhat, hogy a videokártyád jobban melegszik (ami laptop esetén csökkent üzemidőt jelent).

Ha ezt választod, akkor töröld az illesztőprogramot:
# apt purge nvidia-340
és indítsd újra a géped. Kész vagy.

Megoldás #2: Telepíted a továbbra is hosszan támogatott, de mindenképp régebbi 5.4-es Linux kernelt. Előnye, hogy megy vele a gyári Nvidia illesztőprogram, hátránya, hogy az 5.4 relatív régi kernel, és ha újabb hardvered van lehet, hogy döcögős a támogatás.

Ebben az esetben először távolítsd el a nem működő illesztőprogram darabjait:
# apt purge nvidia-340
Majd telepítsd a linux-generic csomagot:
# apt install linux-generic

Indítsd újra a gépet és nézd meg, hogy elindul-e az 5.4-es kernel, és minden működik-e vele. Az 5.4-esnek kell(ene) az alapértelmezettnek lennie, elvileg ez tölt be automatikusan. Ugyanakkor mindenképp figyelj indításkor, hogy mi indul el. Ha az 5.11-es lenne az alapértelmezett, akkor kézzel indítsd el az 5.4-est. Látványos előrelépés, hogy újra van grafikus felület. Hurrá!

Töröld a linux-generic-hwe-20.04 csomagot:
# apt purge linux-generic-hwe-20.04

Lesznek innentől szükségtelenné vált csomagok, ezeket is érdemes törölni:
# apt autoremove

Lehet, hogy beragadt pár 5.11-es kernel csomag, amiket az autoremove nem szúrt ki. Takarítsuk le ezeket is:
# apt purge linux-image-*5.11*

Végül telepítsd a zárt illesztőprogramot. Ezt megteheted a következő paranccsal vagy grafikus felületen a megszokott „Szoftver és frissítések” ablak „További illesztőprogramok” fülén. Nincs különbség.
# ubuntu-drivers install nvidia

A telepítés ezúttal sikerülni fog (remélem, két gépen is tesztelve). Indítsd újra a géped és kész is vagy.

Jogosan merülhet fel a kérdés, hogy mi a különbség az # ubuntu-drivers install nvidia módú illesztőprogram telepítés és az # apt install nvidia-340 közt. A válasz az, hogy míg az apt-os megoldás csak magát az illesztőprogramot teszi fel (ami sokszor elég is), az ubuntu-drivers még extra konfigurálást és egyéb telepítéseket is végez, mindezt azért, hogy minél jobb legyen a felhasználói élmény. Például míg az ubuntu-drivers felteszi az nvidia-settings grafikus beállítóprogramot, addig az apt-os megoldás nem.