Ubuntu: vedere i pacchetti installati con apt e dpkg-query

Su Ubuntu usate apt list --installed per leggere l'elenco dei pacchetti installati e dpkg-query per interrogare stato, versione e file in modo più preciso. Per un inventario automatico controllate anche lo stato effettivo del pacchetto: la presenza di un record nel database dpkg non significa sempre che il pacchetto sia installato.

Elencare i pacchetti Deb installati

APT (Advanced Package Tool) e dpkg gestiscono i pacchetti nel formato Deb. Per un elenco leggibile di nomi, versioni e architetture:

apt list --installed

Se l'output è lungo, potete sfogliarlo con less, uscendo con q, oppure limitare i nomi a un prefisso:

apt list --installed | less
apt list --installed 'nginx*'

Le virgolette conservano nginx* come pattern per APT. Il comando apt è pensato per l'uso interattivo: la sua presentazione può cambiare e non è il formato da analizzare rigidamente in uno script.

Per ottenere nome, versione e architettura separati da tabulazioni, questo esempio Bash filtra solo i record con stato corrente installed:

(
  set -o pipefail
  dpkg-query -W -f='${db:Status-Status}\t${binary:Package}\t${Version}\t${Architecture}\n' |
    awk -F '\t' '$1 == "installed" { print $2 "\t" $3 "\t" $4 }' |
    LC_ALL=C sort
)

dpkg-query -W può mostrare anche record non installati; il filtro sul primo campo li esclude dall'inventario. awk elimina poi la colonna usata per il controllo e LC_ALL=C sort rende l'ordinamento ripetibile. pipefail fa emergere un errore della query anche se l'ultimo comando della pipeline riesce.

Nel formato tra apici singoli scrivete un solo backslash in \t e \n: dpkg-query li interpreta rispettivamente come tabulazione e fine riga. Gli apici impediscono alla shell di espandere ${...}. Questo è un inventario dello stato registrato, non una verifica dell'integrità o della salute di ogni pacchetto.

Verificare un pacchetto specifico

Leggere il record e lo stato corrente

dpkg-query -s nginx

Sostituite nginx con il nome esatto. Una normale installazione selezionata per l'installazione mostra Status: install ok installed. Leggete l'intero stato: altri record possono indicare configurazione residua, operazioni incomplete o un errore.

Per stampare soltanto lo stato corrente:

dpkg-query -W -f='${db:Status-Status}\n' nginx

Il risultato atteso per lo stato installato è installed. Un record con soli file di configurazione può invece produrre config-files con query riuscita. Negli script controllate sia codice di uscita sia valore: lo zero indica che la query è riuscita, non che il pacchetto sia necessariamente installato. Se il nome non è trovato o la query fallisce, esaminate anche il messaggio di errore.

Cercare nomi simili e interpretare le sigle

dpkg-query -l 'nginx*'

dpkg-query -l accetta pattern; le virgolette evitano l'espansione da parte della shell. Le prime tre colonne rappresentano azione desiderata, stato corrente ed eventuale errore. Le seguenti coppie presuppongono che il terzo carattere non segnali un errore:

Sigla Significato
ii Installazione desiderata e stato corrente installato.
rc Rimozione desiderata e soli file di configurazione residui; non è un pacchetto ancora installato.
iU Installazione desiderata, pacchetto estratto ma configurazione non completata.
Maiuscole nello stato o nell'errore Possibile situazione incompleta o problematica: controllate il record dettagliato e i log delle operazioni sui pacchetti.

Un pacchetto bloccato con hold può avere azione desiderata h e stato installato, per esempio hi. Non filtrate quindi l'inventario cercando soltanto righe che iniziano con ii. Per gli script scegliete i campi espliciti del manuale ufficiale Ubuntu di dpkg-query.

Confrontare versione registrata e candidata

Leggere insieme versione e stato

dpkg-query -W -f='${binary:Package}\t${Version}\t${db:Status-Status}\n' curl

Le tre colonne sono nome, versione e stato corrente. Considerate la versione come installata soltanto se lo stato è installed; se resta un record di configurazione, il dato di versione non dimostra la presenza del programma.

binary:Package aggiunge, quando necessario, l'architettura al nome, come libc6:amd64. È utile con Multi-Arch, il supporto a pacchetti di più architetture sullo stesso sistema. Mantenete questa distinzione quando confrontate inventari.

Controllare la candidata selezionata da APT

apt-cache policy curl

Installed indica la versione installata e Candidate la candidata scelta secondo le versioni note ad APT e le loro priorità. La candidata non è necessariamente la versione numericamente più alta pubblicata: repository, pinning e configurazione influenzano la scelta.

apt-cache usa dati locali che possono essere vecchi. Prima di decidere un aggiornamento, aggiornate gli indici con sudo apt update e controllate che riesca per le sorgenti interessate. Questa operazione scarica metadati; non aggiorna da sola i pacchetti installati. Il manuale di apt-cache descrive cache e selezione delle priorità.

Trovare i file e il pacchetto che li registra

Elencare i percorsi di un pacchetto

dpkg-query -L nginx

La query mostra i percorsi registrati per nginx nel database dpkg. Non è una scansione dei file effettivamente presenti: non dimostra che ogni percorso esista ancora e non comprende necessariamente log, upload, cache o database creati dall'applicazione.

Cercare il pacchetto associato a un percorso

dpkg-query -S /usr/bin/curl

Qui “associato” significa appartenenza al pacchetto nel database, non proprietario Unix del file. Un file copiato a mano potrebbe non avere alcuna corrispondenza. Se il percorso è un collegamento simbolico, considerate anche la destinazione:

