Command Line - Linux

Risolvere l’errore “No available modular metadata” per nginx su Rocky Linux

Durante un aggiornamento di sistema con dnf -y update su Rocky Linux, può comparire un errore che interrompe la transazione e impedisce l’aggiornamento di nginx

No available modular metadata for modular package 'nginx-2:1.26.3-9.module+el9.8.0+40222+e48d13b6.1.x86_64', it cannot be installed on the system
No available modular metadata for modular package 'nginx-core-2:1.26.3-9.module+el9.8.0+40222+e48d13b6.1.x86_64', it cannot be installed on the system
No available modular metadata for modular package 'nginx-filesystem-2:1.26.3-9.module+el9.8.0+40222+e48d13b6.1.noarch', it cannot be installed on the system
Error: No available modular metadata for modular package

I pacchetti vengono salvati in cache ma non installati. La causa e la soluzione sono legate al sistema di moduli dnf.

La causa

Rocky Linux, come RHEL e le altre derivate, gestisce alcune applicazioni tramite il sistema dnf modules: invece di un singolo pacchetto statico, il software viene distribuito attraverso stream versionati (es. nginx:1.22, nginx:1.24, nginx:1.26), ognuno con i propri metadati che descrivono quali pacchetti appartengono a quello stream.

Quando dnf trova un pacchetto con la firma module+el9.x.y+… nel nome, cerca nei metadati modulari disponibili per determinare a quale stream appartiene. Se non riesce ad associarlo univocamente, blocca la transazione.

Il problema si manifesta tipicamente quando uno o più repository di terze parti con supporto modulare sono abilitati sul sistema. Il caso più comune è il repository Remi (remi-modular), molto diffuso su server con PHP gestito via Remi. In presenza di remi-modular, dnf non riesce a risolvere l’appartenenza del pacchetto nginx allo stream AppStream corretto perché lo stream non è stato abilitato esplicitamente sul sistema.

La diagnosi

Prima di intervenire conviene verificare lo stato degli stream nginx disponibili e i repository attivi

dnf module list nginx

mostra gli stream disponibili per nginx

Rocky Linux 9 - AppStream
Name   Stream   Profiles     Summary
nginx  1.22     common [d]   nginx webserver
nginx  1.24     common [d]   nginx webserver
nginx  1.26     common [d]   nginx webserver

Il simbolo [d] indica lo stream default, ma default non significa abilitato. Senza un’abilitazione esplicita, dnf non dispone del contesto modulare necessario per associare il pacchetto al suo stream.

dnf repolist

mostra i repository attivi

repo id               repo name
appstream             Rocky Linux 9 - AppStream
baseos                Rocky Linux 9 - BaseOS
epel                  Extra Packages for Enterprise Linux 9 - x86_64
remi-modular          Remi's Modular repository for Enterprise Linux 9 - x86_64
remi-safe             Safe Remi's RPM repository for Enterprise Linux 9 - x86_64

Se nell’output compare remi-modular, è questa la fonte del conflitto.

La soluzione

La soluzione è abilitare esplicitamente lo stream nginx su AppStream. Questo fornisce a dnf il contesto modulare necessario per associare correttamente i pacchetti nginx durante la risoluzione delle dipendenze

dnf module enable nginx:1.26 -y

Una volta abilitato lo stream, l’aggiornamento può essere ripetuto e si completerà senza errori

dnf -y update

Lo stato [e]nabled assegnato allo stream è persistente, quindi il problema non si ripresenta ai successivi aggiornamenti.

Se non si vuole gestire gli stream modulari o si ha necessità di sbloccare rapidamente l’aggiornamento, è possibile escludere nginx dalla transazione e aggiornare tutto il resto

dnf -y update --exclude=nginx\*

Successivamente si abilita lo stream e si aggiorna solo nginx

dnf module enable nginx:1.26 -y
dnf install nginx -y