pacman (Italiano)/Pacnew and Pacsave (Italiano)
Quando pacman rimuove un pacchetto che ha un file di configurazione, normalmente crea una copia di backup di quel file e appende l'estensione .pacsave al nome del file. Allo stesso modo, quando pacman aggiorna un pacchetto che include un nuovo file di configurazione creato dal manutentore che differisce da quello attualmente installato, crea un file .pacnew con la nuova configurazione. pacman avvisa l'utente quando questi file vengono creati.
Perché questi file vengono creati
Un file .pacnew può essere creato durante l'aggiornamento di un pacchetto (pacman -Syu, pacman -Su o pacman -U) per evitare di sovrascrivere un file già esistente e precedentemente modificato dall'utente. Quando ciò accade, apparirà nell'output di pacman un messaggio simile al seguente:
attenzione: /etc/pam.d/usermod installato come /etc/pam.d/usermod.pacnew
Un file .pacsave può essere creato durante la rimozione di un pacchetto (pacman -R) o da un aggiornamento (il pacchetto deve essere prima rimosso). Quando il database di pacman sa che un determinato file di proprietà del pacchetto deve essere salvato, creerà un file .pacsave. Quando ciò accade, pacman emette un messaggio simile il seguente:
attenzione: /etc/pam.d/usermod installato come /etc/pam.d/usermod.pacsave
Questi file richiedono l'intervento manuale dell'utente ed è buona norma gestirli subito dopo ogni aggiornamento o rimozione di pacchetti. Se lasciati non gestiti, eventuali configurazioni errate possono causare il malfunzionamento del software o l'impossibilità totale di avviarlo.
File di backup del pacchetto
Il file PKGBUILD di un pacchetto specifica quali file devono essere preservati o salvati quando il pacchetto viene aggiornato o rimosso. Ad esempio, il PKGBUILD di pulseaudio contiene la seguente riga:
backup=(etc/pulse/{daemon.conf,default.pa,system.pa})
Dopo l'installazione, questo elenco può essere consultato dal database di pacman usando pacman -Qii nome_pacchetto.
Per impedire a qualsiasi pacchetto di sovrascrivere un determinato file, consultare Pacman (Italiano)#Saltare l'aggiornamento di un file.
Spiegazione delle tipologie
.pacnew
Per ciascuno dei #File di backup del pacchetto in fase di aggiornamento, pacman confronta tre md5sum generati dal contenuto dei file: uno per la versione iniziale installata dal pacchetto, uno per la versione attualmente nel filesystem e uno per la versione nel nuovo pacchetto. Se la versione del file attualmente nel filesystem è stata modificata rispetto alla versione iniziale installata dal pacchetto, pacman non può sapere come unire tali modifiche con la nuova versione del file. Pertanto, invece di sovrascrivere il file modificato durante l'aggiornamento, pacman salva la nuova versione con l'estensione .pacnew e lascia intatta la versione modificata.
Entrando più nel dettaglio, il confronto md5 a 3 vie produce uno dei seguenti risultati:
- originale = X, attuale = X, nuovo = X
- Tutte e tre le versioni del file hanno contenuti identici, quindi la sovrascrittura non è un problema. Sovrascrive la versione attuale con la nuova versione e non avvisa l'utente (sebbene il contenuto del file sia lo stesso, questa sovrascrittura aggiornerà le informazioni del filesystem riguardanti i tempi di installazione, modifica e accesso del file, oltre a garantire che vengano applicate eventuali modifiche ai permessi).
- originale = X, attuale = X, nuovo = Y
- Il contenuto della versione attuale è identico all'originale, ma la nuova versione è diversa. Poiché l'utente non ha modificato la versione attuale e la nuova versione potrebbe contenere miglioramenti o correzioni di bug, sovrascrive la versione attuale con la nuova versione e non avvisa l'utente. Questa è l'unica fusione automatica di nuove modifiche che pacman è in grado di eseguire.
- originale = X, attuale = Y, nuovo = X
- Il pacchetto originale e il nuovo pacchetto contengono entrambi esattamente la stessa versione del file, ma la versione attualmente nel filesystem è stata modificata. Lascia la versione attuale al suo posto e scarta la nuova versione senza avvisare l'utente.
- originale = X, attuale = Y, nuovo = Y
- La nuova versione è identica alla versione attuale. Sovrascrive la versione attuale con la nuova versione e non avvisa l'utente (sebbene il contenuto del file sia lo stesso, questa sovrascrittura aggiornerà le informazioni del filesystem riguardanti i tempi di installazione, modifica e accesso del file, oltre a garantire che vengano applicate eventuali modifiche ai permessi).
- originale = X, attuale = Y, nuovo = Z
- Tutte e tre le versioni sono diverse, quindi lascia la versione attuale al suo posto, installa la nuova versione con estensione .pacnew e avvisa l'utente della nuova versione. L'utente dovrà unire manualmente le modifiche necessarie dalla nuova versione alla versione attuale.
Raramente, quando un pacchetto aggiornato include un file di backup che la versione precedente non aveva, la situazione viene gestita correttamente come X/Y/Y o X/Y/Z, dove X è un valore inesistente.
.pacsave
Se l'utente ha modificato uno dei file specificati in backup, tale file verrà rinominato con l'estensione .pacsave e rimarrà nel filesystem dopo la rimozione del resto del pacchetto.
-n con pacman -R comporterà la rimozione completa di tutti i file appartenenti al pacchetto specificato, pertanto non verrà creato alcun file .pacsave.Localizzare i file .pac*
Pacman non gestisce i file .pacnew automaticamente: è necessario gestirli autonomamente. Alcuni strumenti sono presentati nella sezione successiva. Per farlo manualmente, occorre prima localizzarli. Quando si aggiorna o si rimuove un gran numero di pacchetti, i file .pac* aggiornati potrebbero sfuggire. Per scoprire se sono stati installati file .pac*, utilizzare uno dei seguenti metodi:
- Per cercare all'interno di
/etcdove sono memorizzate la maggior parte delle configurazioni globali:# find /etc -name '*.pacnew' -o -name '*.pacsave'
o per cercare nell'intero disco sostituendo/etccon/nel comando precedente (in tal caso si potrebbe voler saltare selettivamente alcune directory per velocizzare la ricerca).
- Se installato, può essere utilizzato anche locate. Per prima cosa indicizzare nuovamente il database:
# updatedb
Quindi eseguire:$ locate --existing --regex '.*\.(pacnew|pacsave)'
- Usare il log di pacman per trovarli:
$ grep '\.pacnew\|\.pacsave' /var/log/pacman.log
Si noti che il log non tiene traccia dei file attualmente nel filesystem né di quelli che sono già stati rimossi; il comando precedente elencherà tutti i file .pac* che siano mai esistiti sul sistema. Per ottenere solo i 10 file .pac* più recenti, passare il risultato atail.
Gestire i file .pac*
pacdiff
pacman-contrib fornisce il semplice strumento pacdiff(8) per la gestione dei file .pac*.
Farà una ricerca dei file .pacnew, .pacsave e .pacorig e chiederà quindi di intraprendere un'azione su di essi.
Per impostazione predefinita usa --pacmandb per la sua ricerca, sfruttando le informazioni dell'array backup dei pacchetti attualmente installati. Se questo non è sufficiente per il proprio caso d'uso, è possibile invece specificare --find o --locate per una ricerca più approfondita.
Usa vimdiff come standard, ma è possibile specificare uno strumento diverso con DIFFPROG=proprio_editor pacdiff. Vedere List of applications/Utilities#Comparison, diff, merge per altri comuni strumenti di confronto.
Utility di terze parti
Sono disponibili alcune utility di terze parti che forniscono vari livelli di automazione per queste attività:
- dotpac — Semplice script interattivo con interfaccia testuale basata su ncurses e guida utile. Nessuna funzione di merge o auto-merge.
- etc-update — Utility di Gentoo, compatibile con altre distribuzioni tra cui Arch. Fornisce una semplice CLI per visualizzare, unire e modificare interattivamente le modifiche. Le modifiche banali, come i commenti, possono essere unite automaticamente.
- p3wm — Merge a tre vie dei file .pacnew. Può unire automaticamente le modifiche banali. In caso di conflitti, avvierà vimdiff, meld o kdiff3 per risolverli.
- pacnews-git — Un semplice script volto a trovare tutti i file .pacnew, per poi modificarli con vimdiff.
- pacfiles-mode — Un pacchetto per Emacs per gestire e unire i file .pacnew.
- https://github.com/UndeadKernel/pacfiles-mode || disponibile in melpa
- pacdiff-pacman-hook-git — Hook di pacman per eseguire pacdiff automaticamente.
Ulteriori risorse
Discussione sul forum: Dealing with .pacnew files