APT-pinning: mixare le release di debian

APT, Advanced Packaging Tool, è l’inossidabile e onnipotente sistema di gestione di pacchetti di debian e di altre distribuzioni debian-derivate.  I suoi punti di forza principali sono :

facilità di uso – grazie all’aiuto di potenti interfacce, tra le quali aptitude, che in modalità testuale oppure ncurses è riconosciuto essere il miglior strumento per la gestione di pacchetti in ambiente debian.

solidità – grazie all’abilità dei programmatori che l’hanno concepito, apt riesce a risolvere anche le dipendenze più complicate consegnandoci in mano un sistema pulito e affidabile.

sistema ben rodato – apt è stato introdotto fin dalla versione “Debian 2.1 (Slink)” rilasciata il 9 marzo 1999, in cui veniva annunciato come “the next-generation Debian package manager interface”. Non fu mai così facile la gestione dei pacchetti e delle dipendenze.

configurabilità – il sistema è “facilmente” configurabile alle proprie esigenze e ci permette di ottenere esattamente quello che vogliamo, come lo vogliamo. Il manuale è semplice e forse un po’ lungo…

Detto questo, tra le varie possibilità che APT ci propone, c’è quella di mantenere un sistema misto, ovvero un sistema che prescinde dalla classificazione canonica in stable, testing, unstable e che attinge pacchetti da ognuna di queste a seconda delle nostre esigenze. Il metodo viene amichevolmente chiamato “pinning” vedremo tra poco perché.

Prima di tutto ricordiamoci che mixare le release non è una cosa che può andare sempre liscia e prima di addentrarci in questa esperienza dobbiamo porci delle domande:

  1. Siamo abbastanza esperti da riuscire a recuperare il nostro sistema nel caso qualcosa non vada per il verso giusto?
  2. Siamo sicuri che non esistano altri modi per ottenere quelle versioni dei pacchetti che bramiamo così tanto?
  3. Siamo davvero sicuri che valga la pena correre questo rischio per avere delle versioni aggiornate dei pacchetti?
  4. Siamo coscienti di cosa comporti introdurre pacchetti dai rami testing e unstable nel nostro sistema presumibilmente stabile?

Se abbiamo risposto a tutte e quattro le domande allora siamo tipi da pinning!

I repository:

Ovviamente dobbiamo inserire tutti i repository dei rami da cui ci interessa prelevare pacchetti. Questo è un esempio di sources.lst:

### repository per stable
deb http://ftp.it.debian.org/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main contrib

### Backports per lenny
deb http://www.backports.org/debian lenny-backports main contrib non-free

### debian-multimedia (ex marillat) mirrorizzato dal garr
deb http://mi.mirror.garr.it/mirrors/debian-multimedia lenny mai
n

### Repository per testing
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib

### Repository per sid
deb http://ftp.it.debian.org/debian/ unstable main non-free contrib

Nel caso sopra quindi faremo pinning tra i repository ufficiali dei tre rami di debian, backports e repository debian-multimedia.

Il file /etc/apt/apt.conf

Questo file determina le preferenze del sistema apt. Questo è il mio:

APT::Cache-Limit 30000000;
Apt::Get::Purge;
APT::Clean-Installed;
APT::Get::Fix-Broken;
APT::Get::Fix-Missing;
APT::Get::Show-Upgraded "true";

Le opzioni sono varie. Ci interessa di settare APT::Cache-Limit ad un valore sufficientemente elevato da contenere tutto il database dei pacchetti. Necessario per evitare l’errore:

Error: Dynamic MMap ran out of room

Quindi possiamo decidere di inserire una default release da cui apt preleverà i pacchetti, aggiungendo ad esempio per la stabile:

APT::Default-Release "stable";

Alternativamente non inseriamo la direttiva sopra e tutto verrà deciso dai valori di pin che ci accingiamo ad inserire.

Il file /etc/apt/preferences

Questo file di configurazione è il fulcro della tecnica. Una breve lettura a

$ man apt_preferences

sarebbe auspicabile.  Segue un file adeguato al nostro esempio:

Package: *
Pin: origin mi.mirror.garr.it
Pin-Priority: 1001

Package: *
Pin: release a=lenny-backports
Pin-Priority: 1003

Package: *
Pin: release a=stable
Pin-Priority: 900

Package: *
Pin: release a=testing
Pin-Priority: 800

Package: *
Pin: release a=unstable
Pin-Priority: 500

Package: ia32-libs-gtk
Pin: release a=stable
Pin-Priority: 1002

Notare come si identificano le origini dei pacchetti (origin vs release) per applicare questo esempio ad un caso specifico.
Come si può osservare si può dare una certa priorità al singolo pacchetto (in esempio ia32-libs-gtk ) oppure a tutti i pacchetti provenienti da uno specifico repository ( indicato con *): la priorità viene specificata assegnando un valore alla pin-priority

Il manuale ci definisce il significato delle pin-priority:

P > 1000
causes a version to be installed even if this constitutes a
downgrade of the package

990 < P <=1000
causes a version to be installed even if it does not come from the
target release, unless the installed version is more recent

500 < P <=990
causes a version to be installed unless there is a version
available belonging to the target release or the installed version
is more recent


100 < P <=500
causes a version to be installed unless there is a version
available belonging to some other distribution or the installed
version is more recent

0 < P <=100
causes a version to be installed only if there is no installed
version of the package

P < 0
prevents the version from being installed

Violare le regole

Se volessimo installare una versione in particolare, di un determinato pacchetto?
Semplice! Basta specificare ad apt la versione che vogliamo…

esempio:

Vogliamo installare la dock bar avant-window-navigator. Guardiamo quale è la versione candidata:

impero-main:/home/samuele$ apt-cache policy avant-window-navigator
avant-window-navigator:
Installato: (nessuno)
Candidato: 0.2.6-7
Tabella versione:
0.3.2-1 0
500 http://ftp.it.debian.org unstable/main Packages
100 /var/lib/dpkg/status
0.2.6-7 0
900 http://ftp.it.debian.org stable/main Packages
800 http://ftp.it.debian.org testing/main Packages

Come la preleviamo la versione 0.3.2-1 dal repository unstable?

Ci sono due modi:

1) Risolvendo le dipendenze nello stesso ramo dal quale preleviamo il pacchetto con:

# aptitude -t unstable install avant-window-navigator

(la direttiva -t specifica la Default-Release )

2) Risolvendo le dipendenze tra i vari repository secondo quanto specificato con le pin-priority:

# aptitude install avant-window-navigator=0.3.2-1

Queste sono le opzioni, spetta ad ognuno sperimentare quale sia la migliore😉

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...