Rocky Linux: elencare i pacchetti installati con DNF e RPM

Su Rocky Linux potete elencare i pacchetti installati con dnf list --installed oppure rpm -qa. DNF offre informazioni sui repository e sulle transazioni; RPM interroga il database locale dei pacchetti ed è utile anche per sapere quale pacchetto contiene un file.

Elencare tutti i pacchetti installati

DNF, da Dandified YUM, è il gestore di pacchetti usato da Rocky Linux. Il comando seguente mostra nomi, versioni e informazioni sul repository associate ai pacchetti installati:

dnf list --installed

La colonna del repository non garantisce che oggi la stessa versione sia ancora scaricabile. Un pacchetto installato localmente o con origine non disponibile può apparire come @System. La consultazione ordinaria dell'elenco non richiede privilegi amministrativi; DNF può comunque usare o acquisire metadati e risentire di filtri di configurazione.

Per interrogare direttamente il database RPM locale e ordinare il risultato:

rpm -qa | sort

L'output predefinito di rpm -qa contiene normalmente nome, versione, release e architettura, non soltanto il nome. La forma esatta può dipendere dalla configurazione RPM; per un confronto ripetibile usate il formato esplicito mostrato più avanti.

Per scorrere una lista lunga oppure cercare una parte del nome:

rpm -qa | sort | less
rpm -qa | grep -i postgresql

In less premete q per uscire e usate / per cercare. grep -i postgresql ignora maiuscole e minuscole e cerca una corrispondenza parziale nell'intera riga; non è una verifica di identità esatta. Se non compare nulla, distinguete l'assenza di corrispondenze da un errore del comando che produce la lista.

Verificare un pacchetto o trovare quello di un file

Quando conoscete il nome del pacchetto

rpm -q curl
dnf info --installed curl

Se curl è installato, RPM ne riporta l'identificativo; se non lo è, segnala l'assenza e termina con stato diverso da zero. DNF mostra informazioni più estese limitate ai pacchetti installati. Un pacchetto presente in un repository non è necessariamente già installato: l'opzione --installed evita questa confusione.

Quando conoscete un comando o un percorso

rpm -qf cerca nel database il pacchetto che contiene il percorso indicato. Non indica il proprietario Unix del file. Nell'esempio per Python risolviamo prima il percorso dell'eseguibile e poi quello dei collegamenti simbolici:

rpm -qf /usr/bin/curl
python_path=$(type -P python3) &&
python_real=$(readlink -f -- "$python_path") &&
rpm -qf -- "$python_real"

Queste righe richiedono Bash e GNU readlink. type -P cerca un eseguibile nel PATH senza usare un alias o una funzione; && esegue il passo successivo solo se quello precedente riesce. Se Python non viene trovato o il percorso non è risolvibile, la relativa query RPM non parte. Le virgolette conservano eventuali spazi. Il link e il suo bersaglio possono appartenere a pacchetti diversi: per indagare il link stesso interrogate anche il percorso non risolto.

Un file creato manualmente o installato in un ambiente virtuale Python può non appartenere ad alcun RPM. In quel caso un risultato negativo non dimostra che il file sia danneggiato. Per cercare nei repository un pacchetto che fornisce un file, anche non ancora installato, usate:

dnf provides '*/semanage'

Le virgolette impediscono alla shell di espandere * nei file della directory corrente. dnf provides consulta i repository abilitati e può richiedere metadati di rete; il risultato è una proposta di pacchetto, non la prova della sua installazione locale.

Leggere versioni, architetture e date di installazione

Il formato di query RPM permette di scegliere i campi senza analizzare l'output destinato alla lettura umana. Qui le tre colonne sono nome, epoch:versione-release e architettura, separate da tabulazioni:

rpm -qa --qf '%{NAME}\t%{EPOCHNUM}:%{VERSION}-%{RELEASE}\t%{ARCH}\n' | sort

L'epoch è un numero usato nel confronto delle versioni RPM; EPOCHNUM rende numerico anche il caso senza epoch esplicito. VERSION e RELEASE distinguono versione del software e revisione del pacchetto. Le sequenze \t e \n, protette dagli apici singoli, vengono interpretate da RPM come tabulazione e fine riga.

Per vedere fino a 30 installazioni più recenti fra i pacchetti attualmente registrati:

rpm -qa --last | head -n 30

L'ordine è basato sulla data di installazione, non sulla data di pubblicazione del software. Non è la cronologia completa di tutti i pacchetti rimossi o sostituiti: per le transazioni usate la cronologia DNF.

