Revertendo atualização (downgrade) de pacotes no Debian/Ubuntu

Faz bastante tempo que não posto nesse blog (acho que mais de 6 meses), mas a verdade é que eu não tinha nenhum tema interessante ou dica a dar. Continuei usando Linux (no caso, Ubuntu Karmic Koala 9.10), o que me atende muito bem.
Recentemente, porém, tive um problema: devido a um problema de configuração do meu sources.list (arquivo de fontes de pacotes para Debian/Ubuntu), me vi pegando um pacote de drivers para placas de vídeo Intel GMA450 no Xorg que estava muito instável (caía o tempo todo com o KDE 4.3 e não permitia um uso adequado do sistema). Depois de instalar um outro gerenciador de janelas mais simples (optei pelo LXDE), conversei com o pessoal da sala #kubuntu do Freenode e fui aconselhado a dar um downgrade (ou seja, reverter a atualização) do pacote de drivers do X. Como não sabia o que fazer, recorri ao Guia do Mochileiro das Galáxias (também conhecido como Google), e obtive uma resposta:
Bem, a primeira coisa é saber o nome do pacote a se dar o downgrade. No meu caso era xserver-xorg-video-intel, mas utilizarei o mesmo exemplo da fonte em questão. Você irá precisar ir a um terminal e usar os comandos apt-cache (para consultar as informações sobre o pacote) e aptitude (para efetuar o downgrade).
Sabendo o nome do pacote, utilize o comando apt-cache showpkg <pacotedesejado>, que irá listar quais versões do pacote em questão estão disponíveis no repositório. É importante que você note isso, pois pode acontecer que o repositório não possua a versão que você deseja do pacote. De qualquer modo, vamos por exemplo ver uma saída para o pacote sun-java6-jdk (SDK do Java 6 que era o problema da fonte de informação):

apt-cache showpkg sun-java6-jdk

Package: sun-java6-jdk
Versions:
6-14-0ubuntu1.9.04 (/var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_jaunty-proposed_multiverse_binary-amd64_Packages) (/var/lib/dpkg/status)
Description Language:
File: /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_jaunty-proposed_multiverse_binary-amd64_Packages
MD5: cb47d4c49fa7317c472613b7010ef9d8
6-13-1 (/var/lib/apt/lists/au.archive.ubuntu.com_ubuntu_dists_jaunty_multiverse_binary-amd64_Packages)
Description Language:
File: /var/lib/apt/lists/au.archive.ubuntu.com_ubuntu_dists_jaunty_multiverse_binary-amd64_Packages
MD5: cb47d4c49fa7317c472613b7010ef9d8
Reverse Depends:
sun-java6-source,sun-java6-jdk 6-14-0ubuntu1.9.04
sun-java6-javadb,sun-java6-jdk 6-14-0ubuntu1.9.04
sun-java6-demo,sun-java6-jdk
sun-java6-demo,sun-java6-jdk 6-14-0ubuntu1.9.04
libnb-java2-java,sun-java6-jdk
libnb-java2-java,sun-java6-jdk
sun-java6-source,sun-java6-jdk 6-13-1
sun-java6-javadb,sun-java6-jdk 6-13-1
sun-java6-demo,sun-java6-jdk
sun-java6-demo,sun-java6-jdk 6-13-1
glassfishv2-bin,sun-java6-jdk
glassfishv2,sun-java6-jdk
Dependencies:
6-14-0ubuntu1.9.04 - sun-java6-bin (5 6-14-0ubuntu1.9.04) libc6 (0 (null)) libx11-6 (0 (null)) debconf (18 0.5) debconf-2.0 (0 (null)) sun-java6-demo (0 (null)) sun-java6-doc (0 (null)) sun-java6-source (0 (null))
6-13-1 - sun-java6-bin (5 6-13-1) libc6 (0 (null)) libx11-6 (0 (null)) debconf (18 0.5) debconf-2.0 (0 (null)) sun-java6-demo (0 (null)) sun-java6-doc (0 (null)) sun-java6-source (0 (null))
Provides:
6-14-0ubuntu1.9.04 - java6-sdk java5-sdk java2-sdk java2-compiler java-sdk java-compiler
6-13-1 - java6-sdk java5-sdk java2-sdk java2-compiler java-sdk java-compiler
Reverse Provides:

