Solucionando problemas com o apt e usando o dpkg

O dpkg complementa o apt-get/aptitude, permitindo instalar pacotes .deb baixados manualmente, o que é comum ao instalar programas proprietários ou aplicativos recentes, que ainda não foram incluídos nos repositórios oficiais. Na verdade, o dpkg é quem faz o trabalho pesado ao instalar ou remover qualquer pacote, já que ele é invocado pelo apt em cada operação. Entretanto, ao utilizá-lo manualmente você deixa de contar com todas as funções de cálculo de dependências e resolução de problemas empregadas pelo apt. É justamente por isso que deixamos apa utilizá-lo apenas em situações específicas.

Para instalar um único pacote, você usa o comando “dpkg -i“, seguido pelo nome do pacote. Para instalar de uma vez vários pacote, use o “dpkg -i *.deb” dentro da pasta com os arquivos.

O problema do dpkg é que ele apenas instala o pacote solicitado, sem instalar junto as dependências necessárias. Isso muitas vezes causa problemas relacionados às dependências, geralmente fáceis de contornar. Veja um exemplo:

$ sudo dpkg -i skype-debian_2.0.0.72-1_i386.deb

Selecionando pacote previamente não selecionado skype.
(Lendo banco de dados … 126618 arquivos e diretórios atualmente instalados).
Desempacotando skype (de skype-debian_2.0.0.72-1_i386.deb) …
dpkg: problemas de dependência impedem a configuração de skype:
skype depende de libqt4-gui (>= 4.2.1); porém:
Pacote libqt4-gui não está instalado.
dpkg: erro processando skype (–install):
problemas de dependência – deixando desconfigurado
Erros foram encontrados durante o processamento de:
skype

Como você pode ver, o pacote skype precisa do pacote “libqt4-gui”, uma biblioteca que está disponível via apt-get, mas que não está instalada. Para solucionar este tipo de problema, rode o comando “apt-get -f install” para que o apt-get possa verificar o que foi feito e corrigir qualquer problema que tenha aparecido durante a instalação. Em casos de pacotes quebrados ou conflitos, o apt-get sempre vai sugerir alguma solução, mesmo que ela seja simplesmente remover o novo pacote.

No exemplo, ao rodar o “apt-get -f install”, a biblioteca é instalada automaticamente e o problema resolvido:

# apt-get -f install

Lendo listas de pacotes… Pronto
Construindo árvore de dependências
Lendo informação de estado… Pronto
Corrigindo dependências… Pronto
Os pacotes extra a seguir serão instalados:
libqt4-gui
Os NOVOS pacotes a seguir serão instalados:
libqt4-gui
0 pacotes atualizados, 1 pacotes novos instalados, 0 a serem removidos e 88 não atualizados.
1 pacotes não totalmente instalados ou removidos.
É preciso baixar 7552B de arquivos.
Depois desta operação, 77,8kB adicionais de espaço em disco serão usados.
Você quer continuar [S/n]?

Note que em muitos casos, as dependências podem ser supridas por outros pacotes relacionados. Por exemplo, o pacote “nxserver”, que contém o servidor NX, precisa do pacote “nxnode” e “nxclient, que também estão disponíveis no site do desenvolvedor (www.nomachine.com). Para instalar o nxserver, você precisaria instalar os três pacotes usando o dpkg e só depois rodar o “apt-get -f install”, para que o apt-get cuidasse das dependências externas.

Em casos onde o “apt-get -f install” não consiga resolver o problema, experimente o “apt-get -f remove”:

$ sudo apt-get -f remove

Ele tem uma função similar, mas dá preferência a remover os pacotes com problemas, ao invés de tentar corrigir a instalação, resolvendo o problema em casos em que o pacote instalado manualmente depende de outras que não estão disponíveis via apt.

Outro comando que pode ser útil em algumas situações é o “dpkg –configure -a”. Ele verifica pendências na configuração dos pacotes, concluindo a instalação em casos onde a instalação foi abortada no meio, como, por exemplo, em casos de falta de energia:

$ sudo dpkg –configure -a