Obiettivo Comando
Elenco dei pacchetti installati dnf list --installed oppure rpm -qa
Verifica di un pacchetto preciso rpm -q nome-pacchetto
Informazioni sul pacchetto installato dnf info --installed nome-pacchetto
Pacchetto che contiene un percorso rpm -qf /percorso/del/file
Ricerca di un file nei repository dnf provides '*/nomefile'
Ordine delle installazioni recenti rpm -qa --last

I nomi e i percorsi generici della tabella sono segnaposto: sostituiteli con quelli da verificare. La tabella distingue le query sul sistema installato dalla ricerca nei repository.

Consultare motivi di installazione e cronologia DNF

Pacchetti considerati installati dall'utente

dnf history userinstalled

Nel riferimento DNF questa selezione comprende richieste esplicite, gruppi o profili di modulo e pacchetti installati fuori da DNF. Non è quindi l'elenco dei soli comandi di installazione digitati da una persona. Aiuta a distinguere questi pacchetti dalle dipendenze considerate automaticamente rimovibili.

Un sistema migrato o con registri incompleti richiede ulteriori verifiche. Non usate questa lista per decidere automaticamente cosa eliminare: controllate servizi, dipendenze e funzione del server. Se il sottocomando non è riconosciuto, verificate la versione con dnf --version e l'aiuto locale; non concludete che manchino pacchetti installati.

Esaminare le transazioni

dnf history
dnf history info transaction_ID

Il primo comando elenca le transazioni note; nel secondo sostituite transaction_ID con l'identificativo numerico scelto dall'elenco. Potete così leggere installazioni, aggiornamenti e rimozioni registrati. Operazioni eseguite direttamente con RPM possono non essere ricostruibili nella cronologia DNF. Consultare una transazione non la annulla: non eseguite undo o rollback come semplice controllo.

Verificare file e modifiche alla configurazione

rpm -V confronta attributi dei file con i metadati salvati nel database RPM. In questo esempio --noscripts esclude eventuali script di verifica del pacchetto:

sudo rpm -V --noscripts openssh-server

Se il controllo termina correttamente senza segnalazioni, non sono emerse differenze negli elementi verificati. Non equivale a una garanzia di sicurezza dell'intero sistema. Leggete anche errori e stato di uscita: permessi insufficienti o file non controllabili non vanno interpretati come un esito positivo.

Tra gli indicatori, S segnala una dimensione diversa, 5 un digest diverso, M una differenza di tipo o permessi e T una data di modifica diversa; ? indica un controllo non eseguibile. Il marcatore c identifica un file di configurazione. Una modifica intenzionale sotto /etc può quindi produrre differenze legittime: confrontatele con registri e backup prima di ripristinare qualcosa.

Salvare l'inventario in un file

Per confrontare due momenti o due server, conservate gli stessi campi e lo stesso ordinamento. Eseguite questo esempio in Bash, in una directory scrivibile. Il reindirizzamento > sovrascrive un file omonimo: scegliete prima un nome diverso se dovete conservare un inventario precedente.

(
  set -o pipefail
  rpm -qa --qf '%{NAME}\t%{EPOCHNUM}:%{VERSION}-%{RELEASE}\t%{ARCH}\n' | sort > installed-packages.tsv
)

Il file TSV, cioè testo con campi separati da tabulazioni, dovrebbe contenere tre colonne per ogni riga. Il sottoprocesso imposta pipefail affinché un errore della query non venga nascosto dal successivo sort. Controllate subito lo stato con echo $?, che deve essere zero, e leggete il file con less installed-packages.tsv. Un file presente o vuoto, da solo, non dimostra che l'esportazione sia riuscita.

L'inventario documenta lo stato del database al momento della query. Conservate a parte versione Rocky, repository e, dove applicabile, stream dei moduli. Questo elenco non è uno script per reinstallare il server: disponibilità delle versioni, dipendenze, configurazione e dati richiedono una procedura di ripristino provata separatamente.

Problemi frequenti

  • Comando o sottocomando assente: controllate versione e aiuto locale; alcune funzionalità possono richiedere un plugin, altre avere una sintassi diversa.
  • Nome inatteso: un eseguibile può essere fornito da un pacchetto con nome diverso; distinguete rpm -qf per il sistema installato da dnf provides per i repository.
  • Liste differenti: controllate opzioni, filtri DNF, architetture e versioni multiple. DNF usa anche metadati dei repository; RPM consulta il database locale. Un'origine non disponibile non implica che il pacchetto non sia installato.
  • Errore del database o blocco: verificate prima le altre operazioni di gestione pacchetti in corso e raccogliete l'errore completo. Non eliminate arbitrariamente lock o database.

Documentazione di riferimento