pacman (Italiano)

From ArchWiki

Translation Status: This article is a localized version of pacman. Last translation date: 2024-01-22. You can help to synchronize the translation, if there were changes in the English version.

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.

Suggerimento: Il pacchetto pacman contiene diversi strumenti, ad esempio makepkg e vercmp(8). Altri strumenti utili tipo pactree e checkupdates sono reperibili nel pacchetto pacman-contrib (precedentemente parte di pacman). Si dia 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).

Suggerimento: A coloro che hanno usato un'altra distribuzione Linux può essere utile l'articolo Pacman Rosetta.

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.
Note:
  • 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.
Attenzione: Quando si installa un pacchetto su Arch, si eviti di ricaricare la lista di pacchetti senza effettuare un aggiornamento di sistema. In pratica non va mai eseguito il comando 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.

Suggerimento: Quando ci sono diversi candidati, la lista di opzioni viene data in ordine repositore (nell'ordini in cui questi appaiono nel file 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.

Nota: Se un pacchetto in una lista è già installato, verrà installato nuovamente sostituendo la versione già presente, anche se quest'ultima è quella più recente. Si può evitare di reinstallare i pacchetti dando l'opzione --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
Attenzione: Quando si rimuove un gruppo, per esempio gnome, questa procedura ignora il motivo per cui pacchetti all'interno di questo gruppo sono stati istallati. Il motivo di installazione delle dipendenze è tuttavia rispettato.

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
Attenzione: Quest'operazione è ricorsiva e va usata con cautela perché potrebbe rimuovere molti pacchetti necessari.

Per rimuovere un pacchetto richiesto da un altro pacchetto senza rimuovere quest'ultimo si dia:

# pacman -Rdd nome_pacchetto
Attenzione: Quest'ultima operazione può provocare danni al sistema e andrebbe evitata. Vedi System maintenance#Avoid certain pacman commands.

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
Nota: Pacman non rimuoverà configurazioni create dall'applicazione stessa (ad esempio i cosiddetti "dotfiles" nella directory home.

Aggiornamento dei pacchetti

Attenzione:

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

Nota: pactree(8) non è più parte del pacchetto pacman. Può essere invece reperito in pacman-contrib.

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:

  1. Permette di disfare un aggiornamento senza bisogno di riscaricare la versione precedente del pacchetto.
  2. 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.

Suggerimento: Si possono istituire degli agganci da eseguire automaticamente ogni volta che pacman esegue un'operazione. Si installi pacman-cleanup-hookAUR e si consulti altri esempi a riguardo.

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
Attenzione: Andrebbe evitato di rimuovere tutte le versioni scorse dei pacchetti installati e disinstallati dalla cache a meno che non si debba liberare spazio a tutti i costi, dato che così facendo non è più possibile disfare un aggiornamento senza riscaricare i pacchetti.

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.

Suggerimento: L'installazione di dipendenze opzionali tramite --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.

Nota: Si sconsiglia di impiegare le opzioni --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
Suggerimento: Si può lanciare 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:

  1. Si inizia la transazione nel caso non ci sia un database lock (vedi wikipedia).
  2. Si compone l'elenco di pacchetti da aggiungere o rimuovere durante la transazione.
  3. 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.
  4. Si esegue la transazione:
    1. Se possibile, si scaricano i pacchetti (_alpm_sync_load);
    2. Se dovessero esistere agganci pacman del tipo PreTransaction, questi verrebbero impiegati adesso;
    3. I pacchetti da sostituire, rimuovere o in conflitto vengono rimossi;
    4. Se ci dovessero essere pacchetti da installare, ciò avverrebbe:
      1. Nel caso un pacchetto abbia uno script di installazione, si invocherebbe la funzione pre_install (o pre_upgrade o pre_remove nel caso di un aggiornamente o di una rimozione) potenzialmente definita all'interno di esso;
      2. 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.
      3. Nel caso esista uno script post-installazione, la funzione post_install (o post_upgrade o post_remove nel caso di un aggiornamento o di una rimozione) verrebbe impiegata.
    5. Se esistono agganci pacman del tipo PostTransaction, questi verrebbero eseguiti a questo punto.
  5. 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

Attenzione: Saltare aggiornamenti va fatto con cautela, dato che aggiornamenti parziali non sono appoggiati.

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

Attenzione: Saltare l'aggiornamento di gruppi di pacchetti va fatto con cautela dato che aggiornamenti parziali non sono appoggiati.

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
Nota: Il percorso (ing. path) del file si riferisce al percorso all'intero dell'archivio del pacchetto. Dunque, il prefisso / 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 !.

Suggerimento: Pacman emette un avvertimento quando aggiorna pacchetti che richiedono un locale rimosso tramite localpurge o bleachbit. È possibile sopprimere tali messaggi di avvertimento disabilitando l'impostazione 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 in pacman.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/.
Attenzione: Non istituire un symlink a /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.

Attenzione: In genere si dovrebbe evitare di usare l'opzione --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
Suggerimento: Si può dare il comando 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:

  1. 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.
  2. Si monti il sistema file di root, per esempio dando mount /dev/sdaX /mnt, e si verifichi che il sistema montato abbia abbastanza spazio con df -h.
  3. Si monti i sistemi proc, sys e dev con mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
  4. 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.
  5. 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;
  6. 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

Attenzione: Quando si impiega questo metodo è estremamente facile provocare danni o peggio. Si utilizzi questo metodo soltanto come ultima alternativa se il metodo descritto in #Pacman crasha durante un aggiornamento non dovesse essere disponibile.

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:

  1. Si identifichi le dipendenze di pacman da installare;
  2. Si scarichi ogni pacchetto da un mirror a scelta;
  3. Si estragga ogni pacchetto
  4. Si reinstalli ogni pacchetto dando il comando pacman -S --overwrite affinché il database dei pacchetti sia aggiornato;
  5. 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.

Suggerimento: In caso l'elemento Fallback sia stato rimosso, si può sempre premere il tasto 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
Nota:
  • 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.

Errore "Cannot open shared object file"

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.