Ir ao conteúdo
  • Cadastre-se
Sampayu

[Tutorial] Editar / alterar as dependências de um pacote .deb

Recommended Posts

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:
    sudo apt-get install gedit
    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:
    gedit &
    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:

    mousepad &
    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:
    sudo apt-get remove google-chrome-stable
    sudo apt-get clean
    sudo apt-get autoremove
    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:
    sudo apt-get install 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:
    sudo synaptic
  • 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:
    cd ~/Downloads
    ./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é? :lol:
  • 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:
    cd ~/Downloads
    sudo dpkg -i google-chrome-stable_current_i386.editado.deb
  • Pronto! O novo pacote .deb foi criado e instalado! :-BEER

    Notas:
    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:
    sudo chown root /opt/google/chrome/chrome-sandbox
    sudo chmod 4755 /opt/google/chrome/chrome-sandbox
    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:
    sudo dpkg -r nome_do_pacote
    sudo apt-get clean
    apt-get purge
    apt-get autoremove
    Em seguida, delete o pacote editado (final .editado.deb) e substitua os comandos do item 7 por estes:
    cd ~/Downloads
    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? :joia:

É isso. :bandeira:

PS: o código-fonte do script deste tutorial foi obtido aqui e adaptado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

Abraço!

 

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.  ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×