Além de instalar programas manualmente, o dpkg também permite removê-los, usando o parâmetro “-r”, como em “dpkg -r skype”. Em situações normais, seria melhor simplesmente usar o apt-get ou o aptitude, mas em algumas situações específicas o “dpkg -r” pode salvar o dia, como em casos em que pacotes extra-oficiais problemáticos, que tentam subscrever arquivos que fazem parte de outros pacotes.

Este tipo de problema normalmente acontece apenas o utilizar repositórios não-oficiais, ou ao utilizar versões de desenvolvimento, mas, de qualquer maneira é importante saber lidar com eles. Aqui temos um exemplo, causado por um pacote do Acrobat Reader disponibilizado através do Medibuntu no Ubuntu 8.10:

(Lendo banco de dados … 147830 arquivos e diretórios atualmente instalados).
Desempacotando acroread-debian-files (de …/acroread-debian-files_0.0.24medibuntu1.1_i386.deb) …

dpkg: erro processando /var/cache/apt/archives/acroread-debian-files_0.0.24medibuntu1.1_i386.deb (–unpack):
tentando sobrescrever ‘/usr/bin/acroread’, que também está no pacote adobereader-ptb
Erros foram encontrados durante o processamento de:
/var/cache/apt/archives/acroread-debian-files_0.0.24medibuntu1.1_i386.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Como pode ver, o pacote tenta subscrever o arquivo “/usr/bin/acroread”, que por erro de empacotamento está incluído também no pacote “adobereader-ptb”, disponível no mesmo repositório. Nesse caso, o apt fica travado, repetindo a mensagem a cada instalação, impedindo que você faça qualquer coisa até solucionar o problema. A solução nesse caso é remover manualmente o pacote anterior, usando o dpkg, e em seguida deixar que o “apt-get -f install” coloque ordem na casa:

$ sudo dpkg -r adobereader-ptb
$ sudo apt-get -f install

Se você receber erros de dependências, mas mesmo assim quiser forçar a instalação do pacote (o que nunca é não é uma boa idéia em sistemas baseados no Debian), pode usar o comando “dpkg -i –force-all pacote.deb”. Neste caso, tome cuidado com versões antigas ou conflitantes, pois este último comando não checa dependências nem conflitos, apenas instala tudo de uma vez, na marra, o que pode causar os mais diversos problemas.

O dpkg pode ser usado também para “desmontar” pacotes, permitindo que você examine os componentes ou simplesmente use algum arquivo de configuração ou outro componente específico sem precisar instalar todo o pacote. Para isso, crie uma pasta temporária e use o comando “dpkg -x”, especificando o pacote e em seguida a pasta onde ele será extraído, como em:

$ dpkg -x amora-server_1.1-1_i386.deb amora

Outro comando útil é o “apt-get install –reinstall”, que permite forçar a reinstalação de um pacote (mesmo que ele já esteja atualizado), o que permite resolver casos de arquivos corrompidos devido a desligamentos incorretos ou problemas diversos. Basta descobrir de qual pacote o arquivo corrompido faz parte e em seguida reinstalá-lo, como em:

$ sudo apt-get install –reinstall evolution-common

Concluindo, o dpkg pode ser usado também para salvar uma lista de todos os pacotes instalados no seu PC e instalá-los todos de uma vez em outro PC com apenas três comandos. Esta dica é muito útil ao reinstalar o sistema, já que permite “clonar” sua instalação atual, fazendo com que a nova instalação contenha todos os softwares que você usa, sem precisar instalar pacote por pacote. Se você preservar os arquivos do seu diretório home, terá uma instalação do sistema virtualmente idêntica à atual.

O primeiro passo é salvar a lista dos pacotes atualmente instalados usando o “dpkg –get-selections”. Originalmente ele simplesmente escreveria a lista na tela, mas a seta faz com que ela seja salva no arquivo indicado:

$ sudo dpkg –get-selections > meubuntu

Na hora de restaurar a instalação, use o “dpkg –get-selections” no diretório onde salvou o arquivo, invertendo a seta para que ele leia a lista a partir do arquivo:

$ sudo dpkg –set-selections < meubuntu

O passo final é usar o “apt-get dselect-upgrade ” para instalar os pacotes selecionados, restaurando a instalação:

$ sudo apt-get dselect-upgrade

Ver Mais

Esta postagem foi modificada pela última vez em 23/03/2011 14:17

Postagem relacionada