Prima di tutto, se hai già aggiornato i pacchetti da un PPA per errore, vedi questa risposta: /ubuntu//a/142808/103117 in particolare la sezione sull'uso di ppa-purge. Dato che avevo già aggiornato i pacchetti e apt-get non eseguirà il downgrade indipendentemente dalle priorità, è più semplice eliminare prima tutti i pacchetti aggiornati, quindi correggere le priorità, quindi aggiungere nuovamente il PPA e aggiornare solo i pacchetti desiderati.
Per una spiegazione completa del sistema di priorità / pinning, vedere man apt_preferences
.
Se un pacchetto è disponibile da più fonti, a ciascuno verrà assegnata una priorità e puoi vederlo con apt-cache policy <package name>
. Ad esempio, utilizzo un PPA chiamato nathan-renniewaldock / ppa / ubuntu e da qui non voglio installare mysql-server-5.5 (il mio "pacchetto Y"). Quindi posso controllare la mia situazione attuale con:
rob@frodo:~$ apt-cache policy mysql-server-5.5
mysql-server-5.5:
Installed: 5.5.27-1~ppa1~precise
Candidate: 5.5.27-1~ppa1~precise
Version table:
*** 5.5.27-1~ppa1~precise 0
500 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages
100 /var/lib/dpkg/status
5.5.24-0ubuntu0.12.04.1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages
5.5.22-0ubuntu1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages
Quindi, poiché tutto ha priorità 500, in base alla pagina man viene scelto quello con il numero di versione più alto.
Se, ad esempio, si desidera installare solo ddclient ("pacchetto X"), ma non altri pacchetti, si desidera ridurre la priorità per tutti i pacchetti nel PPA ad eccezione di ddclient. Crea un file chiamato /etc/apt/preferences.d/nathan-preferences
. Si noti che tutti i file in quella directory vengono letti e ci sono alcune regole sul nome del file (deve contenere solo caratteri alfanumerici, valori, trattini e non avere estensione o terminare con .pref).
Innanzitutto dobbiamo sapere come identificare il nostro PPA. Il apt-cache policy
comando da solo invia informazioni su tutte le fonti. So che il mio PPA ha "nathan" nel nome, quindi faccio:
$ apt-cache policy | grep nathan
400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main i386 Packages
release v=12.04,o=LP-PPA-nathan-renniewaldock,a=precise,n=precise,l=PPA,c=main
La parte interessante è "o = LP-PPA-nathan-renniewaldock", che usiamo nel file /etc/apt/preferences.d/nathan-prefs in questo modo:
Package: *
Pin: release o=LP-PPA-nathan-renniewaldock
Pin-Priority: 400
Package: ddclient
Pin: release o=LP-PPA-nathan-renniewaldock
Pin-Priority: 500
Questo imposta tutto nel PPA sulla priorità 400, quindi riporta ddclient al valore predefinito 500. Ora, posso verificare che abbia funzionato:
$ apt-cache policy ddclient
ddclient:
Installed: 3.8.0-11.4ubuntu1
Candidate: 3.8.1-0~ppa1~precise
Package pin: 3.8.1-0~ppa1~precise
Version table:
3.8.1-0~ppa1~precise 500
400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages
*** 3.8.0-11.4ubuntu1 500
500 http://gb.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages
100 /var/lib/dpkg/status
Quindi ddclient ha una priorità di 500, che è la stessa del pacchetto Ubuntu originale, ma verrà installata dal nathan PPA perché quella è una versione superiore. Ora assicuriamoci che gli altri pacchetti non siano installati:
$ apt-cache policy mysql-server
mysql-server:
Installed: 5.5.24-0ubuntu0.12.04.1
Candidate: 5.5.24-0ubuntu0.12.04.1
Version table:
5.5.27-1~ppa1~precise 0
400 http://ppa.launchpad.net/nathan-renniewaldock/ppa/ubuntu/ precise/main amd64 Packages
*** 5.5.24-0ubuntu0.12.04.1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages
100 /var/lib/dpkg/status
5.5.22-0ubuntu1 0
500 http://gb.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages
In questo caso il pacchetto del nathan PPA ha la priorità 400 che è inferiore a quella di Ubuntu, quindi anche se è di una versione superiore non verrà aggiornato. Possiamo verificare con:
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
ddclient
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 77.7 kB of archives.
After this operation, 11.3 kB of additional disk space will be used.
Do you want to continue [Y/n]?
Dal momento che solo il pacchetto che voglio deve essere aggiornato, sono felice di dire di sì.