Primeiramente, se você já atualizou os pacotes de um PPA por engano, consulte esta resposta: /ubuntu//a/142808/103117, em particular a seção sobre o uso do ppa-purge. Como eu já atualizei os pacotes e o apt-get não fará o downgrade independentemente das prioridades, é mais fácil limpar todos os pacotes atualizados primeiro, depois corrigir as prioridades, adicionar novamente o PPA e atualizar apenas os pacotes desejados.
Para uma explicação completa do sistema de prioridade / fixação, consulte man apt_preferences
.
Se um pacote estiver disponível em várias fontes, cada uma receberá uma prioridade e você poderá ver isso com apt-cache policy <package name>
. Por exemplo, eu uso um PPA chamado nathan-renniewaldock / ppa / ubuntu e não quero instalar o mysql-server-5.5 (meu "pacote Y") a partir daí. Para que eu possa verificar minha situação atual com:
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
Portanto, como tudo é prioridade 500, de acordo com a página de manual, é escolhido aquele com o número de versão mais alto.
Se, por exemplo, você deseja instalar apenas o ddclient ("pacote X"), mas não qualquer outro pacote, reduz a prioridade de todos os pacotes no PPA, exceto o ddclient. Crie um arquivo chamado /etc/apt/preferences.d/nathan-preferences
. Observe que todos os arquivos nesse diretório são lidos e existem algumas regras sobre o nome do arquivo (ele deve conter apenas caracteres alfanuméricos, hífens, traços e não deve ter extensão ou terminar em .pref).
Primeiro, precisamos saber como identificar nosso PPA. O apt-cache policy
comando por si só distribui informações sobre todas as fontes. Eu sei que meu PPA tem "nathan" no nome, então eu faço:
$ 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
A parte interessante é "o = LP-PPA-nathan-renniewaldock", que usamos no arquivo /etc/apt/preferences.d/nathan-prefs assim:
Package: *
Pin: release o=LP-PPA-nathan-renniewaldock
Pin-Priority: 400
Package: ddclient
Pin: release o=LP-PPA-nathan-renniewaldock
Pin-Priority: 500
Isso define tudo no PPA para a prioridade 400 e, em seguida, volta o ddclient para o padrão 500. Agora, posso verificar se funcionou:
$ 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
Portanto, o ddclient tem uma prioridade de 500, que é igual ao pacote original do Ubuntu, mas será instalado a partir do PPA nathan porque esse é uma versão superior. Agora, verifique se os outros pacotes não serão instalados:
$ 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
Nesse caso, o pacote do PPA nathan tem prioridade 400, que é menor que o Ubuntu, portanto, mesmo sendo de uma versão superior, não será atualizado. Podemos verificar com:
$ 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]?
Como apenas o pacote que eu quero deve ser atualizado, fico feliz em dizer que sim.