Downgrade del kernel in Arch
Nel mio ormai vetusto computer, che monta una più che obsoleta scheda nVidia, sono costretto a usare i vecchi driver versione 390 prelevati da AUR, come ho già avuto modo di scrivere.1 Questo comporta che, se i driver non sono compatibili con una nuova versione del kernel, questi non verranno compilati correttamente e, al successivo riavvio, avrei un computer che molto probabilmente non partirà.
Nell’ultima sessione di aggiornamento della mia Arch ho riscontrato nuovamente questo problema. Dopo aver dato il solito:
sudo pacman -Syu
questo l’output, dove ho tolto un po’ di righe che non ci interessano:
:: Sincronizzazione dei database in corso...
core 117,0 KiB 355 KiB/s 00:00 [##################] 100%
extra 7,8 MiB 6,26 MiB/s 00:01 [##################] 100%
:: Aggiornamento del sistema in corso...
risoluzione delle dipendenze in corso...
ricerca dei pacchetti in conflitto in corso...
Pacchetti (94) [...]
Dimensione totale dei pacchetti da scaricare: 1018,12 MiB
Dimensione totale dei pacchetti da installare: 3481,25 MiB
Dimensione netta dell'aggiornamento: 10,62 MiB
:: Vuoi procedere con l'installazione? [S/n]
:: Download dei pacchetti in corso...
[...]
(11/21) Install DKMS modules
==> dkms install --no-depmod nvidia/390.157 -k 6.14.4-arch1-2
Error! Bad return status for module build on kernel: 6.14.4-arch1-2 (x86_64)
Consult /var/lib/dkms/nvidia/390.157/build/make.log for more information.
==> WARNING: `dkms install --no-depmod nvidia/390.157 -k 6.14.4-arch1-2' exited 10
(12/21) Restarting cronie for libc upgrade...
(13/21) Updating linux initcpios...
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
==> Using default configuration file: '/etc/mkinitcpio.conf'
-> -k /boot/vmlinuz-linux -g /boot/initramfs-linux.img
==> Starting build: '6.14.4-arch1-2'
-> Running build hook: [base]
[...]
-> Running build hook: [fsck]
==> ERROR: module not found: 'nvidia'
==> ERROR: module not found: 'nvidia_modeset'
==> ERROR: module not found: 'nvidia_uvm'
==> ERROR: module not found: 'nvidia_drm'
==> Generating module dependencies
==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux.img'
==> WARNING: errors were encountered during the build. The image may not be complete.
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
==> Using default configuration file: '/etc/mkinitcpio.conf'
-> -k /boot/vmlinuz-linux -g /boot/initramfs-linux-fallback.img -S autodetect
==> Starting build: '6.14.4-arch1-2'
-> Running build hook: [base]
[...]
-> Running build hook: [fsck]
==> ERROR: module not found: 'nvidia'
==> ERROR: module not found: 'nvidia_modeset'
==> ERROR: module not found: 'nvidia_uvm'
==> ERROR: module not found: 'nvidia_drm'
==> Generating module dependencies
==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux-fallback.img'
==> WARNING: errors were encountered during the build. The image may not be complete.
errore: l'esecuzione del comando non è riuscita correttamente
[...]
Il driver non è compatibile col nuovo kernel e serve un’altra patch.2 Vado su AUR e trovo (ovviamente!) un commento di un altro utente: non essendoci ancora la patch disponibile, l’unico modo per risolvere temporaneamente è disinstallare la versione nuova del kernel o, per meglio dire con termine tecnico, “downgradare” il kernel, tornando quindi alla versione che stiamo usando in questo momento, visto che non abbiamo ancora riavviato.
I pacchetti da retrocedere di versione sono linux, linux-headers, gcc,
gcc-libs, come indicato dall’utente su AUR.
Analisi della situazione
In base a quanto detto, vediamo quali sono i pacchetti e le versioni che abbiamo appena installato con l’aggiornamento e quali sono le versioni da ripristinare:
- Pacchetti installati da retrocedere
linux-6.14.4.arch1-2linux-headers-6.14.4.arch1-2gcc-15.1.1+r7+gf36ec88aa85a-1gcc-libs-15.1.1+r7+gf36ec88aa85a-1
Vediamo quali erano le versioni precedenti dei pacchetti guardando la cache di
pacman. Cominciamo con linux:
$ ls -l /var/cache/pacman/pkg/linux-6.14.4.arch1-*
-rw-r--r-- 1 root root 145830356 26 apr 03.05 /var/cache/pacman/pkg/linux-6.14.4.arch1-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root 119 26 apr 03.06 /var/cache/pacman/pkg/linux-6.14.4.arch1-1-x86_64.pkg.tar.zst.sig
-rw-r--r-- 1 root root 145998435 29 apr 12.05 /var/cache/pacman/pkg/linux-6.14.4.arch1-2-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root 215 29 apr 12.05 /var/cache/pacman/pkg/linux-6.14.4.arch1-2-x86_64.pkg.tar.zst.sig
Quindi il pacchetto è linux-6.14.4.arch1-1-x86_64.pkg.tar.zst.
Ora passiamo a linux-headers:
$ ls -l /var/cache/pacman/pkg/linux-headers-6.14.4.arch1-*
-rw-r--r-- 1 root root 52859906 26 apr 03.05 /var/cache/pacman/pkg/linux-headers-6.14.4.arch1-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root 119 26 apr 03.06 /var/cache/pacman/pkg/linux-headers-6.14.4.arch1-1-x86_64.pkg.tar.zst.sig
-rw-r--r-- 1 root root 52895857 29 apr 12.06 /var/cache/pacman/pkg/linux-headers-6.14.4.arch1-2-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root 215 29 apr 12.06 /var/cache/pacman/pkg/linux-headers-6.14.4.arch1-2-x86_64.pkg.tar.zst.sig
Qui il pacchetto è linux-headers-6.14.4.arch1-1-x86_64.pkg.tar.zst.
Ora gcc e gcc-libs:
$ ls -l /var/cache/pacman/pkg/gcc*
-rw-r--r-- 1 root root 56596007 29 apr 09.16 /var/cache/pacman/pkg/gcc-15.1.1+r7+gf36ec88aa85a-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root 215 29 apr 09.16 /var/cache/pacman/pkg/gcc-15.1.1+r7+gf36ec88aa85a-1-x86_64.pkg.tar.zst.sig
-rw-r--r-- 1 root root 37645039 29 apr 09.21 /var/cache/pacman/pkg/gcc-libs-15.1.1+r7+gf36ec88aa85a-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root 215 29 apr 09.21 /var/cache/pacman/pkg/gcc-libs-15.1.1+r7+gf36ec88aa85a-1-x86_64.pkg.tar.zst.sig
Come si vede dall’output, per questi due pacchetti non ho in cache la versione precedente, per cui li prenderemo dall’archivio di Arch:
https://archive.archlinux.org/packages/
Basta entrare nelle rispettive directory g/gcc e g/gcc-libs: da lì prendere
gli indirizzi dei due pacchetti.
Nel nostro caso questi sono i pacchetti da ripristinare per gcc e gcc-libs:
gcc-14.2.1+r753+g1cd744a6828f-1-x86_64gcc-libs-14.2.1+r753+g1cd744a6828f-1-x86_64
Ricapitolando, questi sono gli indirizzi che daremo in pasto a pacman per l’installazione:
/var/cache/pacman/pkg/linux-6.14.4.arch1-1-x86_64.pkg.tar.zst
/var/cache/pacman/pkg/linux-headers-6.14.4.arch1-1-x86_64.pkg.tar.zst
https://archive.archlinux.org/packages/g/gcc/gcc-14.2.1+r753+g1cd744a6828f-1-x86_64.pkg.tar.zst
https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-14.2.1+r753+g1cd744a6828f-1-x86_64.pkg.tar.zst
Due saranno quindi prelevati dalla cache di pacman e due dall’archivio di Arch.
Avvio del downgrade
Lanciamo (senza paura!) l’‘aggiornamento’ di tutti i pacchetti (che in realtà è una retrocessione) dando in un colpo solo:
sudo pacman -U \
/var/cache/pacman/pkg/linux-6.14.4.arch1-1-x86_64.pkg.tar.zst \
/var/cache/pacman/pkg/linux-headers-6.14.4.arch1-1-x86_64.pkg.tar.zst \
https://archive.archlinux.org/packages/g/gcc/gcc-14.2.1+r753+g1cd744a6828f-1-x86_64.pkg.tar.zst \
https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-14.2.1+r753+g1cd744a6828f-1-x86_64.pkg.tar.zst
Adesso pacman eseguirà l’installazione di queste versioni sostituendo quelle più recenti. Lascio l’output completo del comando:
:: Download dei pacchetti in corso...
gcc-14.2.1+r753+g1cd744a6828f-1-x86_64 51,1 MiB 5,00 MiB/s 00:10 [################################################] 100%
gcc-libs-14.2.1+r753+g1cd744a6828f-1-x86_64 35,0 MiB 4,28 MiB/s 00:08 [################################################] 100%
caricamento dei pacchetti in corso...
attenzione: installazione in corso di una versione meno recente del pacchetto linux (6.14.4.arch1-2 => 6.14.4.arch1-1)
attenzione: installazione in corso di una versione meno recente del pacchetto linux-headers (6.14.4.arch1-2 => 6.14.4.arch1-1)
attenzione: installazione in corso di una versione meno recente del pacchetto gcc (15.1.1+r7+gf36ec88aa85a-1 => 14.2.1+r753+g1cd744a6828f-1)
attenzione: installazione in corso di una versione meno recente del pacchetto gcc-libs (15.1.1+r7+gf36ec88aa85a-1 => 14.2.1+r753+g1cd744a6828f-1)
risoluzione delle dipendenze in corso...
ricerca dei pacchetti in conflitto in corso...
Pacchetti (4) gcc-14.2.1+r753+g1cd744a6828f-1 gcc-libs-14.2.1+r753+g1cd744a6828f-1 linux-6.14.4.arch1-1 linux-headers-6.14.4.arch1-1
Dimensione totale dei pacchetti da installare: 720,47 MiB
Dimensione netta dell'aggiornamento: -10,92 MiB
:: Vuoi procedere con l'installazione? [S/n]
(4/4) verifica delle chiavi presenti nel portachiavi [################################################] 100%
(4/4) verifica dell'integrità dei pacchetti [################################################] 100%
(4/4) caricamento dei file dei pacchetti [################################################] 100%
(4/4) controllo dei conflitti in corso [################################################] 100%
(4/4) controllo dello spazio disponibile sul disco [################################################] 100%
:: Esecuzione degli hook di pre-transazione...
(1/2) Removing linux initcpios...
(2/2) Remove DKMS modules
:: Elaborazione delle modifiche al pacchetto...
(1/4) downgrade in corso gcc-libs [################################################] 100%
(2/4) downgrade in corso linux [################################################] 100%
(3/4) downgrade in corso linux-headers [################################################] 100%
(4/4) downgrade in corso gcc [################################################] 100%
:: Esecuzione degli hook di post-transazione...
(1/5) Arming ConditionNeedsUpdate...
(2/5) Updating module dependencies...
(3/5) Install DKMS modules
==> dkms install --no-depmod nvidia/390.157 -k 6.14.4-arch1-1
==> depmod 6.14.4-arch1-1
(4/5) Updating linux initcpios...
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
==> Using default configuration file: '/etc/mkinitcpio.conf'
-> -k /boot/vmlinuz-linux -g /boot/initramfs-linux.img
==> Starting build: '6.14.4-arch1-1'
-> Running build hook: [base]
-> Running build hook: [udev]
-> Running build hook: [autodetect]
-> Running build hook: [microcode]
-> Running build hook: [modconf]
-> Running build hook: [kms]
-> Running build hook: [keyboard]
-> Running build hook: [keymap]
-> Running build hook: [consolefont]
-> Running build hook: [block]
-> Running build hook: [filesystems]
-> Running build hook: [resume]
-> Running build hook: [fsck]
==> Generating module dependencies
==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux.img'
-> Early uncompressed CPIO image generation successful
==> Initcpio image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
==> Using default configuration file: '/etc/mkinitcpio.conf'
-> -k /boot/vmlinuz-linux -g /boot/initramfs-linux-fallback.img -S autodetect
==> Starting build: '6.14.4-arch1-1'
-> Running build hook: [base]
-> Running build hook: [udev]
-> Running build hook: [microcode]
-> Running build hook: [modconf]
-> Running build hook: [kms]
-> Running build hook: [keyboard]
-> Running build hook: [keymap]
-> Running build hook: [consolefont]
-> Running build hook: [block]
-> Running build hook: [filesystems]
-> Running build hook: [resume]
-> Running build hook: [fsck]
==> Generating module dependencies
==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux-fallback.img'
-> Early uncompressed CPIO image generation successful
==> Initcpio image generation successful
(5/5) Updating the info directory file...
Al riavvio il computer è tornato perfettamente funzionante. Chiaramente, se diamo un:
sudo pacman -Syu
pacman proporrà l’aggiornamento dei pacchetti appena retrocessi:
:: Sincronizzazione dei database in corso...
core è aggiornato
extra è aggiornato
:: Aggiornamento del sistema in corso...
risoluzione delle dipendenze in corso...
ricerca dei pacchetti in conflitto in corso...
Pacchetti (4) gcc-15.1.1+r7+gf36ec88aa85a-1 gcc-libs-15.1.1+r7+gf36ec88aa85a-1 linux-6.14.4.arch1-2 linux-headers-6.14.4.arch1-2
Dimensione totale dei pacchetti da installare: 731,38 MiB
Dimensione netta dell'aggiornamento: 10,92 MiB
:: Vuoi procedere con l'installazione? [S/n]
Al che risponderemo n perché dobbiamo attendere la patch. Un’alternativa è
quella di bloccare l’aggiornamento di questi quattro pacchetti indicandolo nel
file di configurazione di pacman,3 ma preferisco per ora non fare
aggiornamenti in attesa della risoluzione del problema.
Come ho scritto in un altro post,1 questo è l’unico problema che ho riscontrato in Arch da quando lo uso, vale a dire la gestione del vecchio driver nVidia. Certo, basterebbe cambiare la scheda con una più recente, ma ormai questo relitto informatico ha i suoi anni e ha troppi acciacchi oltre a questo. Non ne vale la pena.
Aggiornamento del 11/05/2025.
Il buon @Lone_Wolf sul forum di Arch mi ha consigliato che c’è un modo più sicuro per fare questa operazione:
That will break all applications that require gcc-libs 15.1 .
Use How to restore all packages to a specific date to pin everything on your system to the state they had just before the switch to gcc 15.
Sapevo che pacman può fare ciò anche se non l’ho mai provato, ma ho pensato che la soluzione del problema era alle porte: per tale motivo ho deciso di attendere la patch prima di fare altri aggiornamenti.
-
Ne ho parlato sia in Come mi trovo con Arch Linux dopo quasi 3 anni che in Driver nVidia 390 su kernel 6.0 in Arch Linux. ↩︎ ↩︎
-
Al momento della stesura del post, queste sono le patch incluse nel pacchetto
nvidia-390xx-dkms:kernel-6.2.patch,kernel-6.3.patch,kernel-6.4.patch,kernel-6.5.patch,kernel-6.6.patch,kernel-6.8.patch,kernel-6.10.patch,kernel-6.12.patch,kernel-6.13.patch,kernel-6.14.patch↩︎ -
Ne ho parlato in KRDC 24.01.80-1 ha qualche problema di connessione. ↩︎