[Tutorial] Editar / alterar as dependências de um pacote .deb - GNU/Linux, BSD, Unix-like e software livre - Clube do Hardware
Recentemente aconteceu de eu tentar instalar o pacote google-chrome-stable e não conseguir porque, de acordo com o que consta no pacote .deb, o pacote precisa de três bibliotecas e essas bibliotecas não podem ser instaladas em meu sistema.
O problema é que isso é um bug do pacote .deb: as bibliotecas que ele diz que eu tenho que ter não têm que ser instaladas em meu sistema não, mas elas também não devem fazer parte dos pré-requisitos (dependências) do pacote .deb, pois as bibliotecas das quais o pacote necessita são outras três, não as que ele menciona. O erro, portanto, está nos nomes das bibliotecas das quais o pacote diz necessitar.
Como um dia esse bug pode acontecer com (e afetar) você, fique sabendo que pode ter conserto: se você souber quais são os nomes corretos dos arquivos/dependências que você tem que ter no seu sistema, e se tais dependências estiverem instaladas no seu sistema (ou você souber como instalá-las), então tudo o que você precisa fazer, depois de estar com as dependências corretas instaladas em seu sistema, é editar o arquivo de controle de dependências que se encontra dentro do pacote .deb problemático.
Mas como fazer para editar o arquivo de controle de dependências? Simples: siga o roteiro abaixo.
Abra um editor de texto bem básico, como por exemplo o GEdit, o Mousepad ou o Leafpad, e cole este código dentro da janela dele:
#!/bin/bashif [[ -z "$1" ]]; thenecho "Syntax: $0 debfile"exit 1fiDEBFILE="$1"TMPDIR=`mktemp -d /tmp/deb.XXXXXXXXXX` || exit 1OUTPUT=`basename "$DEBFILE" .deb`.editado.debif [[ -e "$OUTPUT" ]]; thenecho "$OUTPUT existe."rm -r "$TMPDIR"exit 1fidpkg-deb -x "$DEBFILE" "$TMPDIR"dpkg-deb --control "$DEBFILE" "$TMPDIR"/DEBIANif [[ ! -e "$TMPDIR"/DEBIAN/control ]]; thenecho DEBIAN/control non ecsiste! =Prm -r "$TMPDIR"exit 1fiCONTROL="$TMPDIR"/DEBIAN/controlMOD=`stat -c "%y" "$CONTROL"`gedit "$CONTROL"if [[ "$MOD" == `stat -c "%y" "$CONTROL"` ]]; thenecho Inalterado.elseecho Construindo novo pacote deb...dpkg -b "$TMPDIR" "$OUTPUT"firm -r "$TMPDIR"
A palavra gedit que aparece no código do script pode ser modificada. Aquela linha de comando será usada para fazer o aplicativo GEdit abrir para edição o arquivo de controle de versões/dependências que se encontra dentro do pacote .deb.
Se você não possui o GEdit instalado em seu sistema, instale-o executando este comando, no terminal:
Alternativamente, você pode substituir a palavra gedit pelo nome do seu editor de textos padrão ou preferido. Exemplo: se você possui o Mousepad instalado no seu sistema (é o que eu uso, por exemplo), coloque a palavra mousepad no lugar da palavra gedit. Neste caso, o código do script ficará assim:
mousepad "$CONTROL"
Se o seu editor for o Leafpad, então o código do script ficará assim:
leafpad "$CONTROL"
Quer saber se você tem o GEdit instalado? Abra o terminal e execute este comando:
Se o GEdit estiver instalado, uma janela dele surgirá na sua frente.
O mesmo método funciona também com o Mousepad e com o Leafpad:
Agora salve o arquivo onde você quiser e com o nome que você quiser. Ah: e não é preciso adicionar extensão nenhuma ao arquivo.
Só para eu ter uma referência neste tutorial, vou supor que você salvou o arquivo com o nome edd (a palavra vem de editor de dependências) e que esse arquivo foi gravado dentro de ~/Downloads
Nota: o símbolo ~ é um atalho que sempre aponta para a pasta pessoal do usuário que está logado no sistema. Se, por exemplo, a sua pasta pessoal for /home/fulano, então ~ é a mesma coisa que /home/fulano. Supondo que dentro da sua pasta pessoal exista uma pasta Downloads, o caminho ~/Downloads significa que você salvou o arquivo edd dentro da pasta Downloads que existe dentro da sua pasta pessoal.
Outro exemplo: se a sua conta é cicrano e o seu sistema GNU/Linux cria as contas dos usuários dentro da pasta /home, então ~ é a mesma coisa que /home/cicrano e ~/Downloads é a mesma coisa que /home/cicrano/Downloads, entendeu?
Agora que você criou o arquivo edd e o salvou dentro de ~/Downloads, é necessário tornar o arquivo executável, para que o seu sistema compreenda que ele é um script.
Vamos lá. Abra o terminal do shell e execute este comando, para tornar o seu arquivo executável:
sudo chmod +x ~/Downloads/edd
...lembrando que se você não salvou o arquivo com o nome edd e/ou não o gravou dentro de ~/Downloads, então você precisa colocar os valores corretos no comando acima e em todos os outros comandos que eu vier a apresentar neste tutorial contendo referências ao edd e/ou ao caminho ~/Downloads. Fique esperto/a!
Agora que o script é executável, faça download do pacote .deb que você deseja corrigir.
Apenas para eu ter uma referência neste tutorial, vou supor que você está querendo corrigir o bug que aconteceu no pacote do Google Chrome. Mas lembre-se: o script serve para corrigir qualquer pacote .deb que internamente possua um arquivo de controle de dependências.
Bem, supondo que você esteja querendo corrigir o bug do pacote do Google Chrome (que é para sistemas de 32 bits), você certamente acessou o website oficial do Google Chrome e fez download do pacote google-chrome-stable_current_i386.deb. Eu vou assumir que você salvou esse pacote .deb dentro de ~/Downloads, ok?
Bem, continuando: se você havia tentado instalar esse pacote e acabou quebrando a instalação dele (o aplicativo não funciona mais), execute os comandos abaixo para desinstalar o aplicativo e limpar o repositório do APT. Mas lembre-se de executar todos os comandos na exata sequência em que aparecem, de cima para baixo e dentro de uma única janela do terminal:
Notas: se após a execução do autoremove o sistema perguntar se você deseja desinstalar alguma coisa, confirme. E, claro: se o pacote que você está manipulando não é o do Google Chrome, então substitua aquele google-chrome-stable pelo nome correto do pacote.
Não sabe qual é o nome correto do pacote .deb? Neste caso, recomendo instalar o aplicativo Synaptic. Ele facilita bastante a pesquisa de nomes de pacotes .deb no seu repositório. Este é o comando para instalar o Synaptic:
Depois basta executar o Synaptic a partir do menu do seu GNU/Linux. Caso não encontre o Synaptic pelo menu da interface gráfica, abra uma nova janela do terminal e execute este comando:
Agora que o seu repositório local de pacotes está limpo (você já fechou o Synaptic e a janela do terminal), você precisa executar o seu script. Abra uma nova janela do terminal e execute estes comandos:
./edd ./google-chrome-stable_current_i386.deb
Novamente: estou supondo que você salvou o script com o nome edd, dentro de ~/Downloads, e que você fez download do pacote google-chrome-stable_current_i386.deb também para dentro de ~/Downloads, portanto, neste exemplo fictício, tanto o script quanto o pacote .deb estão dentro de ~/Downloads
O script vai extrair o conteúdo do pacote .deb e usar o seu editor de textos (aquele que você definiu no item 2) para carregar na sua frente uma janela contendo o código do arquivo de controle de dependências. Esse arquivo de controle nada mais é que um arquivo texto, portanto ele pode ser editado e salvo.
Tudo o que você precisa fazer é corrigir os nomes e/ou as versões dos arquivos que são mencionados dentro do arquivo de controle, clicar no botão "Salvar" e então fechar a janela do editor de textos. Moleza, né?
Assim que a janela do editor de textos for fechada, o script vai retomar a execução dele e começar a construir um novo pacote .deb, só que usando o arquivo de controle que foi modificado por você.
O novo pacote será criado dentro do mesmo local em que o script foi executado. O nome desse novo pacote terminará com .editado.deb, para que você consiga distinguir o pacote original e o que foi editado por você.
Vamos supor que o novo pacote se chame google-chrome-stable_current_i386.editado.deb e que ele foi criado dentro de ~/Downloads. Neste caso, volte ao terminal e execute os seguintes comandos, para instalá-lo:
sudo dpkg -i google-chrome-stable_current_i386.editado.deb
Pronto! O novo pacote .deb foi criado e instalado!
i) No caso do Google Chrome, pode acontecer de ele não executar porque a sandbox dele não foi corretamente configurada. Se isso ocorrer com você, execute estes comandos, no terminal:
Após executar esses dois comandos, tente novamente executar o Google Chrome, porque agora vai funcionar.
ii) Se você usar este tutorial com outro pacote .deb e ocorrer algum problema com a execução do aplicativo instalado a partir de um pacote editado, experimente desinstalar o pacote com estes comandos:
Em seguida, delete o pacote editado (final .editado.deb) e substitua os comandos do item 7 por estes:
sudo ./edd ./nome_do_pacote.editado.deb
O uso do sudo fará o script ser executado com perfil de superusuário, o que pode (ou não...) resolver alguns problemas de reconstrução do pacote.
Se o novo pacote continuar dando problema, pode ser que você tenha feito alguma edição indevida no arquivo de controle de dependências, ou ainda que o pacote não possa ser corrigido apenas com uma modificação nas dependências dele. Neste caso, o problema pode ser mais complexo e por isto não será possível sanar o problema somente com o script deste tutorial. Neste caso, que tal colocar o seu gorrinho geek, desvendar o mistério e criar o seu próprio tutorial?
PS: o código-fonte do script deste tutorial foi obtido aqui e adaptado.
Legal! Parabéns por dar os créditos ao autor original e por compartilhar conosco!
Gostaria de deixar uma dica caso precise somente forçar a instalação do pacote deb, sem modificar as dependências que é com a opção --force-depends do dpkg. Outras opções do gênero podem ser vistas com --force-help.
Obrigado, Fernando, pelo elogio.
E valeu pela dica. Realmente, se a pessoa já dispuser das dependências corretas instaladas no sistema (apenas o arquivo de controle de dependências do pacote estiver errado), usar o dpkg com a opção --force-depends é uma solução bem prática.