Repository & pinning: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
m
 
(108 versioni intermedie di 4 utenti non mostrate)
Riga 3: Riga 3:
|successivo=Repository ufficiali
|successivo=Repository ufficiali
}}
}}
{{Template:Articoli ezine|titolo=Repository e Pinning|intro=Una rapida panoramica su uno dei temi più importanti in Debian: il funzionamento e la configurazione dei repository, ed il pinning ovvero la possibilità di attingere dai repository dei diversi rami, cercando di mantenere il sistema più stabile possibile.<br/>
{{Versioni compatibili}}
|abstract=Dopo aver installato una Debian nasce il bisogno di aggiungere nuovi programmi e allo stesso tempo tenerla costantemente aggiornata. Per questo scopo Debian dispone di un tool potentissimo: apt (Advanced Packaging Tool), con numerosi strumenti sia da riga di comando (la shell), come dpkg, apt-get, aptitude, dselect, wajig, sia per mezzo di interfacce grafiche come synaptic, aptitude, adept, gjig ed altri. Per comprendere appieno tutto il meccanismo delle installazioni e degli aggiornamenti bisogna conoscere com'è strutturata una Debian. Questo articolo vuole essere un'introduzione alla comprensione della struttura per la gestione dei 20.000 ed oltre pacchetti che Debian offre. Per approfondimenti consultare le ricche pagine di documentazione che accompagnano Debian come debian-reference-it, debian-faq-it, etc.<br/>
__TOC__
|1=[http://e-zine.debianizzati.org/web-zine/numero_2/?page=12 Repository e Pinning]}}
{{E-zine
|num=2
|articoli=[http://e-zine.debianizzati.org/web-zine/numero_2/?page=12 Repository & Pinning]
}}
= Introduzione =
Esistono diverse [[release]] di Debian, e si rimanda per maggiori dettagli a [[La struttura della Distribuzione]]. E in una configurazione normale, e consigliata, di Debian non è necessario configurare il [[pinning]] per nessuna.
 
Il pinning entra in gioco qualora si desiderino delle regole personalizzate per determinati pacchetti o [[repository]], o se si vogliono utilizzare i repository di più release di Debian contemporaneamente. Inizialmente era necessario anche per utilizzare altri repository, quali i [[backports]] o gli [[experimental]], ma attualmente la necessità di configurarlo è venuta meno in molte situazioni, e pertanto si raccomanda agli utenti non esperti nell'uso di [[APT]] di non ricorrervi a meno che sia strettamente necessario.


[[Categoria:Apt]] [[Categoria:Repository ufficiali]]
{{Cautionbox|Installare pacchetti provenienti da release differenti è sempre e comunque fonte di rischi, ed è sconsigliato. Questa guida presuppone la comprensione dei concetti esposti nella guida [[I repository ed il loro utilizzo]], nonché la conoscenza di [[apt]] o [[apt-get]].}}
{{Box|Importante|Il pinning è uno strumento per regolare la priorità in base al numero di versione dei pacchetti, e non alla provenienza. Non è possibile discriminare tra pacchetti aventi la stessa versione e provenienti da più repository, ovvero ad essere installato sarà quello proveniente dal repository elencato per primo nel file <code>/etc/apt/sources.list</code>.}}


= Introduzione =
= Priorità come punteggio =
La priorità viene gestita attraverso l'assegnazione di un punteggio ai vari pacchetti, sia installati che ancora da installare. Valgono le seguenti regole:
* priorità '''1''', caso particolare e poco comune. È quella di default per experimental ('''NotAutomatic: yes''' nel file ''Release'' del repository). Si veda il manuale per maggiori informazioni.
* priorità '''100''' alla versione dei pacchetti già installati e quella dei backports ufficiali ('''NotAutomatic: yes''' e '''ButAutomaticUpgrades: yes''' nel file ''Release'' del repository).
* priorità '''500''' alle versioni che non appartengono alla release obiettivo, dove con quest'ultimo termine si deve intendere "Default Release", "Target Release". Di default non è impostata una "Default Release", e quindi ogni repository a parte backports ed experimental  ha una priorità di 500.
* priorità '''990''' alle versioni che appartengono alla release obiettivo, posto che sia definita.


Come molti sapranno, esistono tre distribuzioni di Debian (chiamate anche release):
Piccolo esempio teorico. Si supponga quanto segue:
# Debian stable, attualmente ''Wheezy'';
* si desidera installare il pacchetto "vattelapesca" appartenente alla propria [[release]] (si supponga [[testing]]);
# Debian testing, attualmente ''Jessie'';
* il suddetto pacchetto è presente in tre fonti: repoA, repoB, repoC; tutte correttamente specificante nel file <code>sources.list</code>;
# Debian unstable, attualmente (e sempre,  un nome fisso) ''Sid''.
* tutti i pacchetti presenti in repoA appartengono alla release installata, in repoB e repoC sono contenuti pacchetti appartenenti ad un'altra release (ad esempio [[unstable]]/[[Sid]] e [[stable]] rispettivamente);
Il software della stable non viene aggiornato, eccezion fatta per gli aggiornamenti della sicurezza; il software della testing e della unstable viene al contrario aggiornato frequentemente, con una maggiore frequenza per la unstable. Oltre queste tre, ci sarebbero anche la ''oldstable'' (la vecchia stable, precedente all’attuale stable) e la ''experimental'' che non è una versione completa e funzionante di Debian, ma solo un repository contenente vario software in fase di progettazione, da sperimentare o altamente instabile, dal quale si può attingere dalle altre versioni ma a proprio rischio.
* la versione di "vattelapesca" in repoA è la 1.4, in repoB la 2.0 e in in repoC la 1.1;
* nel sistema è installata la versione 1.3 di "vattelapesca";
* non esiste un file <code>preferences</code> o comunque non è stata specificata una priorità per nessuna delle tre release considerate;
* non è stato dichiarato il parametro ''Default Release'' in un eventuale file <code>apt.conf</code>, ovvero non è stata definita una release obiettivo.


Spesso accade che utilizzando la testing o ancor di più la stable si voglia del software più nuovo rispetto a quello in dotazione; o che al contrario, utilizzando la testing o ancor di più la unstable si voglia del software più stabile rispetto a quello in dotazione. Qui entra in gioco il pinning dei repository, o meglio “tra i repository”, che permette di installare con semplicità del software appartenente a una distribuzione di Debian diversa da quella in uso o anche solo appartenente alla stessa distribuzione, ma proveniente da un altro repository.Tutto ciò riducendo al minimo (posto di sapere quel che si fa) il rischio di creare problemi nel sistema e nel gestore dei pacchetti.
Nel momento in cui l'utente esegue il comando <code>apt install vattelapesca</code> sarà assegnata una priorità di 500 ai "vattelapesca" di repoA, repoB e repoC.<br/>
{{Warningbox|Installare pacchetti provenienti da distribuzioni e/o fonti differenti è sempre e comunque fonte di possibili rischi, anche se piccoli}}
Il pacchetto da repoC viene immediatamente scartato perché implicherebbe la retrocessione ([[downgrade]]) dello stesso. A questo punto APT sceglierà tra repoA e repoB in base alla versione, e quindi a essere installato sarà quello da repoB e non da repoA come desiderato.
Il problema evidentemente non può che esplodere quando si tenta di aggiornare tutti i pacchetti di sistema.


Prima di procedere nella descrizione operativa del pinning è '''fondamentale''' capire come gestisce la priorità dei pacchetti APT e sapere che:
= Pin-priority =
* Col termine distribuzione si intendono stable, testing e unstable. Ciascuna distribuzione ha un suo singolo repository (fonte) principale (due se si conteggia anche l'eventuale repository dedicato agli aggiornamenti di sicurezza) che è quello automaticamente dichiarato dall'installer di debian, ma si tenga presente che ogni distribuzione può avere più fonti sia ufficiali che non ufficiali.
Nel precedente esempio si sarebbe ottenuto l'aggiornamento di '''tutti''' i pacchetti alla loro versione in unstable (se si stava utilizzando una testing), ossia un risultato ben lontano dal voler aggiornare '''un solo pacchetto''' con la versione presente in unstable.<br/>
* Col termine fonti si intendono genericamente i repository, ufficiali (es. stable, testing, unstable e backports) o meno (es. deb-multimedia), che forniscono pacchetti relativi ad una o più distribuzioni. Ogni fonte può avere più copie di se stesso (mirrors).
La soluzione è quella di assegnare manualmente un punteggio ai vari pacchetti, singolarmente o raggruppandoli. Prima però è necessario capire il significato dei vari punteggi (''Pin-Priority'').<br/>
{{Box|Importante|Il pinning è uno strumento per regolare la priorità in base al numero di versione dei pacchetti, e non alla fonte di provenienza. Questo significa che non è possibile discriminare tra due pacchetti aventi lo stesso numero di versione e provenienti da due repository differenti, ovvero in caso di pari versione ad essere installato sarà la versione proveniente dal repository elencato per primo nel file <code>sources.list</code>.}}
Nel seguito si indicherà col termine "candidato" il pacchetto o gruppo di pacchetti proveniente dalla generica fonte dichiarata nel file <code>sources.list</code>.


= Priorità come punteggio =
* Pin '''minore di 0''' (negativo), l'installazione automatica del candidato è impedita a priori.
* Pin compreso tra '''1 e 99''', il candidato sarà installato solo se sono verificate entrambe queste condizioni: non esistono candidati appartenenti ad altre release, e nel sistema non è già installata una versione (anche inferiore) del candidato.
* Pin compreso tra '''100 e 499''', il candidato sarà installato solo se non esistono candidati appartenenti ad altre release e se la versione eventualmente già installata non è superiore.
* Pin compreso tra '''500 e 989''', il candidato sarà installato solo se non esistono candidati appartenenti alla release obiettivo e se la versione eventualmente già installata non è superiore a quella del candidato. Si noti che il semplice fatto di aver installato una certa release, per esempio testing, non significa aver definito la release obiettivo, che può essere solo definita manualmente dall'utente (il come sarà spiegato nella discussione del file <code>apt.conf</code>).
* Pin compreso tra '''990 e 999''', il candidato sarà installato solo se non esistono altri candidati con pin maggiore e se la versione eventualmente già installata non è superiore.
* Pin '''1000''' o superiore, il candidato sarà installato se non esistono altri candidati con pin maggiore, anche se ciò comportasse la retrocessione di versione ([[downgrade]]) del candidato.


Il concetto di priorità viene gestito attraverso l'assegnazione di un punteggio ai vari pacchetti, sia installati che ancora da installare. Valgono le seguenti regole:
{{Box|IMPORTANTE|Si noti che gli intervalli sopra specificati sono la diretta conseguenza della procedura di assegnamento automatico di APT.}}
Posto per esempio di assegnare priorità 44 al pacchetto "vattelapesca" di stable e contestualmente di non dichiarare alcuna priorità per i "vattelapesca" di testing e unstable (assunto che i tre repository siano in <code>sources.list</code>), un candidato vattelapesca di stable potrà essere installato solo se:
# Non esistono altri candidati dello stesso pacchetto provenienti dalle altre fonti, infatti APT assegnerebbe a loro automaticamente una priorità di 500 (500 > 44).
# Nessun candidato di "vattelapesca" è mai stato installato, infatti alla versione installata di "vattelapesca" sarebbe assegnata una priorità di 100 (100 > 44), a prescindere dalla sua versione, ovvero anche quando questa fosse inferiore a quella del nuovo candidato di stable disponibile.


* priorità '''100''' alla versione dei pacchetti già installati.
== Priorità in caso di aggiornamento ==
* priorità '''500''' alle versioni che non sono installate e non appartengono alla distribuzione obiettivo, dove con quest'ultimo termine si deve intendere "Default Release", "Target Release". Si noti per alcuni repository (come backports) in realtà la priorità predefinita di tali pacchetti risulta essere 100 e non 500 (vedasi manuale per maggiori informazioni).
Se una versione di un pacchetto è già stata installata sul sistema, la lettura dei punteggi può generare confusione. In particolare si noti che:
* priorità '''990''' alle versioni che non sono installate e appartengono alla distribuzione obiettivo.
* il [[downgrade]] è possibile solo con una priorità almeno pari a 1000, quindi sono ignorati tutti i repository con priorità minore di 1000 contenenti una versione inferiore a quella già installata;
* i pacchetti installati hanno priorità 100, e quindi un pacchetto può essere aggiornato automaticamente se esiste un repository con una priorità di almeno 100 che contenga una versione più recente di quella installata.


Piccolo esempio teorico. Si supponga quanto segue:
Per esempio la [[stable]] di default ha priorità 500 (ma quanto scritto varrebbe anche con una priorità fino a 990), mentre i [[backports]] ne hanno una di 100. Ciò significa che non si può installare (automaticamente) una versione di un pacchetto dai backports che si trovi in entrambi i repository.<br/>
* si desidera installare il pacchetto "vattelapesca" appartenente alla propria distribuzione obiettivo, cioè quella che si è installata (si supponga testing);
Ma se si è già installato un pacchetto dai backports, impostando manualmente la target release, quel pacchetto verrà aggiornato automaticamente quando saranno disponibili nuovi aggiornamenti, perché:
* il suddetto pacchetto è presente in tre fonti, repoA, repoB, repoC tutte correttamente specificante nel file <code>source.list</code>;
* la priorità della stable non è sufficiente al [[downgrade]], dato che servirebbe una priorità di almeno 1000, e pertanto il repository è ignorato;
* tutti i pacchetti presenti in repoA appartengono alla distribuzione obiettivo (testing in questo esempio), in repoB e repoC sono contenuti pacchetti appartenenti ad un'altra distribuzione (ad esempio unstable e stable rispettivamente);
* la versione dei backports è più recente di quella installata e la loro priorità è (almeno) pari a 100.
* la versione di "vattelapesca" in repoA è la 1.4, in repoB la 2.0 e in in repoC la 1.1;
* nel sistema è installata la versione 1.3 di "vattelapesca";
* non esiste un file <code>preferences</code> o comunque non è stata specificata una priorità per nessuna delle tre distribuzioni considerate;
* non è stato dichiarato il parametro ''Default Release'' in un eventuale file <code>apt.conf</code>, ovvero non è stata esplicitamente definita una distribuzione obiettivo.


Nel momento in cui l'utente esegue il comando <code>apt-get install vattelapesca</code> saranno assegnati i seguenti punteggi:
Si noti che con una priorità superiore a 990 per la stable sarebbe impossibile installare i backports, anche manualmente. Tale priorità potrebbe essere assegnata dopo la loro installazione, ma sempre senza superare 1000 per evitare il [[downgrade]].
* 500 a "vattelapesca" presente in repoC;
* 500 a "vattelapesca" presente in repoB;
* 500 a "vattelapesca" presente in repoA;
Tutti e tre i pacchetti hanno lo stesso punteggio, ma il pacchetto proveniente da C viene immediatamente scartato perché implicherebbe retrocessione dello stesso (downgrade, il significato delle varie fascie di punteggio sarà spiegato poco più avanti). A questo punto APT sceglierà tra repoA e repoB in base ad un altro criterio, la versione, quindi ad essere installato sarà il pacchetto proveniente da repoB e non da repoA come desiderato.
Il problema evidentemente non può che esplodere quando si esegue il comando <code>apt-get upgrade</code> (o peggio <code>apt-get dist-upgrade</code>), cioè quando si tenta di aggiornare tutti i pacchetti di sistema.


La soluzione è, come facilmente intuibile, quella di assegnare manualmente un punteggio ai vari pacchetti, singolarmente o raggruppandoli. Prima però è necessario capire il significato dei vari punteggi (pin). Nel seguito si indicherà col termine "candidato" il pacchetto o gruppo di pacchetti proveniente dalla generica fonte dichiarata nel file <code>sources.list</code>.
== Priorità a singoli pacchetti ==
Se anziché attribuire un valore di ''Pin-Priority'' a tutti i pacchetti di un dato repository, lo si assegna soltanto a un insieme specifico di pacchetti, le loro dipendenze '''non''' ne saranno soggette.


* Pin '''minore di 0''' (negativo), l’installazione del candidato è impedita a priori (salvo apposito comando).
Ciò significa che una particolare versione di un pacchetto può essere installata o aggiornata, senza specificare manualmente la release obiettivo, unicamente se la priorità di quel dato pacchetto e di tutte le sue dipendenze lo consentono. In un certo senso quindi la priorità di un dato pacchetto si può considerare pari al valore minimo fra la ''Pin-Priority'' del pacchetto stesso e l'insieme delle ''Pin-Priority'' di tutte le dipendenze ancora da soddisfare.
* Pin compreso tra '''1 e 99''', il candidato sarà installato solo se sono verificate entrambe le seguenti due condizioni: primo non esistono candidati appartenenti ad altre distribuzioni, secondo nel sistema non è già installata una versione (anche inferiore) del candidato.
* Pin compreso tra '''100 e 499''', il candidato sarà installato solo se non esistono candidati appartenenti ad altre distribuzioni e se la versione eventualmente già installata non è superiore a quella del candidato. Se per esempio il pacchetto "vattelapesca" ha pin 400 ed è presente su due fonti (posto ovviamente di aver dichiarato entrambe nel solito <code>sources.list</code>) e ciascuna fonte appartiene ad una distribuzione differente, come stable e testing, allora sarà impossibile installare il suddetto pacchetto, a prescindere dal numero di versione; diversamente se le due fonti appartenessero alla stessa distribuzione allora il pacchetto potrebbe teoricamente essere installato. (NOTA, l'esempio fatto è strettamente teorico e non verificato praticamente).
* Pin compreso tra '''500 e 989''', il candidato sarà installato solo se non esistono candidati appartenenti alla distribuzione obiettivo e se la versione eventualmente già installata non è superiore a quella del candidato. Si noti che il semplice fatto di aver installato una certa distribuzione, per esempio testing, non significa aver definito la distribuzione obiettivo, che può essere solo definita manualmente dall'utente (il come sarà spiegato nella discussione del file <code>apt.conf</code>).
* Pin compreso tra '''990 e 999''', il candidato sarà installato solo se non esistono altri candidati con pin maggiore e se la versione eventualmente già installata non è superiore a quella del candidato.
* Pin '''1000''' o superiore, il candidato sarà installato se non esistono altri candidati con pin maggiore, è quindi possibile la retrocessione di versione (downgrade) se la versione eventualmente già installata è superiore a quella del candidato. Es. è possibile installare la versione 1.1 di un pacchetto anche se ad essere già installata è la 1.2 o superiore.


{{Box|Nota|
{{Box|Nota|Alcuni programmi della suite APT possono derogare alle regole generali per soddisfare le varie dipendenze dei pacchetti. Per esempio è il caso di [[aptitude]], che è in grado di proporre risoluzioni automatiche dei conflitti, consentendo anche di ignorare il pinning.}}
* Gli intervalli sopra citati sono presi tali e quali dal manuale di ''apt_preferences'', tuttavia a volte si è osservato che i limiti funzionano come dovrebbero se traslati in alto di una unità, ad esempio l'ultimo intervallo potrebbe partire da 1001 invece che da 1000.
* APT può derogare alle regole generali sopra esposte in casi particolari per soddisfare le varie dipendenze dei pacchetti.}}


= /etc/apt/apt.conf =
= /etc/apt/apt.conf =
Questo file insieme ad altri permette di definire le opzioni di APT e relativi strumenti senza bisogno di digitarli sempre da riga di comando. Si vedano le guide dedicate ad [[apt-get]] e [[aptitude]] per dei brevi esempi contenenti alcuni dei parametri più comuni.<br/>
Per quanto riguarda il pinning l'unico parametro strettamente di rilievo è:


Questo file insieme ad altri permette di definire le opzioni di APT e relativi strumenti senza bisogno di digitarli sempre da riga di comando. Si vedano le guide dedicate ad [[Apt-get | Apt-Get]] e [[Aptitude]] per alcuni brevi esempi contenenti alcui dei parametri più comuni.
<pre>APT::Default-Release "release_voluta";</pre>
Per quanto riguarda il pinning l'unico parametro strettamente di rilievo è:


<pre>APT::Default-Release "distribuzione_voluta";</pre>
che equivale alla dichiarazione in riga di comando dell'opzione '''<code>-t release_voluta</code>''' (anche nella forma <code>--target-release release_voluta</code>) in [[apt]], [[apt-get]] e [[aptitude]].


che equivale alla dichiarazione in riga di comando dell'opzione '''-t distribuzione_voluta''' sia in [[Apt-get | Apt-Get]] che [[Aptitude]]. Tale dichiarazione attribuisce priorità 990 a tutti i pacchetti appartenenti alla distribuzione specificata.
Tale dichiarazione:
* attribuisce priorità 990 a tutti i pacchetti appartenenti alla [[release]] specificata;
* ignora tutte le impostazioni di pinning in <code>/etc/apt/preferences</code> riguardanti la stessa release e relative a tutti i pacchetti (anziché a un singolo pacchetto o a un gruppo di pacchetti).


{{Warningbox|
Pertanto si raccomanda di '''non''' impostare una <code>Default-Release</code> se si vuole utilizzare anche il file <code>/etc/apt/preferences</code>, per non creare conflitti tra le due configurazioni. In questa guida ora '''si sconsiglia sempre''' l'uso di una <code>Default-Release</code>, per via dei cambiamenti introdotti a ''codename'' e ''suite'' di un repository di sicurezza a partire da Debian 11 ([[Bullseye]]).
* Tale priorità si applica alla distribuzione e non alla fonte, quindi ad ottenere la suddetta priorità non saranno solo i pacchetti appartenenti al repository principale (o ai due repository principali), ma anche quelli provenienti da altre fonti se il gestore di tale repository usa lo stesso valore per i parametri suite e codename di quelli principali, ad esempio ''stable'' e ''wheezy''. Per esempio ''backports'' non comporta problemi poiché i precedenti due parametri valgono ''nome_suite-backports'' e ''nome_codename-backports'', viceversa quello di ''deb-multimedia'' usa gli stessi identici valori di quelli principali.
* Per quanto riguarda tutti i pacchetti della release target questa dichiarazione ha la precedenza su qualsiasi altra generica priorità definita nel file ''preferences'', ad eccezione di quei pacchetti per ciascuno dei quali sia stata definita una specifica priorità.
* Questa direttiva influenza la priorità del repository principale di una release, nonché di quella relativa alla sua sicurezza, ad esempio
** <code>deb http://ftp.it.debian.org/debian/ wheezy main</code>
** <code>deb http://security.debian.org/ wheezy/updates main</code>
}}


{{Cautionbox|
* Tale priorità si applica alla release e non alla fonte, quindi ad ottenere la suddetta priorità non saranno solo i pacchetti appartenenti al repository principale (o ai due repository principali), ma anche quelli provenienti da altre fonti se il gestore di tale repository usa lo stesso valore per i parametri [[suite]] e [[codename]] di quelli principali, ad esempio ''stable'' e ''{{Codename|stable}}''.
* Questa direttiva fino a Debian 10 ([[Buster]]) ha influenzato la priorità del repository principale di una release, nonché di quella relativa alla sua sicurezza, motivo per cui era abbastanza utile in alcune situazioni, per esempio nel caso di '''buster''' avrebbe influenzato entrambi i repository: <br/> <code>deb {{APT-mirror}} buster main</code> <br/> <code>deb {{APT-mirror|security}} buster/updates main</code>
* A partire da Debian 11 ([[Bullseye]]) però il repository di sicurezza ha ''codename'' e ''suite'' propri: ''codename'''''-security''' e ''suite'''''-security''' rispettivamente; ossia nel caso di '''bullseye''': <br/> <code>deb {{APT-mirror|security}} bullseye'''-security''' main</code> <br/> E pertanto l'uso di una <code>Default-Release</code> '''non''' influenzerà più il repository di sicurezza, di fatto disabilitandolo!}}
Si noti inoltre che:
Si noti inoltre che:
* Le dichiarazioni di parametri da riga di comando hanno sempre la precedenza su quelli definiti in un file di configurazione, quindi usare un comando del tipo <code>apt-get install pacchetto -t distribuzione_taldeitali</code> sorpassa qualunque distribuzione obiettivo (''Default-Release'') dichiarata nel file <code>apt.conf</code>.
* Comandi del tipo <code>apt install pacchetto/release_taldeitali</code> '''non''' cambiano la ''target release'', ma si limitano a dire di prelevare lo specifico pacchetto dalla release indicata invece che da quella predefinita. Questo implica che le dipendenze continueranno ad essere risolte in base alla release obiettivo eventualmente specificata in <code>apt.conf</code> e/o in base al file <code>preferences</code> e/o in accordo all'algoritmo predefinito.
* Comandi del tipo <code>apt-get install pacchetto/distribuzione_taldeitali</code> non cambiano la ''target release'', ma si limitano a dire di prelevare lo specifico pacchetto dalla distribuzione indicata invece che da quella predefinita. Questo implica che le dipendenze continueranno ad essere risolte in base alla distribuzione obiettivo eventualmente specificata in <code>apt.conf</code> e/o in base al file preferences e/o in accordo all'algoritmo predefinito.
* Le dichiarazioni di parametri da riga di comando hanno sempre la precedenza su quelli definiti in un file di configurazione, che di conseguenza verranno ignorati, quindi usare un comando del tipo <code>apt -t release_taldeitali install pacchetto</code> disabilita durante l'esecuzione qualunque release obiettivo (<code>Default-Release</code>) dichiarata nel file <code>apt.conf</code>. Perciò avere un pinning a 990 in <code>preferences</code> non è necessariamente equivalente a impostare una <code>Default-Release</code>, anche in assenza di conflitti tra i due file di configurazione.
* Definire una distribuzione obiettivo in <code>apt.conf</code> è equivalente a dichiarare in <code>preferences</code> (si veda la prossima sezione) quanto segue
<pre>
Package: *
Pin: release a=distribuzione_voluta
Pin-Priority: 990
</pre>
* Qualora si sia definita una distribuzione obiettivo in <code>apt.conf</code> allora quasiasi dichiarazione in <code>preferences</code> riguardante tutti i pacchetti di una certa distribuzione sarà ignorata, ad esempio definire
<pre>
Package: *
Pin: release a=testing
Pin-Priority: 1000
</pre>
: è del tutto inutile se poi si usa l'opzione '''-t testing'''. Non è invece inutile una dichiarazione del seguente tipo:
<pre>
Package: specifico pacchetto o espressione regolare
Pin: release a=testing
Pin-Priority: 1000
</pre>


{{Box|File multipli|L'utente può, invece di creare un unico file di nome ''apt.conf'', creare più file di nome arbitrario in ''/etc/apt/apt.conf.d/'' (si veda il manuale)}}
{{Box|File multipli|L'utente può, invece di creare un unico file di nome <code>apt.conf</code>, creare più file di nome arbitrario in <code>/etc/apt/apt.conf.d/</code> (si veda il manuale)}}


= /etc/apt/preferences =
= /etc/apt/preferences =
 
Questo è il file dove è possibile definire tutte le priorità che si vogliono, fermo restando quanto detto nella sezione dedicata ad <code>apt.conf</code> di utilizzare soltanto uno dei file per il pinning. La sintassi generale è la seguente:
Questo è il file dove è possibile definire tutte le priorità che si vogliono, fermo restando quanto detto nella sezione dedicata ad <code>apt.conf</code>. La sintassi generale è la seguente:
<pre>
<pre>
Package: nome pacchetto o espressione regolare
Package: nome pacchetto o espressione regolare
Riga 111: Riga 104:
Pin-Priority: numero
Pin-Priority: numero
</pre>
</pre>
Un paio di esempi del tutto arbitrari:
<pre>
Package: vlc
Pin: release a=testing
Pin-Priority: 991
Package: virtualbox4*
Pin: Release o=Oracle Corporation
Pin-Priority: 780
</pre>
Nel primo esempio si è definito il pinning per il pacchetto di nome "vlc", richiedendo che le versioni appartenenti alla distribuzione testing abbiano priorità 991. Nel secondo invece sfruttando una semplicissima espressione regolare si impone che tutti i pacchetti il cui nome inizia per "virtualbox4" e appartenenti al repository la cui origine è definita come "Oracle Corporation" abbiano priorità 780.


Il pinning può essere orientato ai campi "Suite", "Origin", "Label" e "Codename" del file "Release" di un certo repository (si veda inizio pagina), nonché all'indirizzo del repository stesso. Si noti che per archivi personali e/o non ufficiali può non essere presente (purtroppo) un file "Release".
Un po' di esempi del tutto arbitrari:
È utile infine evidenziare un paragrafo del manuale di ''apt_preferences'':


{{Box|Importante|''Se almeno un record in forma specifica corrisponde ad una versione di pacchetto disponibile, allora il primo di questi record determina la priorità della versione del pacchetto. In caso contrario, se almeno un record in forma generica corrisponde ad una versione di pacchetto disponibile, allora il primo di questi record determina la priorità della versione del pacchetto.''}}
Package: vlc
Pin: release a=testing
Pin-Priority: 991


{{Suggerimento|Specificare nel file <code>sources.list</code> sempre per primi il o i repository principali della distribuzione obiettivo.}}
Package: vlc
Pin: release n={{Codename|testing}}
Pin-Priority: 991


{{Box|File multipli|È possibile creare più file di nome arbitrario in ''/etc/apt/apt.preferences.d/'' invece di creare un unico file di nome ''preferences'', (si veda il manuale).}}
  Package: virtualbox4*
Pin: Release o=Oracle Corporation
Pin-Priority: 780


= Esempi =
Il primo e il secondo esempio sono equivalenti, il primo fa riferimento alla [[suite]] (detta anche '''''a'''rchive'') mentre il secondo al [[codename]] ('''''n'''ome in codice''). In entrambi si è definito il pinning per il pacchetto di nome "vlc", richiedendo che le versioni appartenenti alla release testing, attualmente [[{{Codename|Testing}}]], abbiano priorità 991. Attenzione però che quando {{Codename|Testing}} diverrà la nuova [[stable]], il primo si applicherà alla nuova testing mentre il secondo continuerà a far riferimento a {{Codename|Testing}}. Solitamente è consigliabile il secondo (con ''codename''), se si utilizza una stable e si vogliono prelevare pacchetti da testing, mentre il primo (con ''suite'') se si utilizza una testing e si vuole restare sempre con quella. La scelta dovrebbe inoltre riflettere quella adottata per tutti i repository in <code>/etc/apt/sources.list</code>, tenendo presente anche che i [[backports]] contengono sempre il ''codename''.


== 01 ==
Nel terzo esempio invece, sfruttando un semplicissimo pattern, si impone che tutti i pacchetti il cui nome inizia per "virtualbox4" e appartenenti al repository la cui origine è definita come "Oracle Corporation" abbiano priorità 780.


La distribuzione principale sia testing, quella secondaria unstable.
Il pinning può essere orientato ai campi "Suite", "Origin", "Label" e "Codename" del file "Release" di un certo repository (si veda [[i repository ed il loro utilizzo]]), nonché all'indirizzo del repository stesso. Si noti che per archivi personali e/o non ufficiali può non essere presente (purtroppo) un file "Release".
È utile infine evidenziare un paragrafo del manuale di ''apt_preferences'':


=== sources.list ===
{{Box|Importante|''Se almeno un record in forma specifica corrisponde ad una versione di pacchetto disponibile, allora il primo di questi record determina la priorità della versione del pacchetto. In caso contrario, se almeno un record in forma generica corrisponde ad una versione di pacchetto disponibile, allora il primo di questi record determina la priorità della versione del pacchetto.''}}


<pre>
{{Suggerimento|Specificare nel file <code>sources.list</code> sempre per primi il o i repository principali della release obiettivo.}}
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free
deb http://ftp.de.debian.org/debian unstable main contrib non-free
</pre>


=== apt.conf ===
{{Box|File multipli|È possibile creare più file di nome arbitrario in ''/etc/apt/apt.preferences.d/'' invece di creare un unico file di nome ''preferences'',  (si veda il manuale).}}


<pre>
== Blocco/retrocessione di pacchetti ==
APT
Il file <code>preferences</code> può essere usato per bloccare e/o retrocedere ([[downgrade]]) uno o più pacchetti (al limite tutti); in entrambi i casi è necessario definire un pin maggiore o uguale a 1000 per il pacchetto desiderato. Se per esempio nel file <code>preferences</code> fosse presente un record come il seguente:
{
        Default-Release "testing";
        Cache-Limit 48000000;
        Get
        {
                AllowUnauthenticated 1;
                AutomaticRemove "true";
                Fix-Broken "true";
                Purge "true";
                Show-Upgraded "true";
        }
}
Aptitude
{
        Autoclean-After-Update "true";
        Auto-Fix-Broken "true";
        Purge-Unused "true";
}
</pre>


=== preferences ===
<br/>
<pre>
<pre>
Package: *
Package: nome_pacchetto
Pin: release a=unstable
Pin: version 1.0.1
Pin-Priority: 500
Pin-Priority: 1001
 
Package: *
Pin: release o=Debian
Pin-Priority: -10
</pre>
 
=== Conseguenze ===
 
Usando le azioni ''install'' e ''upgrade'' senza specificare l'opzione '''-t unstable''' si installano/aggiornano pacchetti prelevando le versioni da testing, a meno che un pacchetto sia presente solo in unstable, nel qual caso sarà prelevato da lì. Le dipendenze saranno risolte se possibile usando testing, altrimenti usando unstable.
 
Digitando <code>apt-get install vattelapesca -t unstable</code> si installerà la versione "vattelapesca" appartenente ad unstable, così come le sue dipendenze. Si noti che in questo caso successivi aggiornamenti tramite comandi del tipo <code>apt-get upgrade</code> o <code>apt-get dist-upgrade</code> non produrranno alcun aggiornamento da unstable del pacchetto "vattelapesca" se questo è anche presente in testing; in tal caso l'unica possibilità di aggiornare "vattelapesca" è digitare nuovamente <code>apt-get install vattelapesca -t unstable</code> (o aspettare pazientemente che la versione di testing superi quella installata).
 
== 02 ==
 
Sia testing l'unica distribuzione d'interesse, nonché quella obiettivo. Si supponga di voler usare anche la fonte ''www.deb-multimedia.org'', ma con l'unico scopo di installare solo quei pacchetti che non sono presenti nel repository principale.
 
{{Box|Nota|Questo esempio non permette di retrocedere automaticamente pacchetti già installati da deb-multimedia.}}
 
=== sources.list ===
 
<pre>
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free
deb http://www.deb-multimedia.org testing main non-free
</pre>
</pre>


=== apt.conf ===
a seguito del comando <code>apt-get install nome_pacchetto</code> si avrebbero i seguenti due casi:
# Se nel sistema non esiste una versione del suddetto pacchetto oppure se già installato la sua versione è più vecchia di 1.0.1, allora il pacchetto viene aggiornato normalmente, ma una volta terminata l'installazione questo pacchetto non verrà mai più aggiornato.
# Se il pacchetto è già stato installato e la sua versione è più recente di 1.0.1 allora il pacchetto presente nel sistema viene disinstallato e sostituito con quello avente versione 1.0.1. Terminata l'installazione il pacchetto non verrà mai più aggiornato.
Per permettere nuovamente l'aggiornamento del pacchetto è necessario eliminare il record.


<pre>
Per maggiori informazioni si consulti la guida [[Fare il downgrade di uno o più pacchetti]].
APT
{
        Cache-Limit 48000000;
        Get
        {
                AllowUnauthenticated 1;
                AutomaticRemove "true";
                Fix-Broken "true";
                Purge "true";
                Show-Upgraded "true";
        }
}
Aptitude
{
        Autoclean-After-Update "true";
        Auto-Fix-Broken "true";
        Purge-Unused "true";
}
</pre>
 
=== preferences ===
<br/>
<pre>
Package: *
Pin: Release o=Unofficial Multimedia Packages
Pin-Priority: 101
 
Package: *
Pin: Release a=Testing
Pin-Priority: 990
 
Package: *
Pin: release o=Debian
Pin-Priority: -10
</pre>


=== Osservazioni ===
{{Warningbox | Si noti che cercare di retrocedere l'intero sistema, impostando un pinning superiore a 1000 per tutti i pacchetti di una precedente [[release]], '''È UNA FOLLIA!'''


Poiché entrambe le fonti, ''principale'' e ''deb-multimedia'', appartengono alla distribuzione testing in teoria questo caso non sarebbe gestibile tramite pinning, tuttavia sotto l'ipotesi di voler installare da deb-multimedia solo i pacchetti non presenti nella fonte principale il problema è risolvibile. Evitando di definire in <code>apt.conf</code> una distribuzione obiettivo e definendo in <code>preferences</code> prima il record relativo a deb-multimedia si ottiene di riuscire ad assegnare la priorità desiderata, nonostante il fatto che il secondo record si applichi in teoria anche a deb-multimedia.<br/>
Non è un'operazione minimamente supportata né testata, in quanto è opposta a quella che avviene con l'aggiornamento tramite APT e ha grandi probabilità di rendere l'intero sistema inusabile. Si raccomanda caldamente invece di effettuare una nuova installazione della [[release]] desiderata.}}
Si noti che stanti così le cose dovrebbe essere in realtà possibile attribuire pin superiori, fino a 989, a deb-multimedia, senza che per questo i suoi candidati ottengano la precedenza su quelli del repository principale.


Qualora invece si desiderasse dare la precedenza ai pacchetti di deb-multimedia sarebbe sufficiente definire la distribuzione obiettivo in <code>apt.conf</code> risultando perfino inutile definire un file <code>preferences</code>, visto che come già detto di norma i candidati di deb-multimedia hanno numero di versione maggiore di queli del repository principale.
= Esempi senza bisogno di pinning =


In ultimo si fa semplicemente osservare che l'utilizzo dell'opzione '''-t''' in questo caso è inutile, visto che si lavora per ipotesi con una sola distribuzione.
== Release pura ==
Non serve il pinning se si usano i [[repository ufficiali]] o quelli [[repository speciali|speciali]] di una sola release di Debian, ed è '''sconsigliato''' anche impostare una <code>Default-Release</code> in <code>apt.conf</code>.


== 03 ==
Infatti ciò avrebbe effetto sul repository principale e su quello della sicurezza (solo fino a Debian 10 [[Buster]]), ma non sugli eventuali ''updates'' o ''proposed-updates'', che non sarebbero più aggiornati automaticamente, salvo che per i pacchetti già installati da quei repository. Per riabilitare gli aggiornamenti automatici sarebbe necessario impostare un pinning a 990, pari a quello della <code>Default-Release</code>.
E a partire da Debian 11 ([[Bullseye]]) perfino gli aggiornamenti di sicurezza sarebbero bloccati!


In questo how-to mostrerò come utilizzare pacchetti Debian provenienti da Testing, Unstable, Experimental e deb-multimedia (audio/video) ma le istruzioni sono facilmente riportabili anche ad altre situazioni (unstable + experimental, stable + testing, stable + unstable, stable + testing + unstable, ecc.).
== Stable con backports ==
Non è necessario alcun pinning nemmeno aggiungendo i [[backports]] ai repository della [[stable]] (attualmente [[{{Codename|Stable}}]]), in quanto di default sono disattivati, a eccezione dei pacchetti presenti soltanto lì, e consentono solo l'aggiornamento automatico dei pacchetti installati manualmente dai backports.


== Impostare i repository ==
Per installare un pacchetto dai backports la prima volta, basta utilizzare [[apt]] (o equivalentemente [[apt-get]]):
# apt -t {{Codename|stable}}-backports install nomepacchetto


Assicuriamoci di essere l'utente root e procediamo.
Per esempio per installare <code>libreoffice</code>:
# apt -t {{Codename|stable}}-backports install libreoffice


Per prima cosa editiamo il file <code>/etc/apt/sources.list</code> ed inseriamo gli archivi dei pacchetti Debian che utilizzeremo, per esempio:
Dopo di che sarà aggiornato automaticamente assieme agli altri pacchetti di {{Codename|Stable}} con:
<pre>
<pre>
### Debian Ufficiale -- Testing
# apt update
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
# apt upgrade
 
### Debian Ufficiale -- Testing Sicurezza
deb http://security.debian.org/ testing/updates main contrib non-free
 
### Debian Ufficiale -- Sid
deb http://ftp.it.debian.org/debian/ unstable main contrib non-free
 
###  Debian Ufficiale -- Experimental
deb http://ftp.it.debian.org/debian/ experimental main contrib non-free
 
### deb-multimedia -- Audio/Video -- Marillat
deb http://www.deb-multimedia.org testing main non-free
deb http://www.deb-multimedia.org sid main non-free
</pre>
</pre>
Si noti invece che potrebbe essere necessario un <code>dist-upgrade</code> se si utilizza [[apt-get]].


== Configurare apt ==
=== Backports automatici ===
{{Cautionbox | Questo esempio '''non''' è consigliato, ma intende soltanto mostrare alcune delle problematiche nella configurazione del pinning.


A questo punto dobbiamo preparare due file normalmente non presenti sulla nostra debianbox: si tratta dei file <code>/etc/apt/preferences</code> e <code>/etc/apt/apt.conf</code>.
Si ricorda infatti che i backports non sono sottoposti agli stessi controlli dei repository principali della stable, per cui è sconsigliato l'uso indiscriminato di tutti i pacchetti contenuti, in particolare per macchine di produzione. È invece consigliabile utilizzarli soltanto per i pacchetti di cui si ha una reale necessità, come visto nella sezione precedente.}}
Questi due file istruiranno APT su come gestire le dipendenze dei pacchetti, informandolo su come comportarsi in caso di conflitti e altri problemi.
Si supponga di voler usare tutti i pacchetti della [[stable]], con l'eccezione di quelli relativi a <code>libreoffice</code> che si vuole siano prelevati esclusivamente dai [[backports]]. È bene chiarire subito che '''non esiste alcun modo di garantire ciò''' tramite il pinning, poiché le [[dipendenze]] di un pacchetto non sono influenzate dalla sua ''Pin-Priority''. Quello che si può fare è trovare una soluzione di compromesso, che è quasi sempre più svantaggiosa di quella proposta nella sezione precedente, ossia non utilizzando alcun pinning.


=== Il file <code>apt.conf</code> ===
Infatti è possibile soltanto impedire l'installazione dei pacchetti dalla stable quando presenti anche nei backports. Questo perché, per soddisfare tutte le possibili dipendenze dei pacchetti installati, l'unico modo sarebbe assegnare una ''Pin-Priority'' di almeno 500 a tutti i pacchetti provenienti dai backports, che di default ne hanno una di 100.


Ora creiamo il file <code>/etc/apt/apt-conf</code>
Le principali alternative, presentate a solo scopo didattico:
* nessuna <code>Default-Release</code> in <code>apt.conf</code> e file <code>/etc/apt/preferences</code> come segue
Package: libreoffice
Pin: release n={{Codename|stable}}-backports
Pin-Priority: 500
* nessuna <code>Default-Release</code> in <code>apt.conf</code> e file <code>/etc/apt/preferences</code> come segue
Package: libreoffice*
Pin: release n={{Codename|stable}}-backports
Pin-Priority: 500
* nessuna impostazione in <code>/etc/apt/preferences</code> e file <code>/etc/apt/apt.conf</code> come segue
APT::Default-Release "{{Codename|stable}}-backports";


<pre># touch /etc/apt/apt.conf</pre>
La prima possibilità restituisce errore quando si cerca di installare il pacchetto, costringendo a ricorrere all'opzione <code>-t</code> oppure lasciando ad [[aptitude]] il compito di risolvere i conflitti. In modo analogo può restituire errore durante un aggiornamento, se richiede anche l'aggiornamento delle sue [[dipendenze]], costringendo a ripetere il comando di installazione con <code>-t</code>.


ed editiamolo inserendo quanto segue:
La seconda possibilità riesce più spesso, in quanto quasi tutte le dipendenze cominciano con la stringa ''libreoffice'' e sono quindi catturate dal pattern ''libreoffice'''*''''', tuttavia nemmeno ciò garantisce il funzionamento automatico in ogni circostanza, per via di possibili altre dipendenze con altri nomi. E anche se aggiungessimo pure tali pacchetti, si aumenterebbe soltanto la frequenza di successo, senza però mai avere una garanzia nella totalità dei casi, visto che nuove dipendenze potrebbero essere aggiunte in successivi aggiornamenti.


<pre>
La terza alternativa è l'unica che funziona sempre in automatico, ma si applica indiscriminatamente a tutti i pacchetti contenuti nei ''backports'', che è proprio quello che si voleva evitare per una [[stable]].
APT::Default-Release "testing";
APT::Cache-Limit 15000000;
Apt::Get::Purge;
APT::Clean-Installed;
APT::Get::Fix-Broken;
APT::Get::Fix-Missing;
APT::Get::Show-Upgraded "true";
</pre>


=== Il file <code>preferences</code> ===
{{Box | Backports obbligatori | Specificando una priorità di 990 anziché 500 nel file <code>/etc/apt/preferences</code>, come visto in questa sezione, l'installazione di <code>libreoffice</code> dai repository non backports fallirebbe anche utilizzando l'opzione <code>-t {{Codename|stable}}</code>, rendendo l'installazione da ''{{Codename|stable}}-backports'' l'unica possibile (anche se non garantita senza l'uso dell'opzione <code>-t {{Codename|stable}}-backports</code>).


Creiamo il file <code>/etc/apt/preferences</code>:
Si noti invece che l'uso dei backports non è obbligatorio specificando la <code>Default-Release</code> a ''{{Codename|stable}}-backports'', per le ragioni già esposte nella sezione su <code>apt.conf</code> di questa guida, anche se lo sarebbero gli aggiornamenti (in assenza di conflitti con le dipendenze).}}


<pre># touch /etc/apt/preferences</pre>
== Unstable/Sid ed experimental ==
Se si utilizzino soltanto i repository [[sid]] ed [[experimental]] non è necessario alcun pinning, dato che gli experimental di default hanno una ''Pin-Priority'' di 1, che impedisce sia l'installazione sia l'aggiornamento automatico dei pacchetti contenuti.


ed editiamolo col nostro editor di fiducia e inseriamo queste direttive:
Per installare o aggiornare un pacchetto da experimental, basta eseguire:
<pre>
<pre># apt -t experimental install nomepacchetto</pre>
Package: *
Pin: release o=Unofficial Multimedia Packages
Pin-Priority: 950


Package: *
= Esempi con pinning =
Pin: release a=unstable
Pin-Priority: 800


Package: *
== Stable con testing ==
Pin: release a=experimental
{{Cautionbox | Senza pinning ci si troverebbe con una testing effettuando gli aggiornamenti del sistema.
Pin-Priority: 750
</pre>


Facciamo l'update del database dei pacchetti:
Ma anche con il pinning c'è il pericolo che a ogni aggiornamento aumenti la possibilità che nuove dipendenze da testing siano necessarie, rendendo la provenienza dei pacchetti della propria distribuzione sempre più mista, senza i benefici di nessuna delle due e quindi in una situazione meno desiderabile di un passaggio diretto a testing.}}
Per prima cosa si devono aggiungere i [[Repository ufficiali|repository di testing]]. Di seguito sono esaminate diverse possibilità di pinning, in base alla configurazione desiderata.


<pre># apt-get update</pre>
=== sources.list ===
{{Cautionbox | Si ricorda che a partire da Debian 11 ([[Bullseye]]) i repository di sicurezza andranno scritti con la dicitura ''release'''''-security''' (anziché ''release'''''/updates'''); per esempio nel caso di bullseye:
deb {{APT-mirror|security}} bullseye'''-security''' main }}
# Stable
deb {{APT-mirror}} {{Codename|stable}} main
deb-src {{APT-mirror}} {{Codename|stable}} main
# Aggiornamenti di sicurezza
deb {{APT-mirror|security}} {{Codename|stable}}{{#ifeq: {{Codename|stable}} | buster | /updates | -security }} main
deb-src {{APT-mirror|security}} {{Codename|stable}}{{#ifeq: {{Codename|stable}} | buster | /updates | -security }} main
# Aggiornamenti raccomandati
deb {{APT-mirror}} {{Codename|stable}}-updates main
deb-src {{APT-mirror}} {{Codename|stable}}-updates main
# Backports
deb {{APT-mirror}} {{Codename|stable}}-backports main
deb-src {{APT-mirror}} {{Codename|stable}}-backports main
# Testing
deb {{APT-mirror}} {{Codename|testing}} main
deb-src {{APT-mirror}} {{Codename|testing}} main
# Aggiornamenti di sicurezza di testing
deb {{APT-mirror|security}} {{Codename|testing}}-security main
deb-src {{APT-mirror|security}} {{Codename|testing}}-security main


D'ora in avanti avremo due possibilità per installare un nuovo pacchetto: il metodo che usiamo di solito e cioè:
Quello mostrato è solo un esempio con i due repository principali di [[{{Codename|Stable}}]], quello normale e di sicurezza, gli aggiornamenti raccomandati e i backports, che non sono strettamente necessari per questo esempio (ma è sempre preferibile cercare prima in questi repository che in testing), e i due repository di [[{{Codename|Testing}}]] ([[testing]]).


<pre># apt-get install nome_pacchetto</pre>
Questo file è valido per tutti gli esempi di questa sezione, mentre gli altri dipendono dalla configurazione del pinning desiderata. Si noti in particolare la scelta del [[codename]] (''{{Codename|testing}}'') al posto della [[suite]] (''testing''), che è la configurazione consigliata in presenza di una [[stable]] e verrà quindi mantenuta anche per il pinning.


che utilizzerà pacchetti proveniente dalla versione impostata come '''Default-Release''' in '''apt.conf''', oppure il comando
=== apt.conf ===
Non si utilizza in questo caso, per non creare conflitti con il file <code>/etc/apt/preferences</code>. Assicurarsi perciò che <code>/etc/apt/apt.conf</code> non contenga una riga su <code>Default-Release</code>, che se presente va cancellata.


<pre># apt-get install -t versione_di_debian nome_pacchetto</pre>
=== Pinning per un singolo pacchetto ===
 
Creare il file <code>/etc/apt/preferences</code> con questo contenuto:
che provvederà a installare il pacchetto da noi richiesto per la versione specificata (versione_debian), risolvendo automaticamente le dipendenze.
Package: nomepacchetto
 
Pin: release n={{Codename|testing}}
 
Pin-Priority: 990
 
_________________________________________________________________________________________________________________________________________________________
Package: *
 
Pin: release n={{Codename|testing}}
 
Pin-Priority: -1
 
 
== PINNING ==
 
Abbiamo visto come poter avere una Debian Stable, Testing o Unstable adattando i repository all'uopo. Però, usando una Stable o una Testing potrebbe nascere l'esigenza di bloccare un pacchetto o volerlo aggiornare ad una versione che si trova in un ramo superiore senza compromettere la stabilità e la funzionalità della versione che si sta utilizzando o addirittura fare un downgrade di un pacchetto o dell'intera versione (caso molto delicato). Per far ciò Debian utilizza un meccanismo molto sofisticato, chiamato ''pinning'', che permette di assegnare ai vari pacchetti una priorità per l'installazione indipendentemente dal ramo o versione di cui fanno parte (stable, testing, unstable, experimental).<br />
Per far ciò è possibile agire su uno o entrambi i seguenti due file testuali: <code>/etc/apt/apt.conf</code> e <code>/etc/apt/preferences</code>. Di norma questi due file non sono presenti dopo un'installazione, è pertanto l'utente a doverli creare ex-novo utilizzando un qualsiasi editor di testo.<br/>
Si noti che entrambi i file devono essere definiti secondo precise regole e direttive di cui si mostreranno solo alcuni elementi base, giusto per aver un minimo di funzionalità.
 
{{ Warningbox | Considerata la complessità dell'argomento, questo mini how-to ha il solo scopo all'introduzione di questa procedura, per un uso avanzato far riferimento a [http://manpages.debian.net/man/5/apt.conf man apt.conf] e [http://manpages.debian.net/man/5/apt_preferences man apt_preferences]}}
 
=== /etc/apt/apt.conf ===
 
Delle innumerevoli direttive che è possibile dichiarare solo la seguente interessa la procedura di pinning:


<pre>APT::Default-Release</pre>
Questa configurazione si consiglia soltanto per pacchetti che non richiedono l'installazione di altri da testing.
 
ad esempio
 
<pre>APT::Default-Release "stable"; </pre>
 
impone ad apt di considerare la release stable come release di riferimento, attribuendogli un punteggio di 990 (si veda più avanti per una spiegazione del significato dei vari punteggi).
 
{{Box|Nota|
* Per quanto riguarda tutti i pacchetti della release target questa dichiarazione ha la precedenza su qualsiasi altra generica priorità definita nel file ''preferences'', ad eccezione di quei pacchetti per ciascuno dei quali sia stata definita una specifica priorità.
* Questa direttiva influenza la priorità del repository principale di una release, nonché di quella relativa alla sua sicurezza, ad esempio
** <code>deb http://ftp.it.debian.org/debian/ wheezy main</code>
** <code>deb http://security.debian.org/ wheezy/updates main</code>
}}
 
Premesso questo in <code>/etc/apt/apt.conf</code> si daranno le seguenti indicazioni:
 
- della versione che si vuole utilizzare come default (stable)<br>
- della dimensione della cache<br>
- del purge dei pacchetti<br>
- della pulizia della cache<br>
- del fix dei pacchetti rotti (causa dipendenze non soddisfatte)<br>
- del fix dei pacchetti non possibili da installare<br>
- di mostrare gli upgrade dei pacchetti<br>
- di forzare il loop dei pacchetti rotti (causa dipendenze non soddisfatte)<br>
- di permettere l'installazione di pacchetti non autenticati (manca la chiave pubblica)<br>
 
quindi il file <code>preferences</code> apparirà come segue


Si può controllarne il funzionamento con:
<pre>
<pre>
  APT::Default-Release "stable";
$ apt-get --simulate install nomepacchetto
 
  APT::Cache-Limit 24000000;
 
  Apt::Get::Purge;
 
  APT::Clean-Installed;
 
  APT::Get::Fix-Broken;
 
  APT::Get::Fix-Missing;
 
  APT::Get::Show-Upgraded "true";
 
  APT::Force-LoopBreak=true;
 
  APT::Get::AllowUnauthenticated 1;
</pre>
</pre>
(e si può usare la forma abbreviata <code>-s</code> al posto di <code>--simulate</code>)


{{Box|Nota|L'utente può, invece di creare un unico file di nome ''apt.conf'', creare più file di nome arbitrario in ''/etc/apt/apt.conf.d/'' (si veda il manuale)}}.
In assenza di problemi, sarà possibile installare il pacchetto "nomepacchetto" da testing semplicemente con:
 
=== /etc/apt/preferences ===
 
Prima di vedere la sintassi per strutturare il file cerchiamo di capire il valore che la policy Debian assegna ad un singolo pacchetto o alla release (stable o testing) in generale:<br/>
<br/>
'''Valore del PIN:'''<br/>
- superiore a '''1000''' ha l'assoluta priorità nell'installazione può implicare il downgrade<br/>
- da '''991 a 1000''' il pacchetto verrà installato anche se non fa parte della release (specificata in apt.conf), a meno che la versione installata sia più recente<br/>
- da '''551 a 990''' il pacchetto verrà installato a meno che ci sia disponibile una versione che fa parte della release (specificata in apt.conf) o che la versione installata sia più recente<br/>
- da '''101 a 550''' il pacchetto verrà installato a meno che ci sia disponibile una versione appartenente a qualsiasi release o che la versione installata sia più recente<br/>
- da '''0 a 100''' il pacchetto viene installato solo se non è installata nessuna versione del pacchetto<br/>
- minore di '''0''' previene l'installazione del pacchetto, qualsiasi sia l'origine<br/>
<br/>
Avendo visto il valore del PIN possiamo adattare il nostro file ''/etc/apt/preferences'' ai nostri bisogni, bloccando o retrocedendo oppure aggiornando i vari pacchetti. Da tenere in considerazione che se usiamo una stable ed installiamo un pacchetto da testing o unstable non avremo più la garanzia che essa ci offre.<br/><br/>
 
{{Box|Nota|Similmente al caso precedente è possibile creare più file di nome arbitrario in ''/etc/apt/apt.preferences.d/'' invece di creare un unico file di nome ''preferences'',  (si veda il manuale).}}
 
Qualche esempio pratico.<br/>
<br/>
Fondamentale aver creato il file '''/etc/apt/apt.conf''' (dove avremo specificato la nostra release preferita: stable o testing) e aver abilitato tutti i repository delle diverse release in '''/etc/apt/sources.list'''
 
<pre>
<pre>
deb http://ftp.it.debian.org/debian/ stable main contrib non-free
# apt install nomepacchetto
 
deb http://www.deb-multimedia.org stable main non-free
 
deb http://ftp.it.debian.org/debian/ stable-backports main contrib non-free
 
deb http://security.debian.org/ stable/updates main contrib non-free
 
deb http://ftp.it.debian.org/debian/ stable-updates main contrib non-free
 
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
 
deb http://www.deb-multimedia.org stable main non-free
 
deb http://ftp.it.debian.org/debian/ unstable main contrib non-free
 
deb http://www.deb-multimedia.org unstable main non-free
</pre>
</pre>


In presenza di dipendenze, o si aggiungono al file <code>preferences</code> se non sono molte, oppure si consiglia la configurazione presentata nella sezione successiva.


Ovviamente chi usa Testing può omettere i repository della Stable.<br/>
{{Cautionbox | Infatti mentre sarebbe possibile forzarne l'installazione con:
<br/>
# apt -t {{Codename|testing}} install nomepacchetto
Ora possiamo vedere la policy Debian riguardo alle release:
c'è da considerare che l'uso dell'opzione <code>-t</code> renderebbe il pinning per "nomepacchetto" superfluo; e inoltre la configurazione attuale impedirebbe gli aggiornamenti automatici delle dipendenze appena installate, costringendo a ripetere il comando precedente in caso di conflitti oppure ad avvelersi di [[aptitude]] per risolverli (prestando '''molta attenzione''' alle soluzioni proposte).}}
=== Pinning per tutti i pacchetti di testing e backports ===
Questa possibilità consente gli aggiornamenti automatici dei pacchetti installati manualmente da testing, permettendone l'installazione anche in assenza di altre versioni disponibili. È sufficiente scrivere il file <code>/etc/apt/preferences</code> come segue:
Package: *
Pin: release a={{Codename|stable}}-backports
Pin-Priority: 300
Package: *
Pin: release n={{Codename|testing}}
Pin-Priority: 200
Dove ''{{Codename|stable}}-backports'' è il nome della [[suite]] (e il [[codename]], che sono uguali per i [[backports]]) dei repository backports di [[{{Codename|Stable}}]]. È consigliabile specificare la nuova priorità a prescindere dalla loro presenza, altrimenti se attivati saranno sempre nascosti da [[{{Codename|Testing}}]], avendo di default una priorità di 100 e contenendo versioni non più aggiornate.


<pre>apt-cache policy</pre>
Si noti che i valori scelti non sono gli unici possibili. L'importante è che siano soddisfatte le seguenti condizioni:
* ''{{Codename|stable}}-backports'' deve avere una priorità inferiore a quella di default (500), utilizzata per ''{{Codename|stable}}'' e ''{{Codename|stable}}-updates'';
* ''{{Codename|testing}}'' deve avere una priorità inferiore a quella scelta per ''{{Codename|stable}}-backports'';
* ''{{Codename|testing}}'' e ''{{Codename|stable}}-backports'' devono avere una priorità almeno pari a 100, per consentire gli aggiornamenti automatici una volta che un pacchetto è installato da tali repository.


ci restituirà il PIN delle release, giusto per farci un'idea.<br />
Ora basterà:
Lo stesso per vedere la policy di un singolo pacchetto  es:
# apt -t {{Codename|testing}} install nomepacchetto
per installare nuovi pacchetti da {{Codename|Testing}}, che saranno poi aggiornati in automatico. Si noti però che perfino in questo caso gli aggiornamenti potrebbero comunque richiedere l'uso dell'opzione <code>-t</code> oppure il meccanismo di risoluzione dei conflitti di [[aptitude]], se nuove dipendenze fossero aggiunte nello stesso ramo.


<pre>apt-cache policy nano</pre>
== Testing con unstable ed experimental ==
<!--
  NOTA: *NON* cambiare il nome della sezione "Testing con unstable ed experimental", perché è utilizzata da altre guide.
-->
La release principale sia [[testing]], quella secondaria [[Sid]]/[[unstable]] e si utilizzino anche i repository [[experimental]].


=== STABLE ===
=== sources.list ===
deb {{APT-mirror}} testing main
deb-src {{APT-mirror}} testing main
# Aggiornamenti di sicurezza
deb {{APT-mirror|security}} testing-security main
deb-src {{APT-mirror|security}} testing-security main
# Unstable
deb {{APT-mirror}} sid main
deb-src {{APT-mirror}} sid main
# Experimental
deb {{APT-mirror}} experimental main
deb-src {{APT-mirror}} experimental main


Si noti che i repository sono indicati per [[suite]] anziché per [[codename]], in questo modo la propria release rimarrà sempre [[testing]] senza mai divenire la nuova [[stable]].


Prendiamo in considerazione di lavorare con una Stable e il file preferences nel seguente modo
Di default tutti hanno priorità 500, a eccezione di experimental che ha una priorità di 1.  È il motivo per cui, se si utilizzassero soltanto sid ed experimental non sarebbe necessario alcun pinning, avendo già priorità differente.
 
<pre>
Package: *
Pin: release a=stable
Pin-Priority: 900


Package: *
La configurazione inoltre sarebbe equivalente anche se non si utilizzasse il repository experimental, ma soltanto testing e sid, e sarebbe sufficiente rimuovere experimental dal file <code>/etc/apt/sources.list</code> .
Pin: release o=Debian
Pin-Priority: -10
</pre>


Cerchiamo di capire il significato delle tre righe:
=== apt.conf ===
Assicurarsi che '''non''' sia impostata una <code>Default-Release</code> per non disabilitare gli aggiornamenti di sicurezza ('''testing-security''').


'''Package: *'''  vuol dire tutti i pacchetti<br>
[[Testing]] tipicamente non riceve comunque aggiornamenti di sicurezza da questo repository, se non quando non è possibile il porting da [[Sid]], ma è sempre meglio tenerlo abilitato.
'''Pin: release a=stable''' tutti i pacchetti della Suite (a) stable<br>
'''Pin-Priority: 900''' verranno installati solo pacchetti più aggiornati della stessa release (se ce ne sono)<br>
<br>     
mentre<br>


'''Package: *''' vuol dire tutti i pacchetti<br>
=== preferences ===
'''Pin: release o=Debian''' pacchetti di Origin (o) Debian<br>
In questo modo entrambi i repository '''testing''' e '''testing-security''' avranno priorità maggiore di '''sid''':
'''Pin-Priority: -10''' nessuna priorità<br>
<br>
In questo caso verranno installati solo pacchetti più aggiornati della stessa release (se ce ne sono) e nessun altro pacchetto di release diverse verrà installato.<br/>
Se si vuole installare un pacchetto proveniente dalla release Testing si possono usare due comandi:


<pre>apt-get install nome_pacchetto/testing</pre>
Package: *
Pin: release a=testing-security
Pin-Priority: 990
Package: *
Pin: release a=testing
Pin-Priority: 990


(''installerà il pacchetto con le dipendenze della stable'')
Si noti che questa configurazione era equivalente a impostare la <code>Default-Release</code> a '''testing''' nel file <code>/etc/apt/apt.conf</code>, prima dei cambiamenti a [[codename]] e [[suite]] dei repository di sicurezza introdotti con Debian 11 ([[Bullseye]]).


<pre>apt-get install -t testing nome_pacchetto</pre>
Alternativamente sarebbe possibile anche impostare una priorità inferiore per '''sid''', purché almeno uguale a '''100'''. Per esempio:
Package: *
Pin: release n=sid
Pin-Priority: 100


''(installerà il pacchetto con le dipendenze della release testing. Il pacchetto non verrà più aggiornato fino a quando non ridaremo lo stesso comando)''<br/>
Con entrambe le configurazioni il repository di '''sid''' sarebbe equivalente a quello dei [[Il repository Backports|backports]]; ossia verrebbe consentito l'aggiornamento automatico dei pacchetti installati, ma non l'installazione automatica di nuovi pacchetti (se presenti anche in '''testing''').
<br/>
{{ Warningbox | Considerata la stabilità della release Stable, usare pacchetti di altre release potrebbe comprometterne la stabilità. Per avere una perfetta integrazione con Stable meglio usare il pinning con i pacchetti provenienti dai backports }}


Se, ad esempio, volessimo installare la versione più recente di ''libreoffice'' dai ''backports'':  
=== Osservazioni ===
# Usando le azioni ''install'' e ''upgrade'' senza specificare l'opzione '''<code>-t sid</code>''' si installano/aggiornano pacchetti prelevando le versioni da testing, a meno che un pacchetto sia presente solo in sid, nel qual caso sarà prelevato da lì. Le dipendenze saranno risolte se possibile usando testing, altrimenti usando sid.
# Digitando <code>apt -t sid install vattelapesca</code> si installerà la versione "vattelapesca" appartenente ad sid, così come le sue dipendenze. Si noti che dopo l'avvenuta installazione, successivi aggiornamenti tramite comandi del tipo <code>apt upgrade</code> o <code>apt full-upgrade</code> continueranno a installare la versione più recente, anche prelevandola automaticamente da sid, almeno finché la versione in testing non diverrà equivalente.
# Una volta che la versione in testing divenisse uguale a quella presente in sid, successive versioni presenti soltanto in sid non sarebbero aggiornate automaticamente, ma servirebbe specificare nuovamente l'opzione <code>-t</code>/<code>--target-release</code>.
# I pacchetti contenuti in experimental sono installabili unicamente se non sono già installati e se non sono presenti in nessun altro repository. Altrimenti è necessario ricorrere all'opzione <code>-t</code>.
# Tutto quello che è installato da experimental non sarà mai aggiornato in automatico. Questo comportamento è del tutto voluto, perché sarebbe troppo pericoloso aggiornare senza supervisione ciò che proviene da questo repository, essendo quello meno testato e potenzialmente con maggiori bug. Per effettuare l'aggiornamento è sufficiente ripetere il comando di installazione: <br/><code># apt -t experimental install nomepacchetto</code>


<pre>apt-get -t stable-backports install libreoffice</pre>
== Testing con pacchetti non-free e repository deb-multimedia ==
Sia testing l'unica release d'interesse. Si supponga di voler usare anche la fonte ''www.deb-multimedia.org'', ma con l'unico scopo di installare solo quei pacchetti che non sono presenti nel repository principale.


per evitare che nei prossimi upgrades il pacchetto venga retrocesso alla versione della ''Stable'' nel file preferences aggiungere:
{{Box|Nota|Questo esempio non permette di retrocedere automaticamente pacchetti già installati da deb-multimedia.}}


<pre>Package: libreoffice
=== sources.list ===
Pin: release a=stable-backports
Abilitiamo anche le sezioni ''contrib'' e ''non-free'':
Pin-Priority: 999</pre>


In questo modo rimarrà installata la versione del Backports.<br/>
# Debian testing
<br/>
deb {{APT-mirror}} testing main contrib non-free
Come detto precedentemente in questa maniera possiamo fare il downgrade sia di un pacchetto o dell'intera release, basta agire sul file preferences indicando il pacchetto o la release modificando il Pin-Priority.<br/>
Vediamo qualche esmpio concreto.<br/>
# Debian testing - sicurezza
<br/>
deb {{APT-mirror|security}} testing-security main contrib non-free
''ES. n° 1'' voglio il ''pacchetto-1.0.1''  indipendentemente dalla release che utilizzo
  # repository NON ufficiali - multimedia
deb http://www.deb-multimedia.org testing main non-free


<pre>
Senza altre impostazioni, tutti i repository avrebbero una priorità di 500, e pertanto di default verrebbero sempre installati quelli solitamente più aggiornati di ''deb-multimedia'', ogni volta che è possibile. Questo comportamento non è affatto desiderabile, e anzi può compromettere la stabilità del sistema.
Package: pacchetto
Pin: version 1.0.1
Pin-Priority: 1001
</pre>


in questo modo  ''pacchetto'' versione ''1.0.1'' non verrà mai scalzato né da una versione più recente né da una più vecchia (in caso di downgrade).<br/>
=== apt.conf ===
<br/>
Non è necessaria nessuna modifica. Sarebbe inoltre del tutto inutile impostare una <code>Default-Release</code>, poiché sia i repository ufficiali sia quelli di ''deb-multimedia'' sono considerati testing.
''ES. n° 2'' fare il downgrade di una release (questo passaggio è molto delicato, usatelo con cautela):


=== preferences ===
<pre>
<pre>
Package: *
Package: *
Pin: release a=stable
Pin: Release o=Unofficial Multimedia Packages
Pin-Priority: 1001
Pin-Priority: 100
 
Package: *
Pin: release o=Debian
Pin-Priority: -10
</pre>
</pre>


in questo modo basta
Con questa impostazione il repository ''deb-multimedia'' si comporta in maniera analoga ai repository backports ufficiali, consentendo l'installazione automatica dei soli pacchetti non presenti in altri repository e anche l'aggiornamento automatico di tutti i pacchetti precedentemente installati dallo stesso.


<pre>aptitude update
=== Osservazioni ===
aptitude safe-upgrade
* Poiché entrambe le fonti, ''principale'' e ''deb-multimedia'', appartengono alla release testing in teoria questo caso non sarebbe gestibile tramite pinning, tuttavia sotto l'ipotesi di voler installare da ''deb-multimedia'' solo i pacchetti non presenti nella fonte principale il problema è risolvibile. Evitando di definire in <code>apt.conf</code> una release obiettivo e definendo in <code>preferences</code> prima il record relativo a ''deb-multimedia'' si ottiene di riuscire ad assegnare la priorità desiderata, nonostante il fatto che il secondo record si applichi in teoria anche a ''deb-multimedia''. Si noti che stanti così le cose dovrebbe essere in realtà possibile attribuire pin superiori, fino a 499, a ''deb-multimedia'', senza che per questo i suoi candidati ottengano la precedenza su quelli del repository principale.
aptitude full-upgrade</pre>
* L'utilizzo dell'opzione <code>-t</code>/<code>--target-release</code> in questo caso è inutile, visto che si lavora per ipotesi con una sola release.


similmente con apt:
= Comandi utili =
È possibile visualizzare l'elenco delle priorità relative a tutti i repository e pacchetti dichiarati con [[apt-cache]]:
<pre>$ apt-cache policy</pre>


<pre>apt-get update
Se si volesse visualizzare solo la priorità per un singolo singolo pacchetto, ad esempio nano, si può digitare:
apt-get upgrade
<pre>$ apt-cache policy nano</pre>
apt-get dist-upgrade</pre>


=== TESTING ===
Si consiglia anche l'installazione di [[apt-show-versions]], per poter controllare velocemente da quali repository provengono i pacchetti installati sul sistema.


Se si sta utilizzando Testing e si ha l'esigenza di installare un pacchetto da Unstable o Experimental (usare con molta cautela), come visto sopra creiamo i due files '''/etc/apt/apt.conf''' e '''/etc/apt/preferences''' come segue:<br/>
E per controllare se è stata impostata una <code>Default-Release</code> basta:
<br/>
<pre>$ apt-config dump | grep -i default-release</pre>
'''/etc/apt/apt.conf'''
che visualizza la riga relativa solo se presente.
<pre>
  APT::Default-Release "testing";


  APT::Cache-Limit 24000000;
= Approfondimenti =
=== Manpages ===
<code>man apt.conf</code><br/>
<code>man apt_preferences</code>


  Apt::Get::Purge;
{{Autori
 
|Autore = [[User:Xtow|Xtow]]
  APT::Clean-Installed;
|Estesa_da =
 
: [[Utente:Wtf|Wtf]]
  APT::Get::Fix-Broken;
: [[Utente:HAL 9000|HAL 9000]]
 
|Verificata_da =
  APT::Get::Fix-Missing;
: [[Utente:Wtf|Wtf]]
 
: [[Utente:HAL 9000|HAL 9000]] 15:58, 3 ago 2019 (CEST)
  APT::Get::Show-Upgraded "true";
|Numero_revisori = 2
 
}}
  APT::Force-LoopBreak=true;
 
  APT::Get::AllowUnauthenticated 1;</pre>
 
 
 
'''/etc/apt/preferences'''
<pre>
Package: *
Pin: release a=testing
Pin-Priority: 800
 
Package: *
Pin: release a=unstable
Pin-Priority: 600
 
Package: *
Pin: release a=experimental
Pin-Priority: 50
 
Package: *
Pin: release o=Debian
Pin-Priority: -10
</pre>
 
Questo farà in modo che apt installi di default i pacchetti provenienti dalla release ''Testing''.<br/>
Se si vogliono installare pacchetti provenienti da ''Unstable'' o ''Experimental'':
 
<pre>apt-get install nome_pacchetto/unstable</pre>
 
''questo installerà il pacchetto con le dipendenze della testing''
 
<pre>apt-get install -t unstable nome_pacchetto</pre>
 
''questo installerà il pacchetto con le dipendenze della release unstable''<br />
<br/>
Per quanto riguarda il mantenimento o il downgrade di un pacchetto specifico operare come indicato sopra nella sezione STABLE.


[[Categoria:E-zine]]
[[Categoria:Apt]][[Categoria:E-zine]][[Categoria:Repository ufficiali]]
3 581

contributi

Menu di navigazione