python_real=$(readlink -e -- /usr/bin/python3) &&
printf '%s\n' "$python_real" &&
dpkg-query -S "$python_real"

readlink -e richiede che tutti i componenti del percorso esistano. La query seguente parte solo se la risoluzione e la stampa del percorso riescono; le virgolette conservano il percorso come un argomento. Se non c'è una corrispondenza, controllate come è stato installato quel file, senza attribuirgli un pacchetto a intuito.

dpkg-query -S cerca nei record locali e può incontrare anche percorsi di configurazione residui: confermate lo stato del pacchetto trovato. Per cercare chi fornisce un file nei repository anche senza averlo installato, occorre un indice separato, come quello usato da apt-file. Il manuale di apt-file descrive questo tipo di ricerca.

Distinguere pacchetti manuali e automatici

apt-mark showmanual
apt-mark showauto

showmanual elenca i pacchetti contrassegnati come scelti esplicitamente; showauto quelli contrassegnati come dipendenze automatiche. Questi indicatori possono essere stati impostati anche dall'installazione iniziale, dall'immagine del sistema o da strumenti di gestione.

Un metapacchetto raccoglie dipendenze per una funzione più ampia, per esempio un ambiente desktop. La sua presenza nell'elenco manuale non prova che una persona lo abbia aggiunto dopo l'installazione. Il manuale di apt-mark spiega il significato degli indicatori.

Per esaminare le rimozioni proposte senza applicarle:

sudo apt autoremove --dry-run

--dry-run simula la transazione e non rimuove i pacchetti. Leggete comunque l'elenco e le dipendenze: uno script locale può usare un programma senza che APT rilevi quel legame. Non trasformate automaticamente il risultato in una rimozione reale. Le indicazioni Ubuntu sui pacchetti non necessari aiutano a valutarne l'impatto.

Salvare e confrontare un inventario

In una directory scrivibile, questo esempio Bash salva soltanto i record con stato installed in un file TSV, cioè con campi separati da tabulazioni:

(
  set -o pipefail
  set -o noclobber
  dpkg-query -W -f='${db:Status-Status}\t${binary:Package}\t${Version}\t${Architecture}\n' |
    awk -F '\t' '$1 == "installed" { print $2 "\t" $3 "\t" $4 }' |
    LC_ALL=C sort > installed-packages.tsv
)

noclobber impedisce di sovrascrivere un file omonimo esistente. Se il nome è già usato, sceglietene uno nuovo o conservate prima una copia; non eliminate un inventario precedente per far riuscire il comando. pipefail impedisce di considerare riuscita la pipeline soltanto perché sort è terminato senza errori.

Usate il file solo se l'intero comando termina con codice zero. In caso di errore può rimanere un file vuoto o parziale: esaminate l'errore e non trattatelo come un inventario valido. Le colonne del file riuscito sono nome, versione e architettura; non contiene un'intestazione.

Raccogliete due inventari con nomi distinti, per esempio quelli seguenti, conservando data, rilascio Ubuntu e contesto del sistema nelle note di confronto:

diff -u installed-packages-before.tsv installed-packages-after.tsv

diff -u restituisce zero per file identici, uno quando ci sono differenze e un valore maggiore di uno per un errore. Le righe con - appartengono al primo file e quelle con + al secondo; una versione cambiata può comparire come coppia rimozione/aggiunta.

Questo elenco non ripristina un sistema. Versioni identiche potrebbero non esistere in un altro rilascio; conservate separatamente definizioni dei repository, PPA (Personal Package Archives), impostazioni e dati applicativi. Anche i record incompleti esclusi dall'inventario possono essere importanti per la diagnosi e vanno controllati a parte.

Separare Deb, Snap e altri metodi di installazione

Le query precedenti riguardano Deb. Per i pacchetti Snap usate:

snap list

Un'applicazione può essere distribuita come Snap anche quando un pacchetto Deb ne facilita l'installazione: non equiparate i due elenchi. Se snap non è disponibile, controllate se quel sistema usa effettivamente Snap; non installatelo soltanto per completare una query. Per un inventario software più ampio considerate anche container, gestori dei linguaggi e installazioni manuali.

Scegliere il comando in base alla domanda

PACCHETTO, PERCORSO e formato sono segnaposto da sostituire. Il formato deve includere lo stato quando serve a distinguere installato e residuo:

Obiettivo Comando
Leggere i Deb installati apt list --installed
Scegliere campi strutturati dpkg-query -W -f='formato'
Controllare un record dpkg-query -s PACCHETTO
Leggere versione e candidata apt-cache policy PACCHETTO
Elencare percorsi registrati dpkg-query -L PACCHETTO
Trovare un pacchetto dal percorso dpkg-query -S PERCORSO
Leggere gli indicatori manuali apt-mark showmanual
Elencare gli Snap snap list

Interpretare i risultati prima di intervenire

  • Una ricerca con grep può includere nomi simili. Per un pacchetto preciso interrogate il nome corretto e leggete valore dello stato e codice di uscita.
  • Gli elenchi dpkg possono comprendere configurazioni residue o operazioni incomplete. Un record non è una conferma di installazione sana.
  • La presenza del pacchetto non dice se il servizio sia in esecuzione: usate il relativo strumento di gestione, come systemctl status, quando applicabile.
  • Prima di rimuovere componenti considerate dipendenze, metapacchetti e funzioni operative, conservando un piano di ripristino.

Consultare i riferimenti del sistema

La guida Ubuntu Server alla gestione dei pacchetti collega gli strumenti APT e dpkg. I manuali indicati descrivono i campi e le opzioni: confrontateli con le versioni installate sulla macchina da esaminare.