pacman (Italiano)
pacman è il sistema di gestione dei pacchetti di Arch Linux e, in quanto tale, una delle funzioni più notevoli della distribuzione. Pacman combina un semplice formato di pacchetti binari e un sistema di compilazione ed imballaggio facile da usare. Lo scopo di pacman è di rendere facilmente possibile la gestione dei pacchetti sia ufficiali che creati dall'utente stesso.
Pacman si incarica di tenere aggiornato il sistema. Questo compito è realizzato mantenendo una propria lista di pacchetti, e sincronizzando quest'ultima con il server principale. Questo modello server/client permette di scaricare o installare pacchetti con un semplice comando, includendo tutte le dipendenze necessarie.
Pacman è scritto nel linguaggio di programmazione C e utilizza il formato di imballaggio bsdtar(1) tar.
pacman -Ql pacman pacman-contrib | grep -E 'bin/.+'
per vedere una lista completa.Utilizzo
Nella seguente sezione viene elencata una breve serie di operazioni che pacman può eseguire. Per leggere più esempi si consiglia di consultare pacman(8).
Installazione di pacchetti
Un pacchetto consiste di un archivio al cui interno si trovano:
- tutti i file (compilati) di un applicazione
- metadati riguardanti l'applicazione, ad esempio il suo nome, la sua versione, le dipendenze, ecc.
- file e istruzioni di installazione per pacman
- una lista (opzionale) di file aggiuntivi che possono rendere più facile la vita all'utente, per esempio script per lanciare o fermare l'applicazione
Il sistema di gestione dei pacchetti pacman può dunque installare, aggiornare e rimuovere tali pacchetti. L'utilizzo di pacchetti porta diversi vantaggi da non sottovalutare rispetto alla compilazione e installazione manuale di pacchetti:
- aggiornamenti: pacman aggiornerà qualsiasi pacchetto non appena emerge una nuova versione.
- verifica delle dipendenze: pacman si incarica delle dipendenze, così basta specificare il nome di un programma e pacman lo installa insieme ad ogni altro pacchetto necessario.
- rimozione pulita: pacman è al corrente di tutti i file parte di un pacchetto; in questo modo, nessun file rimane inavvertitamente sul proprio sistema quando si decide di rimuovere un pacchetto.
- I pacchetti spesso hanno dipendenze facoltative, ovvero pacchetti che portano funzioni aggiuntive ad un'applicazione, ma che non sono strettamente necessarie per utilizzare quest'ultima. Quando si installa un pacchetto, pacman elenca tutte le dipendenze facoltative, nonostante queste non appaiano in
pacman.log
. Si utilizzi il comando descritto in #Interazione con il database dei pacchetti per vedere le dipendenze facoltative di qualsiasi pacchetto. - Quando si installa un pacchetto che si richiede come dipendenza facoltativa di un altro pacchetto, si consiglia di usare l'opzione
--asdeps
. Vedi la sezione #Ragione di installazione per dettagli.
pacman -Sy nome_pacchetto
invece di pacman -Syu nome_pacchetto
, perché così facendo si può riscontrare problemi con le dipendenze. Vedi System maintenance#Partial upgrades are unsupported e BBS#89328 per altre informazioni a riguardo.Installare uno specifico pacchetto
Per installare un singolo pacchetto oppure una serie di pacchetti, incluse dipendenze, si dia il seguente comando:
# pacman -S nome_pacchetto_1 nome_pacchetto_2 ...
Per installare una serie di pacchetti con regex (vedi questa conversazione sul forum):
# pacman -S $(pacman -Ssq regex_pacchetti)
Talvolta ci sono diverse versioni di un pacchetto in diversi repositori (per esempio extra e testing). Per installare una versione nel repositore extra si può specificarlo prima del nome del pacchetto:
# pacman -S extra/package_name
Per installare più pacchetti con nomi simili o parti comuni si possono impiegare le parentesi graffe:
# pacman -S plasma-{desktop,mediacenter,nm}
Si possono utilizzare diversi livelli:
# pacman -S plasma-{workspace{,-wallpapers},pa}
Pacchetti virtuali
Un pacchetto virtuale consiste di un pacchetto speciale che non esiste da solo, ma è incluso in uno o più pacchetti. I pacchetti virtuali permettono ad altri pacchetti di non elencare un certo pacchetto come dipendenza nel caso in cui ci fossero diversi candidati. I pacchetti virtuali non possono essere installati per nome; essi vengono installati automaticamente quando si installa un pacchetto che li include.
pacman.conf
) e poi in ordine alfabetico quando ci sono diversi risultati nello stesso repositore.Installare gruppi di pacchetti
Alcuni pacchetti fanno parte di un gruppo di pacchetti in modo che possano essere installati tutti insieme. Per esempio, il comando
# pacman -S gnome
elencherà una serie di pacchetti da selezionare provenienti dal gruppo gnome. A volte un gruppo di pacchetti contiene un numero elevato di pacchetti, di cui si desidera installare o non installare soltanto un paio. Invece di elencare tutti i pacchetti eccetto quelli non desiderati, può essere più conveniente specificare quelli da escludere:
Enter a selection (default=all): 1-10 15
Così si selezionano i pacchetti da 1 a 10 e 15, oppure:
Enter a selection (default=all): ^5-8 ^2
così si scelgono tutti i pacchetti, con l'eccezione dei pacchetti dal 5 all'8 ed il pacchetto 2.
Per vedere quali pacchetti fanno parte del gruppo gnome, si dia:
$ pacman -Sg gnome
Si può anche visitare la pagina https://archlinux.org/groups/ per controllare quali gruppi di pacchetti esistono.
--needed
.Rimozione di pacchetti
Per rimuovere un singolo pacchetto senza toccare le sue dipendenze, si dia:
# pacman -R nome_pacchetto
Per rimuovere un pacchetto e tutte le sue dipendenze, purché non siano richieste da altri pacchetti installati:
# pacman -Rs nome_pacchetto
Il comando precedente può non funzionare quando si rimuove un gruppo che contiene pacchetti richiesti da altri pacchetti. In questo caso, si dia:
# pacman -Rsu nome_pacchetto
Per rimuovere un pacchetto e tutte le sue dipendenze, includendo anche tutti i pacchetti che dipendono dal pacchetto che si vuole rimuovere, si dia:
# pacman -Rsc nome_pacchetto
Per rimuovere un pacchetto richiesto da un altro pacchetto senza rimuovere quest'ultimo si dia:
# pacman -Rdd nome_pacchetto
Pacman salva file di configurazione importanti quando rimuove certe applicazioni e li rinomina, aggiungendo l'estensione .pacsave. Per evitare l'istituzione di questi file di backup si può impiegare l'opzione
# pacman -Rn nome_pacchetto
Aggiornamento dei pacchetti
- Ci si aspetta che gli utenti seguano le linee di guida elencate nella sezione System maintenance#Upgrading the system, che consigliano di aggiornare regolarmente il proprio sistema e di non dare il seguente comando alla cieca.
- Arch appoggia soltanto aggiornamenti completi di tutto il sistema. Vedi System maintenance#Partial upgrades are unsupported e #Installazione di pacchetti per più dettagli.
Pacman può aggiornare tutti i pacchetti sul sistema con un solo comando. Questo processo potrebbe richiedere del tempo a secondo di quanto tempo fa fu eseguito l'ultimo aggiornamento. Il seguente comando dunque sincronizza i database dei repositori e aggiorna i pacchetti di sistema, escludendo i pacchetti "locali", ovvero quelli installati manualmente, che non sono parte dei repositori impostati:
# pacman -Syu
Interazione con il database dei pacchetti
Pacman ottiene informazioni dal database locale dei pacchetti tramite l'opzione -Q
, dal database del server centrale con -S
e dal database dei file tramite -F
. Si consulti pacman -Q --help
, pacman -S --help
e pacman -F --help
per ottenere opzioni di ricerca aggiuntive.
Pacman può cercare pacchetti nel database sia per nome che per descrizione:
$ pacman -Ss string1 string2 ...
Talvolta, la funzionalità di ricerca ERE (Espressioni regolari estese), accessibile tramite -s
, può produrre una serie di risultati indesiderati, per cui va limitata alla ricerca per nome (senza descrizione):
$ pacman -Ss '^vim-'
Per cercare tra i pacchetti già installati:
$ pacman -Qs string1 string2 ...
Per cercare un file per nome tra tutti i pacchetti, installati o meno, si dia il comando:
$ pacman -F string1 string2 ...
Per fare mostrare delle informazioni dettagliate riguardo ad un pacchetto, si dia:
$ pacman -Si nome_pacchetto
Per fare la stessa cosa, ma limitandosi ai pacchetti installati:
$ pacman -Qi nome_pacchetto
Dando due volte l'opzione -i
si ottiene anche la lista di file di backup insieme al rispettivo stato di modificazione:
$ pacman -Qii nome_pacchetto
Per ottenere la lista di file installati da parte di un pacchetto:
$ pacman -Ql nome_pacchetto
Per ottenere la stessa lista, ma per un pacchetto non ancora installato:
$ pacman -Fl nome_pacchetto
Per verificare la presenza di file installati da un pacchetto:
$ pacman -Qk nome_pacchetto
Se si da l'opzione k
si ottiene una ricerca più rigorosa.
Per scoprire a che pacchetto appartiene un certo file, si dia:
$ pacman -Qo /path/to/file_name
La stessa ricerca può essere effettuata per tutti i pacchetti, inclusi quelli non installati, dando:
$ pacman -F /path/to/file_name
Per ottenere una lista di pacchetti orfani, ovvero pacchetti installati come dipendenze di un pacchetto non più presente sul proprio sistema, si dia:
$ pacman -Qdt
Per elencare tutti i pacchetti installati esplicitamente, cioè non come dipendenze, si dia:
$ pacman -Qet
Vedi pacman/Tips and tricks per altri esempi.
Pactree
Per vedere il grafico di dipendenza di un pacchetto, si dia:
$ pactree nome_pacchetto
Per vedere il grafico di pacchetti che dipendono da un certo pacchetto, si dia l'opzione di invertimento -r
a pactree, oppure il comando whoneeds proveniente da pkgtoolsAUR.
Struttura dei database
I database di pacman sono solitamente situati in /var/lib/pacman/sync
. Per ogni ripositore specificato in /etc/pacman.conf
vi è un database corrispondente in questa directory. I file database sono archivi tar compressi secondo il formato gzip, i quali contengono a loro volta una directory per ogni pacchetto. Per esempio, nel caso del pacchetto which:
$ tree which-2.21-5
which-2.21-5 |-- desc
Il file desc
contiene solo metadati tipo la descrizione, le dipendenze, le dimensioni del file e l'hash MD5.
Ripulire la cache dei pacchetti
Pacman salva i pacchetti scaricati nella directory /var/cache/pacman/pkg/
e non rimuove automaticamente versioni più vecchie o di pacchetti disinstallati. Questo comportamento ha dei vantaggi, ad esempio:
- Permette di disfare un aggiornamento senza bisogno di riscaricare la versione precedente del pacchetto.
- Un pacchetto disinstallato può essere reinstallato facilmente dalla directory cache, senza che sia necessario riscaricarlo.
Tuttavia, è necessario accertarsi di ripulire la cache regolarmente per evitare che aumenti troppo di dimensioni.
Lo script paccache(8), parte del pacchetto pacman-contrib, rimuove dalla cache tutte le versioni di ogni pacchetto qui situato, ad eccezione delle tre più recenti:
# paccache -r
È possibile abilitare e lanciare paccache.timer
per rimuovere ogni settimana pacchetti non utilizzati.
Si può anche specificare quante versioni (a partire da quella piu recente) si desidera tenere. Per tenere soltanto una, si può dare:
# paccache -rk1
L'opzione -u
/--uninstalled
limita paccache a ripulire soltanto i pacchetti non più installati. Per esempio, il seguente comando rimuove tutte le versioni di pacchetti disinstallati ancora presenti nella cache:
# paccache -ruk0
Si consulti paccache -h
per altre opzioni e funzionalità.
Pacman offre delle opzioni per ripulire la cache ed i file dei database appartenenti a repositori che furono rimossi dal file di configurazione /etc/pacman.conf
. Tuttavia, pacman non offre la possibilità di tenere un certo numero diversioni passate ed è quindi molto più aggressivo di paccache.
Per rimuovere dalla cache tutti i pacchetti non più presenti e per rimuovere i database non più in utilizzo, si dia:
# pacman -Sc
Per rimuovere tutti i file dalla cache, si dia l'opzione due volte. Questo è il metodo più aggressivo e svuoterà completamente la directory cache:
# pacman -Scc
pkgcachecleanAUR e pacleanerAUR sono due sistemi alternativi per ripulire la cache.
Altri comandi
Un pacchetto può essere soltanto scaricato senza essere installato dando il comando:
# pacman -Sw nome_pacchetto
Si può installare un pacchetto locale, ovvero non proveniente da un repositore remoto, dando il comando:
# pacman -U /path/to/package/package_name-version.pkg.tar.zst
Per tenere una copia del pacchetto locale nella cache di pacman discussa in precedenza, si utilizzi:
# pacman -U file:///path/to/package/package_name-version.pkg.tar.zst
È anche possibile installare un pacchetto remoto, ma non in un repositore, specificando un URL diretto:
# pacman -U http://www.example.com/repo/example.pkg.tar.zst
Giro di prova
Pacman elenca sempre tutti i pacchetti da installare o rimuovere e richiede il permesso dell'utente prima di procedere.
Per ottenere un elenco in un formato processabile e per non eseguire le operazioni del tipo -S
, -U
e -R
si dia l'opzione -p
oppure --print
.
--print-format
può essere impiegato per specificare il formato della lista in una serie di modi. Per esempio, --print-format %n
produce una lista di pacchetti senza mostrare le rispettive versioni.
Ragione di installazione
Il database di pacman organizza i pacchetti installati in due gruppi, a seconda del motivo per il quale sono stati installati.
-
explicitly-installed (it. installati esplicitamente): pacchetti che furono installati specificandone il nome ad un comando del tipo
-S
o-U
; - dependencies (it. dipendenze): pacchetti che furono installati implicitamente in quanto richiesti da altri pacchetti presenti sul proprio sistema.
Quando si installa espressamente un pacchetto è possibile dare disposizioni affinché esso risulti installato come dipendenza, dando il comando:
# pacman -S --asdeps nome_pacchetto
Questo comando è generalmente utilizzato perché pacchetti installati esplicitamente possono includere dipendenze opzionali che in genere portano funzionalità non essenziali, tali che spetta all'utente installarli se così desidera.
--asdeps
farà sì che quando si rimuovono pacchetti orfani (discussi in precedenza), pacman rimuova anche i pacchetti marchiati manualmente come dipendenze.Quando si reinstalla un pacchetto, la ragione di installazione rimane preservata a meno che non si disponga di altro.
L'elenco di pacchetti esplicitamente installati può essere mostrato dando pacman -Qe
, mentre l'elenco complementare di dipendenze può essere richiesto con pacman -Qd
.
Per modificare la ragione di installazione di un pacchetto già presente, si dia
# pacman -D --asdeps nome_pacchetto
per marchiarlo come dipendenza, oppure l'opzione opposta --asexplicit
per marchiarlo come pacchetto installato esplicitamente.
--asdeps
e --asexplicit
quando si aggiorna il sistema, ad esempio dando pacman -Syu nome_pacchetto --asdeps
, dato che questo modificherebbe non solo la ragione di installazione del pacchetto che si sta installando, ma di tutti gli altri pacchetti presenti sul sistema che vengono aggiornati contemporaneamente.Ricerca di pacchetti che contengono un certo file
Prima di tutto si sincronizzi il database dei file:
# pacman -Fy
Si può poi effettuare la ricerca di pacchetti che contengono un file, dando ad esempio:
$ pacman -F pacman
core/pacman 5.2.1-1 (base base-devel) [installed] usr/bin/pacman usr/share/bash-completion/completions/pacman extra/xscreensaver 5.43-1 usr/lib/xscreensaver/pacman
pacman-filesdb-refresh.timer
(reperibile nel pacchetto pacman-contrib) per aggiornare il database pacman dei file ogni settimana.Per funzionalità più avanzate si installi pkgfile, che utilizza un database separato con tutti i file ed i pacchetti con loro associati.
Cosa accade quando si installa/aggiorna/rimuove pacchetti
Quando si svolge correttamente, una cosiddetta transazione consiste del seguente processo di cinque passi:
- Si inizia la transazione nel caso non ci sia un database lock (vedi wikipedia).
- Si compone l'elenco di pacchetti da aggiungere o rimuovere durante la transazione.
- Si prepara la transazione nel modo dettato da eventuali opzioni, verificandone la correttezza con l'aiuto dei database di sincronizzazione, dei pacchetti e delle dipendenze.
- Si esegue la transazione:
- Se possibile, si scaricano i pacchetti (
_alpm_sync_load
); - Se dovessero esistere agganci pacman del tipo
PreTransaction
, questi verrebbero impiegati adesso; - I pacchetti da sostituire, rimuovere o in conflitto vengono rimossi;
- Se ci dovessero essere pacchetti da installare, ciò avverrebbe:
- Nel caso un pacchetto abbia uno script di installazione, si invocherebbe la funzione
pre_install
(opre_upgrade
opre_remove
nel caso di un aggiornamente o di una rimozione) potenzialmente definita all'interno di esso; - Pacman estrae i file ci cui consiste il pacchetto dall'archivio tar, e li deposita in un luogo adatto (nel caso di un'installazione o di un aggiornamento). I file che andrebbero a sostituire altri file già presenti vengono messi da parte, affinché la sostituzione possa essere eseguita manualmente se necessario. Per questo scopo vengono salvati con l'estensione .pacnew.
- Nel caso esista uno script post-installazione, la funzione
post_install
(opost_upgrade
opost_remove
nel caso di un aggiornamento o di una rimozione) verrebbe impiegata.
- Nel caso un pacchetto abbia uno script di installazione, si invocherebbe la funzione
- Se esistono agganci pacman del tipo
PostTransaction
, questi verrebbero eseguiti a questo punto.
- Se possibile, si scaricano i pacchetti (
- pacman rilascia il database lock e le risorse relative alla transazione.
Configurazione
È possibile personalizzare pacman modificando i contenuti del file /etc/pacman.conf
, affinché funzioni nel modo desiderato. Per informazioni più approfondite si consulti pacman.conf(5).
Impostazioni generali
Le impostazioni generali si trovano nella sezione intitolata [options]
. Informazioni a riguardo sono reperibili in pacman.conf(5) oppure nel file di default pacman.conf
.
Confronto delle versioni prima di un aggiornamento
Per fare mostrare sia la versione "vecchia" che quella "nuova" di un pacchetto, si abiliti la riga che menziona "VerbosePkgLists", rimuovendo il simbolo #
che si trova al suo inizio. Con questa impostazione il comando pacman -Syu
fornisce il seguente risultato:
Package (6) Old Version New Version Net Change Download Size extra/libmariadbclient 10.1.9-4 10.1.10-1 0.03 MiB 4.35 MiB extra/libpng 1.6.19-1 1.6.20-1 0.00 MiB 0.23 MiB extra/mariadb 10.1.9-4 10.1.10-1 0.26 MiB 13.80 MiB
Abilitare download paralleli
Da pacman 6.0 in poi vi è la possibilità di fare scaricare più pacchetti contemporaneamente. Sempre nella sezione [options]
del file /etc/pacman.conf
si trova la variabile ParallelDownloads
, impostabile su di un numero intero positivo. Usando per esempio 5
, si dispone affinché vengano scaricati fino a 5 pacchetti contemporaneamente. La rimozione di questa riga (ad esempio riaggiungendo il prefisso #
al suo inizio) farà sì che tutti i pacchetti vengano sempre installati in serie.
Saltare l'aggiornamento di un pacchetto
Per disporre affinché un pacchetto venga saltato quando si aggiorna il sistema, si aggiunga la seguente istruzione nella sezione [options]
:
IgnorePkg=nome_pacchetto
Per specificare più pacchetti si inserisca un elenco di nomi separati da spazi, o si separi i vari pacchetti in multiple istruzioni IgnorePkg
, una per riga. Si può anche impiegare glob pattern. Se si desidera saltare un aggiornamento soltanto una volta, si può impiegare l'opzione --ignore
nel comando di aggiornamento, stavolta con un elenco di pacchetti separati tramite la virgola.
Sarà comunque possibile aggiornare pacchetti "ignorati" dando pacman -S
, nel cui caso pacman ricorderà all'utente di stare per aggiornare un pacchetto incluso in un'istruzione del tipo IgnorePkg
.
Saltare l'aggiornamento di un gruppo di pacchetti
Come con pacchetti normali, è possibile saltare un intero gruppo di pacchetti:
IgnoreGroup=gnome
Saltare l'aggiornamento di un file
Tutti i file elencati in un'istruzione del tipo NoUpgrade
non verranno mai toccati durante l'aggiornamento o l'installazione di un pacchetto. Il file che dovrebbe invece sostituire il file in questione verrà invece salvato separatamente con l'estensione .pacnew.
NoUpgrade=path/to/file
Come prima, si può specificare più file elencandoli in questo modo:
NoUpgrade=path/to/file1 path/to/file2
/
non va aggiunto.Impedire l'installazione di certi file sul sistema
Per evitare sempre che vengano installati file in certe directory, si elenchi i loro sentieri in un'istruzione del tipo NoExtract
. Per esempio, per evitare l'installazione di moduli systemd, si utilizzi:
NoExtract=usr/lib/systemd/system/*
Istruzioni specificate dopo possono sostituire quelle che le precedono. Si può negare un'istruzione aggiungendo il prefisso !
.
CheckSpace
in pacman.conf
. Si avverte che così facendo si disabilita avvertimenti per tutti i pacchetti.Possesso di più file di configurazione
Nel caso si dovesse essere in possesso di più file di configurazione, ad esempio un file principale e un altro file con il repositore testing attivato), si può condividere le impostazioni comuni ad entrambi i file impiegando l'istruzione Include
:
Include = /path/to/common/settings
in cui /path/to/common/settings
specifica il sentiero del file all'interno del quale si trovano le istruzioni in comune.
Agganci
Pacman può eseguire agganci per pre e post-transazione, specificati nella directory /usr/share/libalpm/hooks/
. Si può aggiungere altre directory nelle quali si intende collocare tali agganci specificandone i sentieri nell'istruzione HookDir
in pacman.conf
, il cui valore predefinito è /etc/pacman.d/hooks
. I nomi di file che specificano un aggancio devono possedere il suffisso .hook. Inoltre, gli agganci pacman non sono interattivi.
Gli agganci di pacman possono per esempio essere utilizzati insieme a systemd-sysusers
e systemd-tmpfiles
per create automaticamente utenti e file di sistema durante l'installazione di pacchetti. Ad esempio, il pacchetto tomcat8 richiede un utente di sistema chiamato tomcat8
ed una serie di directory nel possesso di questo utente. Gli agganci systemd-sysusers.hook
e systemd-tmpfiles.hook
impiegano systemd-sysusers
e systemd-tmpfiles
ogni volta che pacman determina che tomcat8 contiene dei file che specificano utenti e file temporanei.
Per approfondire gli agganci alpm
si faccia riferimento a alpm-hooks(5).
Repositori e mirror
Con eccezione della sezione [options], ogni altra [sezione]
definita in pacman.conf
specifica un repositore di pacchetti da utilizzare.
Un repositore consiste di un insieme di pacchetti strutturato in una maniera che segue una certa logica, fisicamente situato su di uno o più server. Per questo motivo, ogni server si chiama mirror del repositore.
Ci sono repositori ufficiali e inufficial. L'ordine in cui i repositori sono elencati nel file di configurazione è importante; quando ci sono due pacchetti aventi lo stesso nome, i repositori che appaiono prima avranno la precedenza rispetto a quelli che li succedono. Dopo avere aggiunto un nuovo repositore, si deve aggiornare l'intero sistema.
Ogni sezione specifica di un repositore permette di definire la lista di mirror associati con esso. Questo si può fare sia direttamente, oppure in un file separato, specificato in un'istruzione del tipo Include
. Ad esempio, i mirror per i repositori ufficiali sono elencati nel file /etc/pacman.d/mirrorlist
. Si faccia riferimento all'articolo Mirrors per configurare questo aspetto.
Directory della cache dei pacchetti
Pacman salva i file dei pacchetti scaricati nella cache, all'interno di una directory specificata dall'istruzione CacheDir
all'interno della sezione [options] del file pacman.conf
. Il valore predefinito di quest'impostazione è /var/cache/pacman/pkg/
.
Con il passare del tempo, la directory di cache può aumentare di dimensioni anche se si fa attenzione a mantenere nella cache soltanto le versioni più recenti dei pacchetti installati.
Se si desidera spostare la directory in un luogo più conveniente, si può fare una delle seguenti cose:
- Si imposti
CacheDir
inpacman.conf
sul sentiero della nuova directory. - Si monti una nuova partizione dedicata a questo scopo oppure un sottovolume Btrfs in
/var/cache/pacman/pkg/
. - Si monti (bind mount) la directory selezionata in
/var/cache/pacman/pkg/
.
/var/cache/pacman/pkg/
da un'altra directory. Farlo causerà comportamenti indesiderati da parte di pacman, in particolare quando pacman aggiorna se stesso.Sicurezza dei pacchetti
Pacman appoggia la firma (ing. signature) dei pacchetti, che porta un livello di sicurezza in più. L'impostazione predefinita, SigLevel = Required DatabaseOptional
, abilita la verifica della firma di tutti i pacchetti a livello globale. Questa regola può essere sostituita per ogni repositore utilizzando l'istruzione SigLevel
. Per altri dettagli relativi alla firma e alla verifica della firma dei pacchetti si faccia riferimento a questo articolo.
Troubleshooting
Errore "Failed to commit transaction (conflicting files)"
Se appare il seguente errore: [1]
error: could not prepare transaction error: failed to commit transaction (conflicting files) package: /path/to/file exists in filesystem Errors occurred, no packages were upgraded.
Questo accade perché pacman ha rilevato un conflitto di file e si rifiuta di sostituire i file al posto dell'utente. Questo comportamento è inteso e non si tratta di una svista.
Il problema in genere è banale da risolvere, tuttavia, per essere sicuri, si dovrebbe cercare di capire come i file in questione siano arrivati lì. Un modo sicuro di procedere è di verificare prima se ci dovesse essere un altro pacchetto a cui appartiene il file in questione (pacman -Qo /path/to/file
). Se questo dovesse essere il caso, si prega di comunicarlo. Se il file non risulta essere di proprietà di un altro pacchetto, si rinomini il file presente e si dia di nuovo il comando di aggiornamento. Se tutto va bene, a questo punto il file può essere rimosso.
Se l'utente aveva installato un programma manualmente, ovvero senza utilizzare pacman, per esempio tramite make install
, si deve rimuovere/disinstallare questo programma, inclusi tutti i file associati ad esso. Si consulti anche Pacman tips#Identify files not owned by any package.
Ogni pacchetto installato viene con un file /var/lib/pacman/local/package-version/files
nel quale si trovano i metadati del pacchetto. Se questo file dovesse risultare corrotto, vuoto, oppure mancante, si manifesterebbe l'errore file exists in filesystem
quando si tenterebbe di aggiornare il pacchetto. Errori di questo tipo generalmente si limitano ad un pacchetto. Invece di rinominare manualmente i file appartenenti ad un pacchetto per rimuoverli più tardi, si può dare esplicitamente il comando pacman -S --overwrite glob pacchetto
per obbligare pacman a sostituire tutti i pacchetti che corrispondono al pattern glob
.
--overwrite
. Si consulti System maintenance#Avoid certain pacman commands.Errore "Failed to commit transaction (invalid or corrupted package)"
Si identifichi i file .part (pacchetti non completamente scaricati) in /var/cache/pacman/pkg/
e li si rimuova (questo problema è causato spesso da un comando XferCommand
personalizzato in pacman.conf
).
# find /var/cache/pacman/pkg/ -iname "*.part" -delete
Lo stesso errore può apparire nel caso archlinux-keyring risulti non-aggiornato. Questo impedirebbe la verifica delle firme da parte di pacman. Si consulti See Pacman/Package signing#Upgrade system regularly per la correzione e per istruzioni su come evitare il problema in futuro.
Errore "Failed to init transaction (unable to lock database)"
Quando pacman sta per modificare il database dei pacchetti, per esempio a causa dell'installazione di un pacchetto, crea un lock file in /var/lib/pacman/db.lck
. Questo impedisce agli utenti di usare pacman più volte contemporaneamente, modificando il database dei pacchetti allo stesso tempo.
Se pacman dovesse essere interrotto mentre sta modificando il database, il lock file potrebbe rimanere. Se si è certi che non ci sia nessun caso di pacman ancora in esecuzione, si può rimuovere il lock file:
# rm /var/lib/pacman/db.lck
fuser /var/lib/pacman/db.lck
come root per controllare se c'è ancora un processo che sta utilizzando il file.Un pacchetto che si cerca di installare non può essere reperito
Questo errore si manifesta come Not found in sync db
, Target not found
oppure Failed retrieving file
.
Prima di tutto, ci si accerti che il pacchetto esiste veramente. Se questo dovesse essere il caso, può darsi che il proprio elenco di pacchetti non sia stato aggiornato. Si dia il comando pacman -Syyu
per obbligare pacman a ricostruire l'elenco dei pacchetti e ad effettuare un aggiornamento. Si verifichi anche che i mirrors siano aggiornati e i repositori siano stati configurati correttamente.
Potrebbe anche essere che il repositore che contiene il pacchetto che si cerca non sia stato abilitato sul proprio sistema. Per esempio potrebbe darsi che si tratti del repositore multilib, ma questo non sia abilitato nel file pacman.conf
.
Si consulti anche il FAQ.
Pacman crasha durante un aggiornamento
Se pacman dovesse crashare con un errore del tipo "database write" mentre sta rimuovendo un pacchetto, si provi a rimuovere e reinstallare o aggiornare il pacchetto. Nel caso in cui questo dovesse non riuscire, si segua le seguenti istruzioni:
- Si eseguisca il boot con l'ambiente di installazione di Arch (ing. Arch installation medium), preferibilmente utilizzando un medium recente tale che la versione di pacman al suo interno sia almeno così recente come quella sul proprio sistema.
- Si monti il sistema file di root, per esempio dando
mount /dev/sdaX /mnt
, e si verifichi che il sistema montato abbia abbastanza spazio condf -h
. - Si monti i sistemi
proc
,sys
edev
conmount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
- Se i database e le directory utilizzate dapacman si trovano nel luogo predefinito, si può semplicemente aggiornare il database dando il comando
pacman --sysroot /mnt -Syu
in qualità di root.- In caso non si possa effettuare l'aggiornamento, ci si riferisca alla sezione Pacman/Tips and tricks#Reinstalling all packages.
- Dopo l'aggiornamento si può verificare se vi sono pacchetti che non furono aggiornati ed esistono ancora in uno stato guasto, dando il comando
find /mnt/usr/lib -size 0
; - Tali pacchetti possono essere reinstallati dando il comando
pacman --sysroot /mnt -S package
.
pacman: command not found
Se per caso /var/cache/pacman/pkg
dovesse essere un symlink, pacman tenterebbe di creare una directory al suo posto, rimuovendo il symlink in questione durante l'aggiornamento, facendo fallire l'aggiornamento. Per questo motivo, i contenuti del pacchetto pacman verrebbero a mancare.
Non va mai istituito un symlink a /var/cache/pacman/pkg
perché questo sentiero è controllato da pacman. Si utilizzi l'opzione CacheDir
oppure una delle altre soluzioni elencate nella sezione #Directory della cache dei pacchetti.
Se si ha riscontrato questo problema in precedenza e il sistema si è guastato, si possono estrarre i contenuti del pacchetto che andrebbero in /usr
per ripristinare pacman e poi reinstallarlo correttamente; si faccia riferimento a FS#73306 e alla conversazione a riguardo nel forum.
Reinstallare pacman a mano
Usare pacman-static
pacman-staticAUR è una versione di pacman staticamente compilata, in modo tale da poter essere lanciata perfino quando le librerie di sistema non funzionano. Questo aspetto può essere utile quando è stato eseguito un aggiornamento parziale che ha guastato il sistema, per cui la versione di pacman installata regolarmente non funziona più.
Il commento riservato ed il PKGBUILD offrono un modo per scaricare direttamente il file binario eseguibile, che può poi essere utilizzato per reinstallare pacman oppure per aggiornare l'intero sistema dopo un aggiornamento parziale che ha provocato guasti.
Utilizzare una versione esterna di pacman
Se perfino pacman-static
non dovesse funzionare, è possibile riprendersi utilizzando pacman esternamente. Uno dei metodi più facili per raggiungere questo scopo consiste nell'utilizzo di archiso, impiegando le opzioni --sysroot
o --root
per specificare il punto di ove montare il sistema. Si faccia riferimento a Chroot#Using chroot per istruzioni su come montare i sistemi di file richiesti da --sysroot
.
Estrazione manuale
Anche se pacman dovesse essere completamente guasto, lo si può aggiustare a mano scaricando il pacchetto più recente ed estraendolo nel posto giusto. I passi da seguire sarebbero i seguenti:
- Si identifichi le dipendenze di pacman da installare;
- Si scarichi ogni pacchetto da un mirror a scelta;
- Si estragga ogni pacchetto
- Si reinstalli ogni pacchetto dando il comando
pacman -S --overwrite
affinché il database dei pacchetti sia aggiornato; - Si esegua un aggiornamento generale del sistema intero.
Se si è in possesso di un sistema Arch che funziona correttamente, si può richiedere l'elenco intero di dipendenze tramite:
$ pacman -Q $(pactree -u pacman)
Tuttavia potrebbe essere necessario aggiornare soltanto alcuni di questi pacchetti, a seconda del problema in questione. Per estrarre un pacchetto scaricato si può dare il comando:
# tar -xvpwf package.tar.zst -C / --exclude .PKGINFO --exclude .INSTALL --exclude .MTREE --exclude .BUILDINFO
Si noti che l'utilizzo dell'opzione w
per impiegare la modalità interattiva. Lanciare il comando non-interattivamente è molto rischioso perché si potrebbe finire per sostituire un file importante. È anche importante estrarre i pacchetti nell'ordine corretto, iniziando con le dipendenze.
Questo post sul forum contiene un esempio di questo processo, in cui sono guaste soltanto un paio di dipendenze di pacman.
Errore "Unable to find root device" dopo un reboot
Probabilmente si è corrotto l'initramfs durante un aggiornamento del kernel, potenzialmente causato da un uso improprio dell'opzione --overwrite
di pacman. Ci sono due opzioni: per primo, si impieghi l'elemento denominato Fallback.
Tab
(per Syslinux) o e
(per GRUB o systemd-boot) quando ci si trova nel menu del boot loader. Si rinomini in initramfs-linux-fallback.img
e si prema Enter
o b
(a seconda del boot loader impiegato) per lanciare il sistema con i nuovi parametri.Una volta che il sistema parte, se si utilizza il kernel linux regolare, si dia il seguente comando da un terminale per ricompilare l'immagine initramfs:
# mkinitcpio -p linux
Se non dovesse funzionare, ci si procuri una versione Arch contemporanea (su di un CD/DVD oppure USB stick), si monti la directory root e la partizione di boot su /mnt
e /mnt/boot
, rispettivamente. Poi si istituisca un ambiente chroot utilizzando arch-chroot:
# arch-chroot /mnt # pacman -Syu mkinitcpio systemd linux
- Se non si dovesse avere accesso ad una versione contemporanea di Arch oppure se si dovesse essere soltanto in possesso di altre distribuzioni "live" di Linux, si utilizzi chroot nel modo standard. Ovviamente ci sarebbero più comandi rispetto alla semplice esecuzione dello script
arch-chroot
. - Se pacman dovesse fallire con l'errore
Could not resolve host
, si prega di verificare il collegamento internet. - Se non si dovesse essere in grado di accedere all'ambiente arch-chroot oppure chroot normale, si potrebbe usare
pacman --sysroot /mnt -Syu foo bar
per impiegare pacman nella partizione root.
Si reinstalli il kernel (pacchetto linux) per rigenerare l'immagine initramfs con mkinitcpio -p linux
. Non vi è bisogno di compiere questa azione separatamente.
Dopodiché si consiglia di dare il comando exit
, umount /mnt/{boot,}
e reboot
per lasciare alle spalle l'ambiente chroot e fare ripartire il sistema.
Errore "Warning: current locale is invalid; using default "C" locale"
Come dice l'errore, il proprio locale non è configurato correttamente. Si faccia riferimento a Locale.
Pacman non rispetta le impostazioni di proxy
Si verifichi che le variabili ambientali ($http_proxy
, $ftp_proxy
ecc.) siano impostate correttamente. Se si usa pacman con sudo, bisogna configurare sudo affinché esso inoltri le variabili a pacman. Ci si accerti anche che la configurazione di dirmngr contenga honor-http-proxy
in /etc/pacman.d/gnupg/dirmngr.conf
in modo tale da rispettare le impostazioni sui proxy quando si riscarica le chiavi criptografiche.
Come reinstallo tuti i pacchetti presenti, mantenendo la rispettiva ragione di installazione?
Per reinstallare tutti i pacchetti natii si dia il comando pacman -Qnq | pacman -S -
oppure pacman -S $(pacman -Qnq)
(l'opzione -S
mantiene la ragione di installazione).
Poi si dovrà reinstallare tutti i pacchetti stranieri in una maniera simile, sostituendo -Qnq
con -Qmq
.
Sembrerebbe che la precedente transazione pacman abbia rimosso o corrotto delle librerie condivise (ing. shared), richieste da pacman stesso.
Per sistemare questa situazione c'è bisogno di estrarre le librerie necessarie direttamente dal sistema di file (ing. file system). Prima di tutto si identifichi il pacchetto che mette a disposizione la libreria mancante e lo si trovi nella cache di pacman (/var/cache/pacman/pkg/
). Si estragga la libreria e la si collochi nel posto dove si deve trovare. A quel punto si dovrebbe essere in grado di lanciare pacman.
Ora si deve reinstallare il pacchetto guasto. Si noti che bisogna specificare --overwrite
dato che si ha appena estratto file di sistema di cui pacman non è al corrente. Così pacman potrà sostituire la libreria correttamente con quella proveniente dal pacchetto.
Questo è tutto. Adesso tocca solo aggiornare il resto del sistema.
Blocco del download dei pacchetti
Alcuni utenti hanno riferito problemi di rete che impediscono a pacman di sincronizzare o aggiornare pacchetti da repositori. [2] [3] Quando si installa Arch Linux nativamente, questi errori dovrebbero essere risolti sostituendo il downloader di file di pacman predefinito con un'alternativa (vedi Improve pacman performance per più dettagli). Quando si installa Arch Linux come sistema operativo ospite in VirtualBox questo problema può essere risolto utilizzando Host interface invece di NAT nelle impostazioni della macchina virtuale.
Errore "Failed retrieving file 'core.db' from mirror"
Se si manifesta questo errore, si verifichi che i mirrors siano corretti e, nel caso che lo fossero, si provi un name server diverso.
"error: 'local-package.pkg.tar': permission denied"
Se si desidera installare un pacchetto su di un ambiente sshfs con pacman -U
e si riceve questo errore, si sposti il pacchetto in una directory locale e si riprovi.
"error: could not determine cachedir mount point /var/cache/pacman/pkg"
Quando si da un comando, per esempio pacman -Syu
, all'interno di un ambiente chroot si può ottenere un errore del tipo:
error: could not determine cachedir mount point /var/cache/pacman/pkg error: failed to commit transaction (not enough free disk space)
Spesso questo è provocato dal fatto che la directory del chroot non sia il punto di montaggio (ing. mount point) quando si entra nell'ambiente chroot. Si faccia riferimento alla nota in Install Arch Linux from existing Linux#Downloading basic tools per una soluzione e si consulti arch-chroot(8) per ottenere una spiegazione ed un esempio su come usare bind mounting per rendere mount point la directory chroot.
"error: GPGME error: No data"
Se mentre si cerca di aggiornare pacchetti si dovesse manifestare questo errore, si provi rm -r /var/lib/pacman/sync/
prima di tentare un aggiornamento.
Se la rimozione dei file di sincronizzazione non dovesse bastare, si verifichi che i file di sincronizzazione siano del tipo gzip compressed data
dando il comando file /var/lib/pacman/sync/*
. Può darsi che un router oppure un proxy abbia corrotto un download.
Se i file di sincronizzazione appaiono essere del tipo corretto, potrebbe esserci un problema con il server mirror. Si verifichi i server mirror dando i comandi pacman-conf -r core
e pacman-conf -r extra
. Si incolli il primo link in un browser e si controlli che appaia un elenco di file. Nel caso ciò non dovesse essere il caso, ad esempio perché il server risponde con un errore, si commenti il server in questione aggiungendo il prefisso #
alle rispettive righe in /etc/pacman.d/mirrorlist
.