Perceba que tem dois números de versão destacados. O primeiro (em amarelo) representa a versão atualmente instalada, enquanto a segunda (em verde), a que desejamos instalar. Caso haja outras versões, pode obviamente ser usada quaisquer delas. A questão aqui é a seguinte: anote o nome da versão como indicada. Você precisará do valor exato para passar para o aptitude para que ele possa instalar a versão desejada. Perceba também que pode acontecer problemas com dependências (versões antigas de dependências serem exigidas, etc), portanto tenha cuidado ao realizar essa operação.
Muito bem, uma vez que você tenha obtido o número de versão desejado do pacote, é hora de mandar o aptitude instalar essa versão. Para isso, você irá usar o comando aptitude install <pacotedesejado>=<versaodesejada>. Importante: esse comando exige poder de adminstrador (root) e, portante, exige su ou sudo. Vamos então utilizar o número de versão que anotamos na saída do apt-cache como opção no comando que mostramos anteriormente.

sudo aptitude install sun-java6-jdk=6-13-1

A saída será similar à seguinte, que lembra bem a de um apt-get normal:


Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following packages are BROKEN:
sun-java6-jdk
0 packages upgraded, 0 newly installed, 1 downgraded, 0 to remove and 2 not upgraded.
Need to get 17.7MB of archives. After unpacking 1925kB will be freed.
The following packages have unmet dependencies:
sun-java6-jdk: Depends: sun-java6-bin (= 6-13-1) but 6-14-0ubuntu1.9.04 is installed.
The following actions will resolve these dependencies:
Remove the following packages:
sun-java6-fonts
sun-java6-plugin
Downgrade the following packages:
sun-java6-bin [6-14-0ubuntu1.9.04 (jaunty-proposed, now) -> 6-13-1 (jaunty)]
sun-java6-jre [6-14-0ubuntu1.9.04 (jaunty-proposed, now) -> 6-13-1 (jaunty)]
Score is 188
Accept this solution? [Y/n/q/?] Y
The following packages will be DOWNGRADED:
sun-java6-bin sun-java6-jdk sun-java6-jre
The following packages will be REMOVED:
sun-java6-fonts{a} sun-java6-plugin{a}
0 packages upgraded, 0 newly installed, 3 downgraded, 2 to remove and 2 not upgraded.
Need to get 50.7MB of archives. After unpacking 4096kB will be freed.
Do you want to continue? [Y/n/?] Y

Perceba que o aptitude irá resolver todas as dependências, inclusive revertendo pacotes que sejam dependências do pacote revertido. É um comando que demanda muito cuidado, uma vez que ele pode levar dependências que não deveriam, inclusive podendo remover pacotes que tenham sido instalados pela nova versão do pacote a ser revertido. Analise a saída e, caso tenha certeza, confirme. Pode ser que, dependendo do pacote, você precise reiniciar o X (como foi meu caso) ou mesmo o computador, mas a reversão terá sido feita.
É importante isso pois pode acontecer (como aconteceu no meu caso) de pacotes muito novos gerarem instabilidade no uso do sistema. Tome muito cuidado ao atualizar o sistema e procure pegar pacotes apenas de fontes confiáveis. Se não tiver confiança, não é recomendável, por exemplo, buscar pacotes em PPAs (PPAs são repositórios de desenvolvimento que são utilizados para pacotes muito novos), como aconteceu comigo.

Sobre Fábio Emilio Costa
Linux, Free Software, EMACS, Rugby, Indycar, Doctor Who, Harry Potter... Yep, this is me!

One Response to Revertendo atualização (downgrade) de pacotes no Debian/Ubuntu

  1. Hyju disse:

    Olá Fábio, você traduziu o livro Cultura Livre não é?já pensou em colocar no Google Books?

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s