Una breve introduzione ad apt-pinning
Introduzione
Apt-pinning è una funzionalità di APT che consente di assegnare priorità ai pacchetti provenienti da diverse distribuzioni o repository. In questo modo puoi far girare un sistema basato principalmente su stable ma installare singoli pacchetti più recenti da testing o unstable (o da repository di terze parti) quando necessario.
Avvertenza: non garantisco che tutto funzioni nel tuo ambiente — testa sempre in un ambiente di staging o usa snapshot/backup.
1 Nota preliminare
Negli esempi uso un sistema Debian Lenny (stable all’epoca dell’articolo). L’esempio pratico prende come riferimento il pacchetto phpmyadmin, presente in tre versioni diverse nelle release stable, testing e unstable (al momento della stesura originale):
- lenny (stable): versione 4:2.11.8.1-5
- squeeze (testing): versione 4:3.1.2-2
- sid (unstable): versione 4:3.1.3-1
Puoi verificare le versioni disponibili su: http://packages.debian.org/search?keywords=phpmyadmin&searchon=names&suite=all§ion=all
2 Configurare /etc/apt/sources.list
Aggiungi i repository testing e unstable al tuo /etc/apt/sources.list. Nell’articolo originale il file è così:
vi /etc/apt/sources.list| deb http://volatile.debian.org/debian-volatile lenny/volatile main deb-src http://volatile.debian.org/debian-volatile lenny/volatile main ## Lenny / Stable deb http://ftp2.de.debian.org/debian/ lenny main deb-src http://ftp2.de.debian.org/debian/ lenny main deb http://security.debian.org/ lenny/updates main deb-src http://security.debian.org/ lenny/updates main ## Squeeze / Testing deb http://ftp2.de.debian.org/debian/ squeeze main deb-src http://ftp2.de.debian.org/debian/ squeeze main deb http://security.debian.org/ squeeze/updates main deb-src http://security.debian.org/ squeeze/updates main ## Sid / Unstable deb http://ftp2.de.debian.org/debian/ sid main deb-src http://ftp2.de.debian.org/debian/ sid main |
Mantieni i percorsi esatti dei repository che decidi di usare per il tuo sistema.
3 Aumentare il cache limit (se necessario)
Apri /etc/apt/apt.conf:
vi /etc/apt/apt.conf… e aggiungi la seguente riga:
| APT::Cache-Limit "100000000"; |
Senza questo parametro potresti ricevere un errore come:
E: Dynamic MMap ran out of roomDopo aver aggiornato la configurazione, esegui:
apt-get update4 Perché serve apt-pinning
Con la configurazione di repository multipli APT tende a scegliere la versione più nuova disponibile (spesso proveniente da testing o unstable). Questo può portare a installazioni non volute di pacchetti più recenti e, in casi estremi, a un sistema instabile. Con apt-pinning si impostano priorità che dicono ad APT da quale release preferire i pacchetti.
Puoi visualizzare le priorità correnti con:
apt-cache policyUn esempio di output (formattato nell’articolo originale):
server1:~# apt-cache policy
Package files:
100 /var/lib/dpkg/status
release a=now
500 http://volatile.debian.org lenny/volatile/main Packages
release o=volatile.debian.org,a=stable,l=debian-volatile,c=main
origin volatile.debian.org
500 http://ftp2.de.debian.org sid/main Packages
release o=Debian,a=unstable,l=Debian,c=main
origin ftp2.de.debian.org
500 http://security.debian.org squeeze/updates/main Packages
release v=None,o=Debian,a=testing,l=Debian-Security,c=main
origin security.debian.org
500 http://ftp2.de.debian.org squeeze/main Packages
release o=Debian,a=testing,l=Debian,c=main
origin ftp2.de.debian.org
500 http://security.debian.org lenny/updates/main Packages
release v=5.0,o=Debian,a=stable,l=Debian-Security,c=main
origin security.debian.org
500 http://ftp2.de.debian.org lenny/main Packages
release v=5.0,o=Debian,a=stable,l=Debian,c=main
origin ftp2.de.debian.org
Pinned packages:
server1:~#Nell’esempio tutte le release hanno priorità 500: APT sceglierebbe quindi la versione più recente (in questo caso quella da unstable).
Per controllare un singolo pacchetto:
apt-cache policy phpmyadminOutput d’esempio:
server1:~# apt-cache policy phpmyadmin
phpmyadmin:
Installed: (none)
Candidate: 4:3.1.3-1
Version table:
4:3.1.3-1 0
500 http://ftp2.de.debian.org sid/main Packages
4:3.1.2-2 0
500 http://ftp2.de.debian.org squeeze/main Packages
4:2.11.8.1-5 0
500 http://ftp2.de.debian.org lenny/main Packages
server1:~#La riga Candidate mostra la versione che sarebbe installata.
5 Come funzionano le priorità (apt_preferences)
La logica delle priorità è documentata in man 5 apt_preferences e, in sintesi, può essere riassunta così:
- P > 1000: forza l’installazione di una versione anche se costituisce un downgrade.
- 990 < P <= 1000: forza l’installazione di una versione anche se non proviene dalla release target, a meno che la versione installata non sia più recente.
- 500 < P <= 990: la versione viene installata a meno che non esista una versione appartenente alla release target o la versione installata sia più recente.
- 100 < P <= 500: la versione viene installata a meno che non esista una versione appartenente ad un’altra distribuzione o la versione installata sia più recente.
- 0 < P <= 100: la versione viene installata solo se non esiste una versione installata del pacchetto.
- P < 0: impedisce l’installazione della versione.
Per impostare priorità personalizzate si crea o modifica /etc/apt/preferences o file sotto /etc/apt/preferences.d/.
Esempio minimo di entry in /etc/apt/preferences (concetto):
Package: phpmyadmin
Pin: release a=stable
Pin-Priority: 600Questo indica ad APT di preferire la versione proveniente dalla release stable, assegnandole priorità 600.
Mini-metodologia (passi consigliati)
- Identifica i pacchetti che vuoi mantenere su stable o che vuoi aggiornare da testing/unstable.
- Aggiungi i repository necessari in /etc/apt/sources.list o in /etc/apt/sources.list.d/.
- Aumenta APT::Cache-Limit in /etc/apt/apt.conf se necessario.
- Esegui apt-get update.
- Controlla apt-cache policy e apt-cache policy
per capire candidate e version table. - Scrivi regole in /etc/apt/preferences.d/ per pin specifici (per pacchetto o per origine).
- Testa l’installazione in staging e verifica le dipendenze:
- apt-get install -s
per simulare.
- apt-get install -s
- Esegui l’installazione reale solo a risultato verificato.
Alternative e approcci complementari
- backport: rebuild del pacchetto per stable (backport) invece di usare testing/unstable.
- apt-mark hold: bloccare una versione già installata.
- costruire il pacchetto localmente (dpkg-buildpackage) e installare il .deb.
- usare container (Docker/LXC) per eseguire servizi con librerie più recenti senza toccare il sistema host.
Quando apt-pinning fallisce o crea problemi (controesempi)
- dipendenze complesse: pacchetti in testing possono richiedere librerie che non sono compatibili con stable; forzare l’installazione può rompere il sistema.
- repository di terze parti con policy non compatibili o pacchetti non firmati.
- errori dovuti a pin troppo permissivi (es. priority > 990 senza considerare downgrade non voluti).
Nota: in presenza di problemi, considera di usare snapshot, backup completo, o ripristino via sistema di immagini.
Importante: testa sempre le modifiche in un ambiente separato e crea backup dei dati e dell’immagine del sistema prima di applicare pin estesi.
Esempio pratico: pin per phpmyadmin
Supponiamo di voler mantenere il sistema su stable ma installare phpmyadmin dalla squeeze (testing) se necessario. Un file sotto /etc/apt/preferences.d/ potrebbe contenere:
Package: phpmyadmin
Pin: release a=squeeze
Pin-Priority: 600Poi esegui:
apt-get update
apt-cache policy phpmyadmin
apt-get install -s phpmyadmin # simulazione
apt-get install phpmyadmin # installazione realeControlli e test (casi di accettazione)
- apt-cache policy
mostra la release preferita come Candidate in simulazione. - apt-get install -s non causa la rimozione di pacchetti critici.
- I servizi dipendenti dal pacchetto partono e funzionano dopo l’installazione.
Heuristics / Modello mentale rapido
- Preferisci backport o rebuild locale per singoli pacchetti quando possibile.
- Usa pin solo per pacchetti singoli o origini ben identificate, non come politica globale.
- Se una dipendenza richiede molte altre librerie, opta per container o backport.
Decision tree (semplice)
flowchart TD
A[Ho bisogno di una versione più recente?] -->|No| B[Usa stable]
A -->|Sì| C{Dipendenze compatibili con stable?}
C -->|Sì| D[Usa apt-pinning o backport]
C -->|No| E[Valuta container/backport/build locale]Checklist per ruolo
- Sysadmin:
- backup immagini e database
- test in staging
- usare apt-get install -s per simulazione
- documentare i pin in repo di configurazione
- Utente desktop:
- preferire PPA o pacchetti singoli ricompilati
- evitare pin globali che coinvolgono librerie di sistema
Glossario (una riga ciascuno)
- apt: il gestore di pacchetti su Debian/Ubuntu.
- pinning: assegnare priorità ai pacchetti da repository diversi.
- release: una versione della distribuzione (stable/testing/unstable).
- Pin-Priority: valore numerico che determina quale versione APT preferisce.
Riepilogo
Apt-pinning è uno strumento potente per bilanciare stabilità e necessità di pacchetti più recenti. Usalo con cautela: preferisci pin mirati, testa sempre e considera alternative come backport o container per limitare il rischio di rompere il sistema.
Note finali
- Consulta man 5 apt_preferences per dettagli formali.
- Mantieni la documentazione delle modifiche ai repository e alle preferences.